From 6797ac14741851efa5ba60a00891e18cf7755c80 Mon Sep 17 00:00:00 2001
From: teravus
Date: Sat, 29 Dec 2012 08:53:58 -0500
Subject: * This finishes the implementation of AgentCachedTexture. Requires
the XBakes Module and service for full functionality. Previous no-cache
functionality works without the service and module. In some ways, I would
have been happier not putting an AssetBase in WearableCacheItem.. but
turns out it was probably unavoidable. No additional locks, yay.
---
.../Linden/Caps/UploadBakedTextureModule.cs | 140 ++++++++++++++++++++-
.../Region/ClientStack/Linden/UDP/LLClientView.cs | 110 +++++++++++++---
.../Avatar/AvatarFactory/AvatarFactoryModule.cs | 7 +-
.../Framework/Interfaces/IBakedTextureModule.cs | 4 +-
4 files changed, 233 insertions(+), 28 deletions(-)
(limited to 'OpenSim/Region')
diff --git a/OpenSim/Region/ClientStack/Linden/Caps/UploadBakedTextureModule.cs b/OpenSim/Region/ClientStack/Linden/Caps/UploadBakedTextureModule.cs
index 3b0ccd7..6778ba5 100644
--- a/OpenSim/Region/ClientStack/Linden/Caps/UploadBakedTextureModule.cs
+++ b/OpenSim/Region/ClientStack/Linden/Caps/UploadBakedTextureModule.cs
@@ -27,6 +27,7 @@
using System;
using System.Collections;
+using System.Collections.Generic;
using System.Collections.Specialized;
using System.Drawing;
using System.Drawing.Imaging;
@@ -53,8 +54,8 @@ namespace OpenSim.Region.ClientStack.Linden
[Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "UploadBakedTextureModule")]
public class UploadBakedTextureModule : INonSharedRegionModule
{
-// private static readonly ILog m_log =
-// LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
+ private static readonly ILog m_log =
+ LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
///
/// For historical reasons this is fixed, but there
@@ -64,31 +65,154 @@ namespace OpenSim.Region.ClientStack.Linden
private Scene m_scene;
private bool m_persistBakedTextures;
+ private IBakedTextureModule m_BakedTextureModule;
+
public void Initialise(IConfigSource source)
{
IConfig appearanceConfig = source.Configs["Appearance"];
if (appearanceConfig != null)
m_persistBakedTextures = appearanceConfig.GetBoolean("PersistBakedTextures", m_persistBakedTextures);
+
+
}
public void AddRegion(Scene s)
{
m_scene = s;
+
}
public void RemoveRegion(Scene s)
{
+ s.EventManager.OnRegisterCaps -= RegisterCaps;
+ s.EventManager.OnNewPresence -= RegisterNewPresence;
+ s.EventManager.OnRemovePresence -= DeRegisterPresence;
+ m_BakedTextureModule = null;
+ m_scene = null;
}
+
+
public void RegionLoaded(Scene s)
{
m_scene.EventManager.OnRegisterCaps += RegisterCaps;
+ m_scene.EventManager.OnNewPresence += RegisterNewPresence;
+ m_scene.EventManager.OnRemovePresence += DeRegisterPresence;
+
+ }
+
+ private void DeRegisterPresence(UUID agentId)
+ {
+ ScenePresence presence = null;
+ if (m_scene.TryGetScenePresence(agentId, out presence))
+ {
+ presence.ControllingClient.OnSetAppearance -= CaptureAppearanceSettings;
+ }
+
+ }
+
+ private void RegisterNewPresence(ScenePresence presence)
+ {
+ presence.ControllingClient.OnSetAppearance += CaptureAppearanceSettings;
+
+ }
+
+ private void CaptureAppearanceSettings(IClientAPI remoteClient, Primitive.TextureEntry textureEntry, byte[] visualParams, Vector3 avSize, WearableCacheItem[] cacheItems)
+ {
+ m_BakedTextureModule = m_scene.RequestModuleInterface();
+ if (cacheItems.Length > 0)
+ {
+ m_log.Info("[Cacheitems]: " + cacheItems.Length);
+ for (int iter = 0; iter < cacheItems.Length; iter++)
+ {
+ m_log.Info("[Cacheitems] {" + iter + "/" + cacheItems[iter].TextureIndex + "}: c-" + cacheItems[iter].CacheId + ", t-" +
+ cacheItems[iter].TextureID);
+ }
+
+ ScenePresence p = null;
+ if (m_scene.TryGetScenePresence(remoteClient.AgentId, out p))
+ {
+
+ WearableCacheItem[] existingitems = p.Appearance.WearableCacheItems;
+ if (existingitems == null)
+ {
+ if (m_BakedTextureModule != null)
+ {
+ WearableCacheItem[] savedcache = null;
+ try
+ {
+ if (p.Appearance.WearableCacheItemsDirty)
+ {
+ savedcache = m_BakedTextureModule.Get(p.UUID);
+ p.Appearance.WearableCacheItems = savedcache;
+ p.Appearance.WearableCacheItemsDirty = false;
+ }
+
+ }
+ catch (InvalidOperationException)
+ {
+ }
+
+ if (savedcache != null)
+ existingitems = savedcache;
+ }
+ }
+ // Existing items null means it's a fully new appearance
+ if (existingitems == null)
+ {
+
+ for (int iter = 0; iter < cacheItems.Length; iter++)
+ {
+
+ cacheItems[iter].TextureID = textureEntry.FaceTextures[cacheItems[iter].TextureIndex].TextureID;
+ if (m_scene.AssetService != null)
+ cacheItems[iter].TextureAsset = m_scene.AssetService.GetCached(cacheItems[iter].TextureID.ToString());
+
+
+ }
+ }
+ else
+
+
+ {
+ // for each uploaded baked texture
+ for (int i = 0; i < cacheItems.Length; i++)
+ {
+ cacheItems[i].TextureID =
+ textureEntry.FaceTextures[cacheItems[i].TextureIndex].TextureID;
+ }
+
+ for (int i = 0; i < cacheItems.Length; i++)
+ {
+ if (cacheItems[i].TextureAsset == null)
+ {
+ cacheItems[i].TextureAsset = m_scene.AssetService.GetCached(cacheItems[i].TextureID.ToString());
+ }
+ }
+ }
+
+
+
+ p.Appearance.WearableCacheItems = cacheItems;
+
+
+
+ if (m_BakedTextureModule != null)
+ {
+ m_BakedTextureModule.Store(remoteClient.AgentId, cacheItems);
+ p.Appearance.WearableCacheItemsDirty = true;
+
+ }
+ }
+ }
}
public void PostInitialise()
{
}
+
+
public void Close() { }
public string Name { get { return "UploadBakedTextureModule"; } }
@@ -100,15 +224,23 @@ namespace OpenSim.Region.ClientStack.Linden
public void RegisterCaps(UUID agentID, Caps caps)
{
+ UploadBakedTextureHandler avatarhandler = new UploadBakedTextureHandler(
+ caps, m_scene.AssetService, m_persistBakedTextures);
+
+
+
caps.RegisterHandler(
"UploadBakedTexture",
new RestStreamHandler(
"POST",
"/CAPS/" + caps.CapsObjectPath + m_uploadBakedTexturePath,
- new UploadBakedTextureHandler(
- caps, m_scene.AssetService, m_persistBakedTextures).UploadBakedTexture,
+ avatarhandler.UploadBakedTexture,
"UploadBakedTexture",
agentID.ToString()));
+
+
+
+
}
}
}
\ No newline at end of file
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
index d18b026..9e39699 100644
--- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
+++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
@@ -3629,7 +3629,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
avp.Sender.IsTrial = false;
avp.Sender.ID = agentID;
- //m_log.DebugFormat("[CLIENT]: Sending appearance for {0} to {1}", agentID.ToString(), AgentId.ToString());
+ m_log.DebugFormat("[CLIENT]: Sending appearance for {0} to {1}", agentID.ToString(), AgentId.ToString());
OutPacket(avp, ThrottleOutPacketType.State);
}
@@ -11725,32 +11725,110 @@ namespace OpenSim.Region.ClientStack.LindenUDP
// var item = fac.GetBakedTextureFaces(AgentId);
//WearableCacheItem[] items = fac.GetCachedItems(AgentId);
- IImprovedAssetCache cache = m_scene.RequestModuleInterface();
- if (cache == null)
+ IAssetService cache = m_scene.AssetService;
+ IBakedTextureModule bakedTextureModule = m_scene.RequestModuleInterface();
+ if (bakedTextureModule != null && cache != null)
{
- for (int i = 0; i < cachedtex.WearableData.Length; i++)
+ // We need to make sure the asset stored in the bake is available on this server also by it's assetid before we map it to a Cacheid
+
+ WearableCacheItem[] cacheItems = null;
+ ScenePresence p = m_scene.GetScenePresence(AgentId);
+ if (p.Appearance != null)
+ if (p.Appearance.WearableCacheItems == null || p.Appearance.WearableCacheItemsDirty)
+ {
+ try
+ {
+ cacheItems = bakedTextureModule.Get(AgentId);
+ p.Appearance.WearableCacheItems = cacheItems;
+ p.Appearance.WearableCacheItemsDirty = false;
+ }
+ catch (InvalidOperationException)
+ {
+ cacheItems = null;
+ }
+ }
+ else if (p.Appearance.WearableCacheItems != null)
+ {
+ cacheItems = p.Appearance.WearableCacheItems;
+ }
+
+ if (cache != null && cacheItems != null)
+ {
+ foreach (WearableCacheItem item in cacheItems)
+ {
+
+ if (cache.GetCached(item.TextureID.ToString()) == null)
+ {
+ item.TextureAsset.Temporary = true;
+ cache.Store(item.TextureAsset);
+ }
+
+
+ }
+ }
+ if (cacheItems != null)
+ {
+
+ for (int i = 0; i < cachedtex.WearableData.Length; i++)
+ {
+ WearableCacheItem item =
+ WearableCacheItem.SearchTextureIndex(cachedtex.WearableData[i].TextureIndex,cacheItems);
+
+ cachedresp.WearableData[i] = new AgentCachedTextureResponsePacket.WearableDataBlock();
+ cachedresp.WearableData[i].TextureIndex= cachedtex.WearableData[i].TextureIndex;
+ cachedresp.WearableData[i].HostName = new byte[0];
+ if (item != null)
+ {
+ cachedresp.WearableData[i].TextureID = item.TextureID;
+ }
+ else
+ {
+ cachedresp.WearableData[i].TextureID = UUID.Zero;
+ }
+ }
+ }
+ else
{
- cachedresp.WearableData[i] = new AgentCachedTextureResponsePacket.WearableDataBlock();
- cachedresp.WearableData[i].TextureIndex = cachedtex.WearableData[i].TextureIndex;
- cachedresp.WearableData[i].TextureID = UUID.Zero; //UUID.Parse("8334fb6e-c2f5-46ee-807d-a435f61a8d46");
- cachedresp.WearableData[i].HostName = new byte[0];
+ for (int i = 0; i < cachedtex.WearableData.Length; i++)
+ {
+ cachedresp.WearableData[i] = new AgentCachedTextureResponsePacket.WearableDataBlock();
+ cachedresp.WearableData[i].TextureIndex = cachedtex.WearableData[i].TextureIndex;
+ cachedresp.WearableData[i].TextureID = UUID.Zero;
+ //UUID.Parse("8334fb6e-c2f5-46ee-807d-a435f61a8d46");
+ cachedresp.WearableData[i].HostName = new byte[0];
+ }
}
}
else
{
- for (int i = 0; i < cachedtex.WearableData.Length; i++)
+ if (cache == null)
+ {
+ for (int i = 0; i < cachedtex.WearableData.Length; i++)
+ {
+ cachedresp.WearableData[i] = new AgentCachedTextureResponsePacket.WearableDataBlock();
+ cachedresp.WearableData[i].TextureIndex = cachedtex.WearableData[i].TextureIndex;
+ cachedresp.WearableData[i].TextureID = UUID.Zero;
+ //UUID.Parse("8334fb6e-c2f5-46ee-807d-a435f61a8d46");
+ cachedresp.WearableData[i].HostName = new byte[0];
+ }
+ }
+ else
{
- cachedresp.WearableData[i] = new AgentCachedTextureResponsePacket.WearableDataBlock();
- cachedresp.WearableData[i].TextureIndex = cachedtex.WearableData[i].TextureIndex;
+ for (int i = 0; i < cachedtex.WearableData.Length; i++)
+ {
+ cachedresp.WearableData[i] = new AgentCachedTextureResponsePacket.WearableDataBlock();
+ cachedresp.WearableData[i].TextureIndex = cachedtex.WearableData[i].TextureIndex;
- if (cache.Check(cachedtex.WearableData[i].ID.ToString()))
- cachedresp.WearableData[i].TextureID = UUID.Zero;
+ if (cache.GetCached(cachedresp.WearableData[i].TextureID.ToString()) == null)
+ cachedresp.WearableData[i].TextureID = UUID.Zero;
//UUID.Parse("8334fb6e-c2f5-46ee-807d-a435f61a8d46");
- else
- cachedresp.WearableData[i].TextureID = UUID.Zero; // UUID.Parse("8334fb6e-c2f5-46ee-807d-a435f61a8d46");
- cachedresp.WearableData[i].HostName = new byte[0];
+ else
+ cachedresp.WearableData[i].TextureID = UUID.Zero;
+ // UUID.Parse("8334fb6e-c2f5-46ee-807d-a435f61a8d46");
+ cachedresp.WearableData[i].HostName = new byte[0];
+ }
}
}
cachedresp.Header.Zerocoded = true;
diff --git a/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs b/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs
index 3080023..27cf204 100644
--- a/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs
@@ -205,10 +205,7 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
// ((ScenePresence)sp).SetSize(box,off);
}
- //if (cacheItems.Length > 0)
- //{
- sp.Appearance.WearableCacheItems = cacheItems;
- //}
+
// Process the baked texture array
if (textureEntry != null)
{
@@ -284,8 +281,6 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
public WearableCacheItem[] GetCachedItems(UUID agentId)
{
ScenePresence sp = m_scene.GetScenePresence(agentId);
- Dictionary bakedTextures = GetBakedTextureFaces(sp);
-
WearableCacheItem[] items = sp.Appearance.WearableCacheItems;
//foreach (WearableCacheItem item in items)
//{
diff --git a/OpenSim/Region/Framework/Interfaces/IBakedTextureModule.cs b/OpenSim/Region/Framework/Interfaces/IBakedTextureModule.cs
index d63898a..21ed44f 100644
--- a/OpenSim/Region/Framework/Interfaces/IBakedTextureModule.cs
+++ b/OpenSim/Region/Framework/Interfaces/IBakedTextureModule.cs
@@ -13,7 +13,7 @@ namespace OpenSim.Services.Interfaces
{
public interface IBakedTextureModule
{
- AssetBase[] Get(UUID id);
- void Store(UUID id, AssetBase[] data);
+ WearableCacheItem[] Get(UUID id);
+ void Store(UUID id, WearableCacheItem[] data);
}
}
--
cgit v1.1
From 2805ec64662494d680925c6034e59b823e051a9d Mon Sep 17 00:00:00 2001
From: teravus
Date: Mon, 31 Dec 2012 23:04:28 -0500
Subject: * Fixed a bug that replayed old cached appearance when changing
outfits * Added suser(bad client) DOS protection by limiting the max
cacheitems to the maximum sane amount. * Prevents potential numerous loops
from running amok and index errors if the client purposely provides bad cache
info. * If the XBakes service wasn't running, the SetAvatarAppearance routine
would crash when contacting the XBakes service even though it was in a
Try/Catch for the appropriate error type. It only properly error handles
with the type Exception :(. (commented on that because it's unusual)
---
.../Linden/Caps/UploadBakedTextureModule.cs | 123 ++++++++++++++-------
.../Region/ClientStack/Linden/UDP/LLClientView.cs | 34 +++++-
2 files changed, 111 insertions(+), 46 deletions(-)
(limited to 'OpenSim/Region')
diff --git a/OpenSim/Region/ClientStack/Linden/Caps/UploadBakedTextureModule.cs b/OpenSim/Region/ClientStack/Linden/Caps/UploadBakedTextureModule.cs
index 6778ba5..6bed95f 100644
--- a/OpenSim/Region/ClientStack/Linden/Caps/UploadBakedTextureModule.cs
+++ b/OpenSim/Region/ClientStack/Linden/Caps/UploadBakedTextureModule.cs
@@ -119,13 +119,20 @@ namespace OpenSim.Region.ClientStack.Linden
private void CaptureAppearanceSettings(IClientAPI remoteClient, Primitive.TextureEntry textureEntry, byte[] visualParams, Vector3 avSize, WearableCacheItem[] cacheItems)
{
+ int maxCacheitemsLoop = cacheItems.Length;
+ if (maxCacheitemsLoop > AvatarWearable.MAX_WEARABLES)
+ {
+ maxCacheitemsLoop = AvatarWearable.MAX_WEARABLES;
+ m_log.WarnFormat("[CACHEDBAKES]: Too Many Cache items Provided {0}, the max is {1}. Truncating!", cacheItems.Length, AvatarWearable.MAX_WEARABLES);
+ }
+
m_BakedTextureModule = m_scene.RequestModuleInterface();
if (cacheItems.Length > 0)
{
- m_log.Info("[Cacheitems]: " + cacheItems.Length);
- for (int iter = 0; iter < cacheItems.Length; iter++)
+ m_log.Debug("[Cacheitems]: " + cacheItems.Length);
+ for (int iter = 0; iter < maxCacheitemsLoop; iter++)
{
- m_log.Info("[Cacheitems] {" + iter + "/" + cacheItems[iter].TextureIndex + "}: c-" + cacheItems[iter].CacheId + ", t-" +
+ m_log.Debug("[Cacheitems] {" + iter + "/" + cacheItems[iter].TextureIndex + "}: c-" + cacheItems[iter].CacheId + ", t-" +
cacheItems[iter].TextureID);
}
@@ -133,65 +140,99 @@ namespace OpenSim.Region.ClientStack.Linden
if (m_scene.TryGetScenePresence(remoteClient.AgentId, out p))
{
- WearableCacheItem[] existingitems = p.Appearance.WearableCacheItems;
- if (existingitems == null)
+ WearableCacheItem[] existingitems = p.Appearance.WearableCacheItems;
+ if (existingitems == null)
+ {
+ if (m_BakedTextureModule != null)
{
- if (m_BakedTextureModule != null)
+ WearableCacheItem[] savedcache = null;
+ try
{
- WearableCacheItem[] savedcache = null;
- try
- {
- if (p.Appearance.WearableCacheItemsDirty)
- {
- savedcache = m_BakedTextureModule.Get(p.UUID);
- p.Appearance.WearableCacheItems = savedcache;
- p.Appearance.WearableCacheItemsDirty = false;
- }
-
- }
- catch (InvalidOperationException)
+ if (p.Appearance.WearableCacheItemsDirty)
{
+ savedcache = m_BakedTextureModule.Get(p.UUID);
+ p.Appearance.WearableCacheItems = savedcache;
+ p.Appearance.WearableCacheItemsDirty = false;
}
- if (savedcache != null)
- existingitems = savedcache;
}
+ /*
+ * The following Catch types DO NOT WORK with m_BakedTextureModule.Get
+ * it jumps to the General Packet Exception Handler if you don't catch Exception!
+ *
+ catch (System.Net.Sockets.SocketException)
+ {
+ cacheItems = null;
+ }
+ catch (WebException)
+ {
+ cacheItems = null;
+ }
+ catch (InvalidOperationException)
+ {
+ cacheItems = null;
+ } */
+ catch (Exception)
+ {
+ // The service logs a sufficient error message.
+ }
+
+
+ if (savedcache != null)
+ existingitems = savedcache;
}
- // Existing items null means it's a fully new appearance
- if (existingitems == null)
- {
+ }
+ // Existing items null means it's a fully new appearance
+ if (existingitems == null)
+ {
- for (int iter = 0; iter < cacheItems.Length; iter++)
+ for (int i = 0; i < maxCacheitemsLoop; i++)
+ {
+ if (textureEntry.FaceTextures.Length > cacheItems[i].TextureIndex)
{
-
- cacheItems[iter].TextureID = textureEntry.FaceTextures[cacheItems[iter].TextureIndex].TextureID;
+ cacheItems[i].TextureID =
+ textureEntry.FaceTextures[cacheItems[i].TextureIndex].TextureID;
if (m_scene.AssetService != null)
- cacheItems[iter].TextureAsset = m_scene.AssetService.GetCached(cacheItems[iter].TextureID.ToString());
-
-
+ cacheItems[i].TextureAsset =
+ m_scene.AssetService.GetCached(cacheItems[i].TextureID.ToString());
+ }
+ else
+ {
+ m_log.WarnFormat("[CACHEDBAKES]: Invalid Texture Index Provided, Texture doesn't exist or hasn't been uploaded yet {0}, the max is {1}. Skipping!", cacheItems[i].TextureIndex, textureEntry.FaceTextures.Length);
}
+
+
}
- else
-
-
+ }
+ else
+
+
+ {
+ // for each uploaded baked texture
+ for (int i = 0; i < maxCacheitemsLoop; i++)
{
- // for each uploaded baked texture
- for (int i = 0; i < cacheItems.Length; i++)
+ if (textureEntry.FaceTextures.Length > cacheItems[i].TextureIndex)
{
cacheItems[i].TextureID =
textureEntry.FaceTextures[cacheItems[i].TextureIndex].TextureID;
}
-
- for (int i = 0; i < cacheItems.Length; i++)
+ else
{
- if (cacheItems[i].TextureAsset == null)
- {
- cacheItems[i].TextureAsset = m_scene.AssetService.GetCached(cacheItems[i].TextureID.ToString());
- }
+ m_log.WarnFormat("[CACHEDBAKES]: Invalid Texture Index Provided, Texture doesn't exist or hasn't been uploaded yet {0}, the max is {1}. Skipping!", cacheItems[i].TextureIndex, textureEntry.FaceTextures.Length);
}
}
-
+ for (int i = 0; i < maxCacheitemsLoop; i++)
+ {
+ if (cacheItems[i].TextureAsset == null)
+ {
+ cacheItems[i].TextureAsset =
+ m_scene.AssetService.GetCached(cacheItems[i].TextureID.ToString());
+ }
+ }
+ }
+
+
p.Appearance.WearableCacheItems = cacheItems;
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
index 9e39699..d46adb8 100644
--- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
+++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
@@ -11727,6 +11727,11 @@ namespace OpenSim.Region.ClientStack.LindenUDP
IAssetService cache = m_scene.AssetService;
IBakedTextureModule bakedTextureModule = m_scene.RequestModuleInterface();
+ //bakedTextureModule = null;
+ int maxWearablesLoop = cachedtex.WearableData.Length;
+ if (maxWearablesLoop > AvatarWearable.MAX_WEARABLES)
+ maxWearablesLoop = AvatarWearable.MAX_WEARABLES;
+
if (bakedTextureModule != null && cache != null)
{
// We need to make sure the asset stored in the bake is available on this server also by it's assetid before we map it to a Cacheid
@@ -11742,10 +11747,27 @@ namespace OpenSim.Region.ClientStack.LindenUDP
p.Appearance.WearableCacheItems = cacheItems;
p.Appearance.WearableCacheItemsDirty = false;
}
+
+ /*
+ * The following Catch types DO NOT WORK, it jumps to the General Packet Exception Handler if you don't catch Exception!
+ *
+ catch (System.Net.Sockets.SocketException)
+ {
+ cacheItems = null;
+ }
+ catch (WebException)
+ {
+ cacheItems = null;
+ }
catch (InvalidOperationException)
{
cacheItems = null;
+ } */
+ catch (Exception)
+ {
+ cacheItems = null;
}
+
}
else if (p.Appearance.WearableCacheItems != null)
{
@@ -11766,10 +11788,11 @@ namespace OpenSim.Region.ClientStack.LindenUDP
}
}
+
if (cacheItems != null)
{
- for (int i = 0; i < cachedtex.WearableData.Length; i++)
+ for (int i = 0; i < maxWearablesLoop; i++)
{
WearableCacheItem item =
WearableCacheItem.SearchTextureIndex(cachedtex.WearableData[i].TextureIndex,cacheItems);
@@ -11777,8 +11800,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP
cachedresp.WearableData[i] = new AgentCachedTextureResponsePacket.WearableDataBlock();
cachedresp.WearableData[i].TextureIndex= cachedtex.WearableData[i].TextureIndex;
cachedresp.WearableData[i].HostName = new byte[0];
- if (item != null)
+ if (item != null && cachedtex.WearableData[i].ID == item.CacheId)
{
+
cachedresp.WearableData[i].TextureID = item.TextureID;
}
else
@@ -11789,7 +11813,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
}
else
{
- for (int i = 0; i < cachedtex.WearableData.Length; i++)
+ for (int i = 0; i < maxWearablesLoop; i++)
{
cachedresp.WearableData[i] = new AgentCachedTextureResponsePacket.WearableDataBlock();
cachedresp.WearableData[i].TextureIndex = cachedtex.WearableData[i].TextureIndex;
@@ -11803,7 +11827,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
{
if (cache == null)
{
- for (int i = 0; i < cachedtex.WearableData.Length; i++)
+ for (int i = 0; i < maxWearablesLoop; i++)
{
cachedresp.WearableData[i] = new AgentCachedTextureResponsePacket.WearableDataBlock();
cachedresp.WearableData[i].TextureIndex = cachedtex.WearableData[i].TextureIndex;
@@ -11814,7 +11838,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
}
else
{
- for (int i = 0; i < cachedtex.WearableData.Length; i++)
+ for (int i = 0; i < maxWearablesLoop; i++)
{
cachedresp.WearableData[i] = new AgentCachedTextureResponsePacket.WearableDataBlock();
cachedresp.WearableData[i].TextureIndex = cachedtex.WearableData[i].TextureIndex;
--
cgit v1.1
From 397aa74777bc0c54ecd9e1b286e59e9de0a4f3c2 Mon Sep 17 00:00:00 2001
From: teravus
Date: Tue, 1 Jan 2013 23:07:37 -0500
Subject: * Fixes the attachment scripted rotation bug. The problem is the
code was relying on m_host.ParentId = 0 to determine if the attachment should
be rotated against root prim offset. To fix it for attachments, we also
need to check if the host's localID == RootPart's localID. otherwise we are
cumulatively rotating against the host's root part rotation offset (which in
this case, is it's own rotation)
---
.../ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | 13 +++++++++++--
1 file changed, 11 insertions(+), 2 deletions(-)
(limited to 'OpenSim/Region')
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index 7ff30ca..a559683 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -2353,8 +2353,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
{
m_host.AddScriptLPS(1);
+
+ SceneObjectPart rootPart = m_host.ParentGroup.RootPart;
+
+
+ // Teravus: if (m_host.ParentID == 0) is bug code because the ParentID for the Avatar will cause this to be nonzero for root prim attachments
+ // which is then treated like a child prim rotation and it's offset gets cumulatively multiplied against.
+ // to fix the scripted rotations we also have to check to see if the root part localid is the same as the host's localid.
+ // RootPart != null should shortcircuit
+
// try to let this work as in SL...
- if (m_host.ParentID == 0)
+ if (m_host.ParentID == 0 ) //|| (rootPart != null && m_host.LocalId == rootPart.LocalId))
{
// special case: If we are root, rotate complete SOG to new rotation
SetRot(m_host, rot);
@@ -2362,7 +2371,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
else
{
// we are a child. The rotation values will be set to the one of root modified by rot, as in SL. Don't ask.
- SceneObjectPart rootPart = m_host.ParentGroup.RootPart;
+
if (rootPart != null) // better safe than sorry
{
SetRot(m_host, rootPart.RotationOffset * (Quaternion)rot);
--
cgit v1.1
From f9148e5fc7178fe24323a67d8e26ba4a04a4a9e3 Mon Sep 17 00:00:00 2001
From: teravus
Date: Tue, 1 Jan 2013 23:11:46 -0500
Subject: * This is actually the fix described the last commit.. I had
commented it out to see if the problem had affected all attachments or just
HUD attachments.
---
OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
(limited to 'OpenSim/Region')
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index a559683..1fe095b 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -2363,7 +2363,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
// RootPart != null should shortcircuit
// try to let this work as in SL...
- if (m_host.ParentID == 0 ) //|| (rootPart != null && m_host.LocalId == rootPart.LocalId))
+ if (m_host.ParentID == 0 || (rootPart != null && m_host.LocalId == rootPart.LocalId))
{
// special case: If we are root, rotate complete SOG to new rotation
SetRot(m_host, rot);
--
cgit v1.1
From 92c26e49947040a212db85ac4f59e5ba7f395856 Mon Sep 17 00:00:00 2001
From: teravus
Date: Tue, 1 Jan 2013 23:55:24 -0500
Subject: * ubit pointed out another place where that check needed to be
updated and I normalized it.
---
OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | 9 +++------
1 file changed, 3 insertions(+), 6 deletions(-)
(limited to 'OpenSim/Region')
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index 1fe095b..7e77b0f 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -2354,16 +2354,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
m_host.AddScriptLPS(1);
- SceneObjectPart rootPart = m_host.ParentGroup.RootPart;
-
-
// Teravus: if (m_host.ParentID == 0) is bug code because the ParentID for the Avatar will cause this to be nonzero for root prim attachments
// which is then treated like a child prim rotation and it's offset gets cumulatively multiplied against.
// to fix the scripted rotations we also have to check to see if the root part localid is the same as the host's localid.
// RootPart != null should shortcircuit
// try to let this work as in SL...
- if (m_host.ParentID == 0 || (rootPart != null && m_host.LocalId == rootPart.LocalId))
+ if (m_host.ParentID == 0 || (m_host.ParentGroup != null && m_host == m_host.ParentGroup.RootPart))
{
// special case: If we are root, rotate complete SOG to new rotation
SetRot(m_host, rot);
@@ -2371,7 +2368,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
else
{
// we are a child. The rotation values will be set to the one of root modified by rot, as in SL. Don't ask.
-
+ SceneObjectPart rootPart = m_host.ParentGroup.RootPart;
if (rootPart != null) // better safe than sorry
{
SetRot(m_host, rootPart.RotationOffset * (Quaternion)rot);
@@ -7920,7 +7917,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
LSL_Rotation q = rules.GetQuaternionItem(idx++);
// try to let this work as in SL...
- if (part.ParentID == 0)
+ if (part.ParentID == 0 || (part.ParentGroup != null && part == part.ParentGroup.RootPart))
{
// special case: If we are root, rotate complete SOG to new rotation
SetRot(part, q);
--
cgit v1.1
From dc6b7bb5c9d4ba26a043566f3c6f969d56268132 Mon Sep 17 00:00:00 2001
From: UbitUmarov
Date: Sun, 6 Jan 2013 12:07:16 +0000
Subject: don't try to read geom positions outside main ode thread :(
---
.../Region/Physics/UbitOdePlugin/ODESitAvatar.cs | 21 +++++++++++----------
1 file changed, 11 insertions(+), 10 deletions(-)
(limited to 'OpenSim/Region')
diff --git a/OpenSim/Region/Physics/UbitOdePlugin/ODESitAvatar.cs b/OpenSim/Region/Physics/UbitOdePlugin/ODESitAvatar.cs
index ecc732a..e9023c3 100644
--- a/OpenSim/Region/Physics/UbitOdePlugin/ODESitAvatar.cs
+++ b/OpenSim/Region/Physics/UbitOdePlugin/ODESitAvatar.cs
@@ -78,8 +78,12 @@ namespace OpenSim.Region.Physics.OdePlugin
IntPtr geom = ((OdePrim)actor).prim_geom;
- Vector3 geopos = d.GeomGetPositionOMV(geom);
- Quaternion geomOri = d.GeomGetQuaternionOMV(geom);
+// Vector3 geopos = d.GeomGetPositionOMV(geom);
+// Quaternion geomOri = d.GeomGetQuaternionOMV(geom);
+
+ Vector3 geopos = actor.Position;
+ Quaternion geomOri = actor.Orientation;
+
Quaternion geomInvOri = Quaternion.Conjugate(geomOri);
Quaternion ori = Quaternion.Identity;
@@ -116,6 +120,7 @@ namespace OpenSim.Region.Physics.OdePlugin
}
int status = 1;
+
offset = rayResults[0].Pos - geopos;
d.GeomClassID geoclass = d.GeomGetClass(geom);
@@ -191,13 +196,12 @@ namespace OpenSim.Region.Physics.OdePlugin
if (norm.Z < 0.5f)
{
float rayDist = 4.0f;
- float curEdgeDist = 0.0f;
for (int i = 0; i < 6; i++)
{
- pivot.X -= 0.005f * norm.X;
- pivot.Y -= 0.005f * norm.Y;
- pivot.Z -= 0.005f * norm.Z;
+ pivot.X -= 0.01f * norm.X;
+ pivot.Y -= 0.01f * norm.Y;
+ pivot.Z -= 0.01f * norm.Z;
rayDir.X = -norm.X * norm.Z;
rayDir.Y = -norm.Y * norm.Z;
@@ -208,8 +212,6 @@ namespace OpenSim.Region.Physics.OdePlugin
if (rayResults.Count == 0)
break;
- curEdgeDist += rayResults[0].Depth;
-
if (Math.Abs(rayResults[0].Normal.Z) < 0.7f)
{
rayDist -= rayResults[0].Depth;
@@ -226,7 +228,6 @@ namespace OpenSim.Region.Physics.OdePlugin
else
{
foundEdge = true;
- edgeDist = curEdgeDist;
edgePos = rayResults[0].Pos;
break;
}
@@ -254,7 +255,7 @@ namespace OpenSim.Region.Physics.OdePlugin
for (int i = 0; i < 3; i++)
{
- pivot.Z -= 0.005f;
+ pivot.Z -= 0.01f;
rayDir.X = toCamX;
rayDir.Y = toCamY;
rayDir.Z = (-toCamX * norm.X - toCamY * norm.Y) / norm.Z;
--
cgit v1.1
From ca40e656ab4f0915b37356a9f6394f93cd1119a3 Mon Sep 17 00:00:00 2001
From: UbitUmarov
Date: Mon, 7 Jan 2013 10:35:55 +0000
Subject: in raycast for camera exclude self detection
---
OpenSim/Region/Framework/Scenes/ScenePresence.cs | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
(limited to 'OpenSim/Region')
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 5087882..4504e18 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -1415,8 +1415,9 @@ namespace OpenSim.Region.Framework.Scenes
if (m_followCamAuto)
{
- if (hitYN)
+ if (hitYN && localid != LocalId)
{
+
CameraConstraintActive = true;
//m_log.DebugFormat("[RAYCASTRESULT]: {0}, {1}, {2}, {3}", hitYN, collisionPoint, localid, distance);
@@ -2282,7 +2283,6 @@ namespace OpenSim.Region.Framework.Scenes
ControllingClient.SendAlertMessage(" Sit position on restricted land, try another spot");
return;
}
-// m_log.InfoFormat("physsit {0} {1}", offset.ToString(),Orientation.ToString());
RemoveFromPhysicalScene();
@@ -2293,7 +2293,6 @@ namespace OpenSim.Region.Framework.Scenes
part.AddSittingAvatar(UUID);
-
Vector3 cameraAtOffset = part.GetCameraAtOffset();
Vector3 cameraEyeOffset = part.GetCameraEyeOffset();
bool forceMouselook = part.GetForceMouselook();
--
cgit v1.1
From 982328b4ed2f632765e3c3d3bd1cc1110fdb91fa Mon Sep 17 00:00:00 2001
From: UbitUmarov
Date: Mon, 7 Jan 2013 10:56:30 +0000
Subject: exclude avatars from unfiltered RaycastWorld
---
OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
(limited to 'OpenSim/Region')
diff --git a/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs b/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs
index d045b59..f58870a 100644
--- a/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs
+++ b/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs
@@ -2586,7 +2586,7 @@ namespace OpenSim.Region.Physics.OdePlugin
req.Normal = direction;
req.Origin = position;
req.Count = 0;
- req.filter = RayFilterFlags.All;
+ req.filter = RayFilterFlags.AllPrims | RayFilterFlags.land;
m_rayCastManager.QueueRequest(req);
}
@@ -2603,7 +2603,7 @@ namespace OpenSim.Region.Physics.OdePlugin
req.Normal = direction;
req.Origin = position;
req.Count = Count;
- req.filter = RayFilterFlags.All;
+ req.filter = RayFilterFlags.AllPrims | RayFilterFlags.land;
m_rayCastManager.QueueRequest(req);
}
@@ -2631,7 +2631,7 @@ namespace OpenSim.Region.Physics.OdePlugin
req.Normal = direction;
req.Origin = position;
req.Count = Count;
- req.filter = RayFilterFlags.All;
+ req.filter = RayFilterFlags.AllPrims | RayFilterFlags.land;
lock (SyncObject)
{
--
cgit v1.1
From d2cb2da7909aa79260af52a7abbc7b491c5495c2 Mon Sep 17 00:00:00 2001
From: UbitUmarov
Date: Mon, 7 Jan 2013 11:03:36 +0000
Subject: also exclude land
---
OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
(limited to 'OpenSim/Region')
diff --git a/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs b/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs
index f58870a..0d18adb 100644
--- a/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs
+++ b/OpenSim/Region/Physics/UbitOdePlugin/OdeScene.cs
@@ -2586,7 +2586,7 @@ namespace OpenSim.Region.Physics.OdePlugin
req.Normal = direction;
req.Origin = position;
req.Count = 0;
- req.filter = RayFilterFlags.AllPrims | RayFilterFlags.land;
+ req.filter = RayFilterFlags.AllPrims;
m_rayCastManager.QueueRequest(req);
}
@@ -2603,7 +2603,7 @@ namespace OpenSim.Region.Physics.OdePlugin
req.Normal = direction;
req.Origin = position;
req.Count = Count;
- req.filter = RayFilterFlags.AllPrims | RayFilterFlags.land;
+ req.filter = RayFilterFlags.AllPrims;
m_rayCastManager.QueueRequest(req);
}
@@ -2631,7 +2631,7 @@ namespace OpenSim.Region.Physics.OdePlugin
req.Normal = direction;
req.Origin = position;
req.Count = Count;
- req.filter = RayFilterFlags.AllPrims | RayFilterFlags.land;
+ req.filter = RayFilterFlags.AllPrims;
lock (SyncObject)
{
--
cgit v1.1
From d5066ae6787ac860e673a91bf207bf2b397a2714 Mon Sep 17 00:00:00 2001
From: UbitUmarov
Date: Tue, 8 Jan 2013 00:21:09 +0000
Subject: * DAnger, TEST * change camera plane collision detection. Still
bounces on * prim edges due to camera lag
---
OpenSim/Region/Framework/Scenes/ScenePresence.cs | 108 +++++++++++----------
.../UbitOdePlugin/ODERayCastRequestManager.cs | 41 +++++---
2 files changed, 88 insertions(+), 61 deletions(-)
(limited to 'OpenSim/Region')
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 4504e18..5d0baf3 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -227,8 +227,6 @@ namespace OpenSim.Region.Framework.Scenes
///
public bool LandAtTarget { get; private set; }
- private bool m_followCamAuto;
-
private int m_movementUpdateCount;
private const int NumMovementsBetweenRayCast = 5;
@@ -357,6 +355,9 @@ namespace OpenSim.Region.Framework.Scenes
///
protected Vector3 m_lastCameraPosition;
+ private Vector4 m_lastCameraCollisionPlane = new Vector4(0f, 0f, 0f, 1);
+ private bool m_doingCamRayCast = false;
+
public Vector3 CameraPosition { get; set; }
public Quaternion CameraRotation
@@ -1407,36 +1408,40 @@ namespace OpenSim.Region.Framework.Scenes
///
///
///
- public void RayCastCameraCallback(bool hitYN, Vector3 collisionPoint, uint localid, float distance, Vector3 pNormal)
+ ///
+
+ private void UpdateCameraCollisionPlane(Vector4 plane)
{
- const float POSITION_TOLERANCE = 0.02f;
- const float VELOCITY_TOLERANCE = 0.02f;
- const float ROTATION_TOLERANCE = 0.02f;
+ if (m_lastCameraCollisionPlane != plane)
+ {
+ m_lastCameraCollisionPlane = plane;
+ ControllingClient.SendCameraConstraint(plane);
+ }
+ }
- if (m_followCamAuto)
+ public void RayCastCameraCallback(bool hitYN, Vector3 collisionPoint, uint localid, float distance, Vector3 pNormal)
+ {
+ m_doingCamRayCast = false;
+ if (hitYN && localid != LocalId)
{
- if (hitYN && localid != LocalId)
- {
+ CameraConstraintActive = true;
+ pNormal.X = (float)Math.Round(pNormal.X, 2);
+ pNormal.Y = (float)Math.Round(pNormal.Y, 2);
+ pNormal.Z = (float)Math.Round(pNormal.Z, 2);
+ pNormal.Normalize();
+ collisionPoint.X = (float)Math.Round(collisionPoint.X, 1);
+ collisionPoint.Y = (float)Math.Round(collisionPoint.Y, 1);
+ collisionPoint.Z = (float)Math.Round(collisionPoint.Z, 1);
+
+ Vector4 plane = new Vector4(pNormal.X, pNormal.Y, pNormal.Z, Vector3.Dot(collisionPoint, pNormal));
+ UpdateCameraCollisionPlane(plane);
+ }
+ else
+ {
+ Vector4 plane = new Vector4(0.9f, 0.0f, 0.361f, -9000f); // not right...
+ UpdateCameraCollisionPlane(plane);
- CameraConstraintActive = true;
- //m_log.DebugFormat("[RAYCASTRESULT]: {0}, {1}, {2}, {3}", hitYN, collisionPoint, localid, distance);
-
- Vector3 normal = Vector3.Normalize(new Vector3(0f, 0f, collisionPoint.Z) - collisionPoint);
- ControllingClient.SendCameraConstraint(new Vector4(normal.X, normal.Y, normal.Z, -1 * Vector3.Distance(new Vector3(0,0,collisionPoint.Z),collisionPoint)));
- }
- else
- {
- if (!m_pos.ApproxEquals(m_lastPosition, POSITION_TOLERANCE) ||
- !Velocity.ApproxEquals(m_lastVelocity, VELOCITY_TOLERANCE) ||
- !Rotation.ApproxEquals(m_lastRotation, ROTATION_TOLERANCE))
- {
- if (CameraConstraintActive)
- {
- ControllingClient.SendCameraConstraint(new Vector4(0f, 0.5f, 0.9f, -3000f));
- CameraConstraintActive = false;
- }
- }
- }
+ CameraConstraintActive = false;
}
}
@@ -1511,12 +1516,6 @@ namespace OpenSim.Region.Framework.Scenes
// DrawDistance = agentData.Far;
DrawDistance = Scene.DefaultDrawDistance;
- // Check if Client has camera in 'follow cam' or 'build' mode.
- Vector3 camdif = (Vector3.One * Rotation - Vector3.One * CameraRotation);
-
- m_followCamAuto = ((CameraUpAxis.Z > 0.959f && CameraUpAxis.Z < 0.98f)
- && (Math.Abs(camdif.X) < 0.4f && Math.Abs(camdif.Y) < 0.4f)) ? true : false;
-
m_mouseLook = (flags & AgentManager.ControlFlags.AGENT_CONTROL_MOUSELOOK) != 0;
m_leftButtonDown = (flags & AgentManager.ControlFlags.AGENT_CONTROL_LBUTTON_DOWN) != 0;
@@ -1536,26 +1535,37 @@ namespace OpenSim.Region.Framework.Scenes
StandUp();
}
- //m_log.DebugFormat("[FollowCam]: {0}", m_followCamAuto);
// Raycast from the avatar's head to the camera to see if there's anything blocking the view
- if ((m_movementUpdateCount % NumMovementsBetweenRayCast) == 0 && m_scene.PhysicsScene.SupportsRayCast())
+ // this exclude checks may not be complete
+
+ if (!m_doingCamRayCast && !m_mouseLook && m_scene.PhysicsScene.SupportsRayCast() && ParentID == 0)
{
- if (m_followCamAuto)
+ Vector3 posAdjusted = AbsolutePosition;
+ posAdjusted.Z += 0.5f * Appearance.AvatarSize.Z - 0.5f;
+
+ Vector3 tocam = CameraPosition - posAdjusted;
+ tocam.X = (float)Math.Round(tocam.X, 1);
+ tocam.Y = (float)Math.Round(tocam.Y, 1);
+ tocam.Z = (float)Math.Round(tocam.Z, 1);
+
+ float distTocamlen = tocam.Length();
+ if (distTocamlen > 0.3f)
{
- // Vector3 posAdjusted = m_pos + HEAD_ADJUSTMENT;
- // m_scene.PhysicsScene.RaycastWorld(m_pos, Vector3.Normalize(CameraPosition - posAdjusted), Vector3.Distance(CameraPosition, posAdjusted) + 0.3f, RayCastCameraCallback);
-
- Vector3 posAdjusted = AbsolutePosition + HEAD_ADJUSTMENT;
- Vector3 distTocam = CameraPosition - posAdjusted;
- float distTocamlen = distTocam.Length();
- if (distTocamlen > 0)
- {
- distTocam *= 1.0f / distTocamlen;
- m_scene.PhysicsScene.RaycastWorld(posAdjusted, distTocam, distTocamlen + 0.3f, RayCastCameraCallback);
- }
-
+ tocam *= (1.0f / distTocamlen);
+ posAdjusted.X = (float)Math.Round(posAdjusted.X, 1);
+ posAdjusted.Y = (float)Math.Round(posAdjusted.Y, 1);
+ posAdjusted.Z = (float)Math.Round(posAdjusted.Z, 1);
+
+ m_doingCamRayCast = true;
+ m_scene.PhysicsScene.RaycastWorld(posAdjusted, tocam, distTocamlen + 1.0f, RayCastCameraCallback);
}
}
+ else if (CameraConstraintActive && (m_mouseLook || ParentID != 0) )
+ {
+ Vector4 plane = new Vector4(0.9f, 0.0f, 0.361f, -10000f); // not right...
+ UpdateCameraCollisionPlane(plane);
+ CameraConstraintActive = false;
+ }
uint flagsForScripts = (uint)flags;
flags = RemoveIgnoredControls(flags, IgnoredControls);
diff --git a/OpenSim/Region/Physics/UbitOdePlugin/ODERayCastRequestManager.cs b/OpenSim/Region/Physics/UbitOdePlugin/ODERayCastRequestManager.cs
index 6e9281b..7fe3109 100644
--- a/OpenSim/Region/Physics/UbitOdePlugin/ODERayCastRequestManager.cs
+++ b/OpenSim/Region/Physics/UbitOdePlugin/ODERayCastRequestManager.cs
@@ -173,8 +173,13 @@ namespace OpenSim.Region.Physics.OdePlugin
d.GeomRaySetClosestHit(ray, closestHit);
if (req.callbackMethod is RaycastCallback)
+ {
// if we only want one get only one per Collision pair saving memory
CurrentRayFilter |= RayFilterFlags.ClosestHit;
+ d.GeomRaySetClosestHit(ray, 1);
+ }
+ else
+ d.GeomRaySetClosestHit(ray, closestHit);
}
if ((CurrentRayFilter & RayFilterFlags.ContactsUnImportant) != 0)
@@ -555,10 +560,13 @@ namespace OpenSim.Region.Physics.OdePlugin
ContactResult collisionresult = new ContactResult();
collisionresult.ConsumerID = ID;
- collisionresult.Pos = new Vector3(curcontact.pos.X, curcontact.pos.Y, curcontact.pos.Z);
+ collisionresult.Pos.X = curcontact.pos.X;
+ collisionresult.Pos.Y = curcontact.pos.Y;
+ collisionresult.Pos.Z = curcontact.pos.Z;
collisionresult.Depth = curcontact.depth;
- collisionresult.Normal = new Vector3(curcontact.normal.X, curcontact.normal.Y,
- curcontact.normal.Z);
+ collisionresult.Normal.X = curcontact.normal.X;
+ collisionresult.Normal.Y = curcontact.normal.Y;
+ collisionresult.Normal.Z = curcontact.normal.Z;
lock (m_contactResults)
{
m_contactResults.Add(collisionresult);
@@ -581,10 +589,13 @@ namespace OpenSim.Region.Physics.OdePlugin
if (curcontact.depth < collisionresult.Depth)
{
- collisionresult.Pos = new Vector3(curcontact.pos.X, curcontact.pos.Y, curcontact.pos.Z);
+ collisionresult.Pos.X = curcontact.pos.X;
+ collisionresult.Pos.Y = curcontact.pos.Y;
+ collisionresult.Pos.Z = curcontact.pos.Z;
collisionresult.Depth = curcontact.depth;
- collisionresult.Normal = new Vector3(curcontact.normal.X, curcontact.normal.Y,
- curcontact.normal.Z);
+ collisionresult.Normal.X = curcontact.normal.X;
+ collisionresult.Normal.Y = curcontact.normal.Y;
+ collisionresult.Normal.Z = curcontact.normal.Z;
}
}
@@ -699,10 +710,13 @@ namespace OpenSim.Region.Physics.OdePlugin
ContactResult collisionresult = new ContactResult();
collisionresult.ConsumerID = ID;
- collisionresult.Pos = new Vector3(curcontact.pos.X, curcontact.pos.Y, curcontact.pos.Z);
+ collisionresult.Pos.X = curcontact.pos.X;
+ collisionresult.Pos.Y = curcontact.pos.Y;
+ collisionresult.Pos.Z = curcontact.pos.Z;
collisionresult.Depth = curcontact.depth;
- collisionresult.Normal = new Vector3(curcontact.normal.X, curcontact.normal.Y,
- curcontact.normal.Z);
+ collisionresult.Normal.X = curcontact.normal.X;
+ collisionresult.Normal.Y = curcontact.normal.Y;
+ collisionresult.Normal.Z = curcontact.normal.Z;
lock (m_contactResults)
{
m_contactResults.Add(collisionresult);
@@ -725,10 +739,13 @@ namespace OpenSim.Region.Physics.OdePlugin
if (curcontact.depth < collisionresult.Depth)
{
- collisionresult.Pos = new Vector3(curcontact.pos.X, curcontact.pos.Y, curcontact.pos.Z);
+ collisionresult.Pos.X = curcontact.pos.X;
+ collisionresult.Pos.Y = curcontact.pos.Y;
+ collisionresult.Pos.Z = curcontact.pos.Z;
collisionresult.Depth = curcontact.depth;
- collisionresult.Normal = new Vector3(curcontact.normal.X, curcontact.normal.Y,
- curcontact.normal.Z);
+ collisionresult.Normal.X = curcontact.normal.X;
+ collisionresult.Normal.Y = curcontact.normal.Y;
+ collisionresult.Normal.Z = curcontact.normal.Z;
}
}
--
cgit v1.1
From 1bf553fd6593672c4ac5cd74c180367fcdb18c79 Mon Sep 17 00:00:00 2001
From: UbitUmarov
Date: Tue, 8 Jan 2013 01:12:00 +0000
Subject: reduce sampling of camera raycasts to previus value
---
OpenSim/Region/Framework/Scenes/ScenePresence.cs | 49 +++++++++++++-----------
1 file changed, 26 insertions(+), 23 deletions(-)
(limited to 'OpenSim/Region')
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 5d0baf3..a19f029 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -1538,33 +1538,36 @@ namespace OpenSim.Region.Framework.Scenes
// Raycast from the avatar's head to the camera to see if there's anything blocking the view
// this exclude checks may not be complete
- if (!m_doingCamRayCast && !m_mouseLook && m_scene.PhysicsScene.SupportsRayCast() && ParentID == 0)
+ if (m_movementUpdateCount % NumMovementsBetweenRayCast == 0 && m_scene.PhysicsScene.SupportsRayCast())
{
- Vector3 posAdjusted = AbsolutePosition;
- posAdjusted.Z += 0.5f * Appearance.AvatarSize.Z - 0.5f;
-
- Vector3 tocam = CameraPosition - posAdjusted;
- tocam.X = (float)Math.Round(tocam.X, 1);
- tocam.Y = (float)Math.Round(tocam.Y, 1);
- tocam.Z = (float)Math.Round(tocam.Z, 1);
-
- float distTocamlen = tocam.Length();
- if (distTocamlen > 0.3f)
+ if (!m_doingCamRayCast && !m_mouseLook && ParentID == 0)
{
- tocam *= (1.0f / distTocamlen);
- posAdjusted.X = (float)Math.Round(posAdjusted.X, 1);
- posAdjusted.Y = (float)Math.Round(posAdjusted.Y, 1);
- posAdjusted.Z = (float)Math.Round(posAdjusted.Z, 1);
+ Vector3 posAdjusted = AbsolutePosition;
+ posAdjusted.Z += 0.5f * Appearance.AvatarSize.Z - 0.5f;
+
+ Vector3 tocam = CameraPosition - posAdjusted;
+ tocam.X = (float)Math.Round(tocam.X, 1);
+ tocam.Y = (float)Math.Round(tocam.Y, 1);
+ tocam.Z = (float)Math.Round(tocam.Z, 1);
- m_doingCamRayCast = true;
- m_scene.PhysicsScene.RaycastWorld(posAdjusted, tocam, distTocamlen + 1.0f, RayCastCameraCallback);
+ float distTocamlen = tocam.Length();
+ if (distTocamlen > 0.3f)
+ {
+ tocam *= (1.0f / distTocamlen);
+ posAdjusted.X = (float)Math.Round(posAdjusted.X, 1);
+ posAdjusted.Y = (float)Math.Round(posAdjusted.Y, 1);
+ posAdjusted.Z = (float)Math.Round(posAdjusted.Z, 1);
+
+ m_doingCamRayCast = true;
+ m_scene.PhysicsScene.RaycastWorld(posAdjusted, tocam, distTocamlen + 1.0f, RayCastCameraCallback);
+ }
+ }
+ else if (CameraConstraintActive && (m_mouseLook || ParentID != 0))
+ {
+ Vector4 plane = new Vector4(0.9f, 0.0f, 0.361f, -10000f); // not right...
+ UpdateCameraCollisionPlane(plane);
+ CameraConstraintActive = false;
}
- }
- else if (CameraConstraintActive && (m_mouseLook || ParentID != 0) )
- {
- Vector4 plane = new Vector4(0.9f, 0.0f, 0.361f, -10000f); // not right...
- UpdateCameraCollisionPlane(plane);
- CameraConstraintActive = false;
}
uint flagsForScripts = (uint)flags;
--
cgit v1.1
From 126e73c5ed7bb95b36739d46921375b78f6207e1 Mon Sep 17 00:00:00 2001
From: UbitUmarov
Date: Tue, 8 Jan 2013 02:29:21 +0000
Subject: put back position and rot change check before sending releasing
plane constrain
---
OpenSim/Region/Framework/Scenes/ScenePresence.cs | 11 +++++++----
1 file changed, 7 insertions(+), 4 deletions(-)
(limited to 'OpenSim/Region')
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index a19f029..cdba282 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -1421,6 +1421,9 @@ namespace OpenSim.Region.Framework.Scenes
public void RayCastCameraCallback(bool hitYN, Vector3 collisionPoint, uint localid, float distance, Vector3 pNormal)
{
+ const float POSITION_TOLERANCE = 0.02f;
+ const float ROTATION_TOLERANCE = 0.02f;
+
m_doingCamRayCast = false;
if (hitYN && localid != LocalId)
{
@@ -1436,11 +1439,11 @@ namespace OpenSim.Region.Framework.Scenes
Vector4 plane = new Vector4(pNormal.X, pNormal.Y, pNormal.Z, Vector3.Dot(collisionPoint, pNormal));
UpdateCameraCollisionPlane(plane);
}
- else
+ else if (!m_pos.ApproxEquals(m_lastPosition, POSITION_TOLERANCE) ||
+ !Rotation.ApproxEquals(m_lastRotation, ROTATION_TOLERANCE))
{
Vector4 plane = new Vector4(0.9f, 0.0f, 0.361f, -9000f); // not right...
UpdateCameraCollisionPlane(plane);
-
CameraConstraintActive = false;
}
}
@@ -1543,8 +1546,8 @@ namespace OpenSim.Region.Framework.Scenes
if (!m_doingCamRayCast && !m_mouseLook && ParentID == 0)
{
Vector3 posAdjusted = AbsolutePosition;
- posAdjusted.Z += 0.5f * Appearance.AvatarSize.Z - 0.5f;
-
+// posAdjusted.Z += 0.5f * Appearance.AvatarSize.Z - 0.5f;
+ posAdjusted.Z += 1.0f; // viewer current camera focus point
Vector3 tocam = CameraPosition - posAdjusted;
tocam.X = (float)Math.Round(tocam.X, 1);
tocam.Y = (float)Math.Round(tocam.Y, 1);
--
cgit v1.1
From d1fa650c3f16ee74cd39d9258c5ef7aa4869ca03 Mon Sep 17 00:00:00 2001
From: Melanie
Date: Tue, 8 Jan 2013 12:08:34 +0100
Subject: Remove sending AvatarData because this also happens on login, where
it chokes Firestorm, Singularity and other viewers with the new appearance
pipeline.
---
OpenSim/Region/Framework/Scenes/ScenePresence.cs | 10 +---------
1 file changed, 1 insertion(+), 9 deletions(-)
(limited to 'OpenSim/Region')
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 4504e18..b6407d2 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -140,8 +140,6 @@ namespace OpenSim.Region.Framework.Scenes
private Vector3 m_lastPosition;
private Quaternion m_lastRotation;
private Vector3 m_lastVelocity;
- private Vector3 m_lastSize = new Vector3(0.45f,0.6f,1.9f);
-
private Vector3? m_forceToApply;
private int m_userFlags;
@@ -2525,13 +2523,7 @@ namespace OpenSim.Region.Framework.Scenes
// NOTE: Velocity is not the same as m_velocity. Velocity will attempt to
// grab the latest PhysicsActor velocity, whereas m_velocity is often
// storing a requested force instead of an actual traveling velocity
- if (Appearance.AvatarSize != m_lastSize)
- {
- m_lastSize = Appearance.AvatarSize;
- SendAvatarDataToAllAgents();
- }
-
- else if (!Rotation.ApproxEquals(m_lastRotation, ROTATION_TOLERANCE) ||
+ if (!Rotation.ApproxEquals(m_lastRotation, ROTATION_TOLERANCE) ||
!Velocity.ApproxEquals(m_lastVelocity, VELOCITY_TOLERANCE) ||
!m_pos.ApproxEquals(m_lastPosition, POSITION_TOLERANCE))
{
--
cgit v1.1
From 09d41f4f7892b2d40b692f0cdd451fea07ad0cf0 Mon Sep 17 00:00:00 2001
From: Melanie
Date: Tue, 8 Jan 2013 13:11:04 +0100
Subject: Revert "Remove sending AvatarData because this also happens on login,
where it chokes"
This reverts commit d1fa650c3f16ee74cd39d9258c5ef7aa4869ca03.
---
OpenSim/Region/Framework/Scenes/ScenePresence.cs | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)
(limited to 'OpenSim/Region')
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index be3a39a..cdba282 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -140,6 +140,8 @@ namespace OpenSim.Region.Framework.Scenes
private Vector3 m_lastPosition;
private Quaternion m_lastRotation;
private Vector3 m_lastVelocity;
+ private Vector3 m_lastSize = new Vector3(0.45f,0.6f,1.9f);
+
private Vector3? m_forceToApply;
private int m_userFlags;
@@ -2539,7 +2541,13 @@ namespace OpenSim.Region.Framework.Scenes
// NOTE: Velocity is not the same as m_velocity. Velocity will attempt to
// grab the latest PhysicsActor velocity, whereas m_velocity is often
// storing a requested force instead of an actual traveling velocity
- if (!Rotation.ApproxEquals(m_lastRotation, ROTATION_TOLERANCE) ||
+ if (Appearance.AvatarSize != m_lastSize)
+ {
+ m_lastSize = Appearance.AvatarSize;
+ SendAvatarDataToAllAgents();
+ }
+
+ else if (!Rotation.ApproxEquals(m_lastRotation, ROTATION_TOLERANCE) ||
!Velocity.ApproxEquals(m_lastVelocity, VELOCITY_TOLERANCE) ||
!m_pos.ApproxEquals(m_lastPosition, POSITION_TOLERANCE))
{
--
cgit v1.1
From ef8f03b711e7d15443b9f0a597632e75e3d86ddc Mon Sep 17 00:00:00 2001
From: Melanie
Date: Tue, 8 Jan 2013 13:57:45 +0100
Subject: Prevent avatar data from being sent during login when it's not valid
and crashes login on some viewers.
---
OpenSim/Region/Framework/Scenes/Scene.cs | 1 +
OpenSim/Region/Framework/Scenes/ScenePresence.cs | 7 +++++--
2 files changed, 6 insertions(+), 2 deletions(-)
(limited to 'OpenSim/Region')
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index c99e37e..23006f2 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -2977,6 +2977,7 @@ namespace OpenSim.Region.Framework.Scenes
// start the scripts again (since this is done in RezAttachments()).
// XXX: This is convoluted.
sp.IsChildAgent = false;
+ sp.IsLoggingIn = true;
if (AttachmentsModule != null)
Util.FireAndForget(delegate(object o) { AttachmentsModule.RezAttachments(sp); });
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index cdba282..48212d0 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -607,6 +607,7 @@ namespace OpenSim.Region.Framework.Scenes
}
public bool IsChildAgent { get; set; }
+ public bool IsLoggingIn { get; set; }
///
/// If the avatar is sitting, the local ID of the prim that it's sitting on. If not sitting then zero.
@@ -743,6 +744,7 @@ namespace OpenSim.Region.Framework.Scenes
AttachmentsSyncLock = new Object();
AllowMovement = true;
IsChildAgent = true;
+ IsLoggingIn = false;
m_sendCoarseLocationsMethod = SendCoarseLocationsDefault;
Animator = new ScenePresenceAnimator(this);
PresenceType = type;
@@ -915,6 +917,7 @@ namespace OpenSim.Region.Framework.Scenes
else
{
IsChildAgent = false;
+ IsLoggingIn = false;
}
@@ -2541,13 +2544,13 @@ namespace OpenSim.Region.Framework.Scenes
// NOTE: Velocity is not the same as m_velocity. Velocity will attempt to
// grab the latest PhysicsActor velocity, whereas m_velocity is often
// storing a requested force instead of an actual traveling velocity
- if (Appearance.AvatarSize != m_lastSize)
+ if (Appearance.AvatarSize != m_lastSize && !IsLoggingIn)
{
m_lastSize = Appearance.AvatarSize;
SendAvatarDataToAllAgents();
}
- else if (!Rotation.ApproxEquals(m_lastRotation, ROTATION_TOLERANCE) ||
+ if (!Rotation.ApproxEquals(m_lastRotation, ROTATION_TOLERANCE) ||
!Velocity.ApproxEquals(m_lastVelocity, VELOCITY_TOLERANCE) ||
!m_pos.ApproxEquals(m_lastPosition, POSITION_TOLERANCE))
{
--
cgit v1.1
From fb088a48ac6cd737a25ce46f76e988879c0f0255 Mon Sep 17 00:00:00 2001
From: UbitUmarov
Date: Tue, 8 Jan 2013 14:09:01 +0000
Subject: also update m_lastSize in SendAvatarDataToAllAgents so more paths
update it
---
OpenSim/Region/Framework/Scenes/ScenePresence.cs | 2 ++
1 file changed, 2 insertions(+)
(limited to 'OpenSim/Region')
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index cdba282..a90bee4 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -2738,6 +2738,8 @@ namespace OpenSim.Region.Framework.Scenes
return;
}
+ m_lastSize = Appearance.AvatarSize;
+
int count = 0;
m_scene.ForEachScenePresence(delegate(ScenePresence scenePresence)
{
--
cgit v1.1
From 0aabb93ef3aa6217cb5f3312f864e46465204d48 Mon Sep 17 00:00:00 2001
From: Melanie
Date: Tue, 8 Jan 2013 14:00:40 +0100
Subject: Remove now superfluous update of m_lastSize
---
OpenSim/Region/Framework/Scenes/ScenePresence.cs | 3 ---
1 file changed, 3 deletions(-)
(limited to 'OpenSim/Region')
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 1c27202..a9195f7 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -2545,10 +2545,7 @@ namespace OpenSim.Region.Framework.Scenes
// grab the latest PhysicsActor velocity, whereas m_velocity is often
// storing a requested force instead of an actual traveling velocity
if (Appearance.AvatarSize != m_lastSize && !IsLoggingIn)
- {
- m_lastSize = Appearance.AvatarSize;
SendAvatarDataToAllAgents();
- }
if (!Rotation.ApproxEquals(m_lastRotation, ROTATION_TOLERANCE) ||
!Velocity.ApproxEquals(m_lastVelocity, VELOCITY_TOLERANCE) ||
--
cgit v1.1
From 0a393b317dd6449e5a4ebbfc41dd3c8f4d9b2092 Mon Sep 17 00:00:00 2001
From: Melanie
Date: Tue, 8 Jan 2013 22:32:39 +0100
Subject: Add the new UpdateAgentInformation cap to make maturity on more
recent viewers work.
---
.../Linden/Caps/BunchOfCaps/BunchOfCaps.cs | 19 +++++++++++++++++++
1 file changed, 19 insertions(+)
(limited to 'OpenSim/Region')
diff --git a/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs b/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs
index f6146a9..b06788b 100644
--- a/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs
+++ b/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs
@@ -103,6 +103,7 @@ namespace OpenSim.Region.ClientStack.Linden
private static readonly string m_getObjectPhysicsDataPath = "0101/";
private static readonly string m_getObjectCostPath = "0102/";
private static readonly string m_ResourceCostSelectedPath = "0103/";
+ private static readonly string m_UpdateAgentInformationPath = "0500/";
// These are callbacks which will be setup by the scene so that we can update scene data when we
@@ -287,6 +288,8 @@ namespace OpenSim.Region.ClientStack.Linden
m_HostCapsObj.RegisterHandler("GetObjectCost", getObjectCostHandler);
IRequestHandler ResourceCostSelectedHandler = new RestStreamHandler("POST", capsBase + m_ResourceCostSelectedPath, ResourceCostSelected);
m_HostCapsObj.RegisterHandler("ResourceCostSelected", ResourceCostSelectedHandler);
+ IRequestHandler UpdateAgentInformationHandler = new RestStreamHandler("POST", capsBase + m_UpdateAgentInformationPath, UpdateAgentInformation);
+ m_HostCapsObj.RegisterHandler("UpdateAgentInformation", UpdateAgentInformationHandler);
m_HostCapsObj.RegisterHandler(
"CopyInventoryFromNotecard",
@@ -1438,6 +1441,22 @@ namespace OpenSim.Region.ClientStack.Linden
string response = OSDParser.SerializeLLSDXmlString(resp);
return response;
}
+
+ public string UpdateAgentInformation(string request, string path,
+ string param, IOSHttpRequest httpRequest,
+ IOSHttpResponse httpResponse)
+ {
+ OSDMap req = (OSDMap)OSDParser.DeserializeLLSDXml(request);
+ OSDMap resp = new OSDMap();
+
+ OSDMap accessPrefs = new OSDMap();
+ accessPrefs["max"] = "A";
+
+ resp["access_prefs"] = accessPrefs;
+
+ string response = OSDParser.SerializeLLSDXmlString(resp);
+ return response;
+ }
}
public class AssetUploader
--
cgit v1.1
From ab053df706055b0aa8fe2d10f89488be97d36841 Mon Sep 17 00:00:00 2001
From: Melanie
Date: Tue, 8 Jan 2013 23:01:09 +0100
Subject: Prevent empty Anim Packs
---
OpenSim/Region/Framework/Scenes/Animation/AnimationSet.cs | 12 ++++++++++++
1 file changed, 12 insertions(+)
(limited to 'OpenSim/Region')
diff --git a/OpenSim/Region/Framework/Scenes/Animation/AnimationSet.cs b/OpenSim/Region/Framework/Scenes/Animation/AnimationSet.cs
index 65ae445..d2fc7f1 100644
--- a/OpenSim/Region/Framework/Scenes/Animation/AnimationSet.cs
+++ b/OpenSim/Region/Framework/Scenes/Animation/AnimationSet.cs
@@ -164,7 +164,13 @@ namespace OpenSim.Region.Framework.Scenes.Animation
{
int defaultSize = 0;
if (m_defaultAnimation.AnimID != UUID.Zero)
+ {
+ defaultSize++;
+ }
+ else if (m_animations.Count == 0)
+ {
defaultSize++;
+ }
animIDs = new UUID[m_animations.Count + defaultSize];
sequenceNums = new int[m_animations.Count + defaultSize];
@@ -176,6 +182,12 @@ namespace OpenSim.Region.Framework.Scenes.Animation
sequenceNums[0] = m_defaultAnimation.SequenceNum;
objectIDs[0] = m_defaultAnimation.ObjectID;
}
+ else if (m_animations.Count == 0)
+ {
+ animIDs[0] = m_implicitDefaultAnimation.AnimID;
+ sequenceNums[0] = m_defaultAnimation.SequenceNum;
+ objectIDs[0] = m_implicitDefaultAnimation.ObjectID;
+ }
for (int i = 0; i < m_animations.Count; ++i)
{
--
cgit v1.1
From 8f37f2ca7edd408f30165fef9817375a9813ce90 Mon Sep 17 00:00:00 2001
From: Melanie
Date: Tue, 8 Jan 2013 23:24:34 +0100
Subject: Fix sequence id fr default anim
---
OpenSim/Region/Framework/Scenes/Animation/AnimationSet.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
(limited to 'OpenSim/Region')
diff --git a/OpenSim/Region/Framework/Scenes/Animation/AnimationSet.cs b/OpenSim/Region/Framework/Scenes/Animation/AnimationSet.cs
index d2fc7f1..64c31f8 100644
--- a/OpenSim/Region/Framework/Scenes/Animation/AnimationSet.cs
+++ b/OpenSim/Region/Framework/Scenes/Animation/AnimationSet.cs
@@ -185,7 +185,7 @@ namespace OpenSim.Region.Framework.Scenes.Animation
else if (m_animations.Count == 0)
{
animIDs[0] = m_implicitDefaultAnimation.AnimID;
- sequenceNums[0] = m_defaultAnimation.SequenceNum;
+ sequenceNums[0] = m_implicitDefaultAnimation.SequenceNum;
objectIDs[0] = m_implicitDefaultAnimation.ObjectID;
}
--
cgit v1.1
From be844030ce75907a85ff00cdac4d9b706ccc3101 Mon Sep 17 00:00:00 2001
From: Melanie
Date: Wed, 9 Jan 2013 00:10:57 +0100
Subject: Revert "Fix sequence id fr default anim"
This reverts commit 8f37f2ca7edd408f30165fef9817375a9813ce90.
---
OpenSim/Region/Framework/Scenes/Animation/AnimationSet.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
(limited to 'OpenSim/Region')
diff --git a/OpenSim/Region/Framework/Scenes/Animation/AnimationSet.cs b/OpenSim/Region/Framework/Scenes/Animation/AnimationSet.cs
index 64c31f8..d2fc7f1 100644
--- a/OpenSim/Region/Framework/Scenes/Animation/AnimationSet.cs
+++ b/OpenSim/Region/Framework/Scenes/Animation/AnimationSet.cs
@@ -185,7 +185,7 @@ namespace OpenSim.Region.Framework.Scenes.Animation
else if (m_animations.Count == 0)
{
animIDs[0] = m_implicitDefaultAnimation.AnimID;
- sequenceNums[0] = m_implicitDefaultAnimation.SequenceNum;
+ sequenceNums[0] = m_defaultAnimation.SequenceNum;
objectIDs[0] = m_implicitDefaultAnimation.ObjectID;
}
--
cgit v1.1
From 92db4ef0686d0cce11cf23de926352ace0104bb7 Mon Sep 17 00:00:00 2001
From: Melanie
Date: Wed, 9 Jan 2013 00:11:08 +0100
Subject: Revert "Prevent empty Anim Packs"
This reverts commit ab053df706055b0aa8fe2d10f89488be97d36841.
---
OpenSim/Region/Framework/Scenes/Animation/AnimationSet.cs | 12 ------------
1 file changed, 12 deletions(-)
(limited to 'OpenSim/Region')
diff --git a/OpenSim/Region/Framework/Scenes/Animation/AnimationSet.cs b/OpenSim/Region/Framework/Scenes/Animation/AnimationSet.cs
index d2fc7f1..65ae445 100644
--- a/OpenSim/Region/Framework/Scenes/Animation/AnimationSet.cs
+++ b/OpenSim/Region/Framework/Scenes/Animation/AnimationSet.cs
@@ -164,13 +164,7 @@ namespace OpenSim.Region.Framework.Scenes.Animation
{
int defaultSize = 0;
if (m_defaultAnimation.AnimID != UUID.Zero)
- {
- defaultSize++;
- }
- else if (m_animations.Count == 0)
- {
defaultSize++;
- }
animIDs = new UUID[m_animations.Count + defaultSize];
sequenceNums = new int[m_animations.Count + defaultSize];
@@ -182,12 +176,6 @@ namespace OpenSim.Region.Framework.Scenes.Animation
sequenceNums[0] = m_defaultAnimation.SequenceNum;
objectIDs[0] = m_defaultAnimation.ObjectID;
}
- else if (m_animations.Count == 0)
- {
- animIDs[0] = m_implicitDefaultAnimation.AnimID;
- sequenceNums[0] = m_defaultAnimation.SequenceNum;
- objectIDs[0] = m_implicitDefaultAnimation.ObjectID;
- }
for (int i = 0; i < m_animations.Count; ++i)
{
--
cgit v1.1
From 27b0914681f715d2dd270030ac1bfa5f726bf787 Mon Sep 17 00:00:00 2001
From: Melanie
Date: Wed, 9 Jan 2013 16:01:00 +0100
Subject: Prevent a null ref in llGetLinkPrimiteveParams. Still not a fix for
the real issue.
---
OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
(limited to 'OpenSim/Region')
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index 7e77b0f..267a175 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -8750,7 +8750,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
remaining = GetPrimParams(avatar, rules, ref res);
}
- if (remaining != null && remaining.Length > 0)
+ if ((object)remaining != null && remaining.Length > 0)
{
linknumber = remaining.GetLSLIntegerItem(0);
rules = remaining.GetSublist(1, -1);
--
cgit v1.1
From b5282810180a548d0c29892a38388c379105c13b Mon Sep 17 00:00:00 2001
From: UbitUmarov
Date: Wed, 9 Jan 2013 17:01:09 +0000
Subject: stop endless loop in lGetLinkPrimitiveParams
---
OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | 2 ++
1 file changed, 2 insertions(+)
(limited to 'OpenSim/Region')
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index 267a175..faa92dc 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -8755,6 +8755,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
linknumber = remaining.GetLSLIntegerItem(0);
rules = remaining.GetSublist(1, -1);
}
+ else
+ break;
}
return res;
--
cgit v1.1
From b70d50edf25aaef63292fa164e01ebb69025744b Mon Sep 17 00:00:00 2001
From: UbitUmarov
Date: Wed, 9 Jan 2013 17:59:32 +0000
Subject: fix llGetRot and parameters prim_rotation for attachments. Only on
LSL_api to avoid side effects for now
---
.../Shared/Api/Implementation/LSL_Api.cs | 28 +++++++++++++++++++++-
1 file changed, 27 insertions(+), 1 deletion(-)
(limited to 'OpenSim/Region')
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index faa92dc..0dfcfd6 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -2443,6 +2443,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
m_host.AddScriptLPS(1);
Quaternion q = m_host.GetWorldRotation();
+
+ if (m_host.ParentGroup != null && m_host.ParentGroup.AttachmentPoint != 0)
+ {
+ ScenePresence avatar = World.GetScenePresence(m_host.ParentGroup.AttachedAvatar);
+ if (avatar != null)
+ {
+ if ((avatar.AgentControlFlags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_MOUSELOOK) != 0)
+ q = avatar.CameraRotation * q; // Mouselook
+ else
+ q = avatar.Rotation * q; // Currently infrequently updated so may be inaccurate
+ }
+ }
+
return new LSL_Rotation(q.X, q.Y, q.Z, q.W);
}
@@ -2468,7 +2481,20 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
q = part.ParentGroup.GroupRotation; // just the group rotation
return new LSL_Rotation(q.X, q.Y, q.Z, q.W);
}
+
q = part.GetWorldRotation();
+ if (part.ParentGroup.AttachmentPoint != 0)
+ {
+ ScenePresence avatar = World.GetScenePresence(part.ParentGroup.AttachedAvatar);
+ if (avatar != null)
+ {
+ if ((avatar.AgentControlFlags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_MOUSELOOK) != 0)
+ q = avatar.CameraRotation * q; // Mouselook
+ else
+ q = avatar.Rotation * q; // Currently infrequently updated so may be inaccurate
+ }
+ }
+
return new LSL_Rotation(q.X, q.Y, q.Z, q.W);
}
@@ -8709,7 +8735,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
LSL_List remaining = GetPrimParams(m_host, rules, ref result);
- while (remaining != null && remaining.Length > 2)
+ while ((object)remaining != null && remaining.Length > 2)
{
int linknumber = remaining.GetLSLIntegerItem(0);
rules = remaining.GetSublist(1, -1);
--
cgit v1.1
From 949da1d4af77247786b00041bc0d1732617b7286 Mon Sep 17 00:00:00 2001
From: Melanie
Date: Wed, 9 Jan 2013 20:07:21 +0100
Subject: Change IsRoot to use ReferenceEquals to prevent operator == messiness
---
OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
(limited to 'OpenSim/Region')
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index 2191cfa..b62667f 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
@@ -144,7 +144,7 @@ namespace OpenSim.Region.Framework.Scenes
///
public bool IsRoot
{
- get { return ParentGroup.RootPart == this; }
+ get { return Object.ReferenceEquals(ParentGroup.RootPart, this); }
}
///
--
cgit v1.1