diff --git a/OpenSim/Framework/MapAndArray.cs b/OpenSim/Framework/MapAndArray.cs
index 41874d0462..e6b2800e64 100644
--- a/OpenSim/Framework/MapAndArray.cs
+++ b/OpenSim/Framework/MapAndArray.cs
@@ -173,6 +173,8 @@ namespace OpenSim.Framework
{
if (m_array == null)
{
+ if(m_dict.Count == 0)
+ return new TValue[0];
m_array = new TValue[m_dict.Count];
m_dict.Values.CopyTo(m_array, 0);
}
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index 4ab0f15dcf..13b3ffb23e 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
@@ -248,11 +248,7 @@ namespace OpenSim.Region.Framework.Scenes
public scriptEvents AggregateScriptEvents;
- public Vector3 AttachedPos
- {
- get;
- set;
- }
+ public Vector3 AttachedPos { get; set; }
// rotation locks on local X,Y and or Z axis bit flags
// bits are as in llSetStatus defined in SceneObjectGroup.axisSelect enum
@@ -955,13 +951,6 @@ namespace OpenSim.Region.Framework.Scenes
m_log.Error("[SCENEOBJECTPART]: ROTATIONOFFSET" + ex.Message);
}
}
-
-// float roll, pitch, yaw = 0;
-// m_rotationOffset.GetEulerAngles(out roll, out pitch, out yaw);
-//
-// m_log.DebugFormat(
-// "[SCENE OBJECT PART]: Set euler {0} for RotationOffset on {1} {2}",
-// new Vector3(roll, pitch, yaw), Name, LocalId);
}
}
@@ -2266,7 +2255,8 @@ namespace OpenSim.Region.Framework.Scenes
dupe.KeyframeMotion = null;
dupe.PayPrice = (int[])PayPrice.Clone();
- dupe.DynAttrs.CopyFrom(DynAttrs);
+ if(DynAttrs != null)
+ dupe.DynAttrs.CopyFrom(DynAttrs);
if (userExposed)
{
@@ -3834,7 +3824,7 @@ namespace OpenSim.Region.Framework.Scenes
texcolor.A = clippedAlpha;
}
tex.FaceTextures[face].RGBA = texcolor;
- UpdateTextureEntry(tex.GetBytes());
+ UpdateTextureEntry(tex);
return;
}
else if (face == ALL_SIDES)
@@ -3863,7 +3853,7 @@ namespace OpenSim.Region.Framework.Scenes
}
tex.DefaultTexture.RGBA = texcolor;
}
- UpdateTextureEntry(tex.GetBytes());
+ UpdateTextureEntry(tex);
return;
}
}
@@ -5178,15 +5168,7 @@ namespace OpenSim.Region.Framework.Scenes
///
public void UpdateTextureEntry(byte[] serializedTextureEntry)
{
- UpdateTextureEntry(new Primitive.TextureEntry(serializedTextureEntry, 0, serializedTextureEntry.Length));
- }
-
- ///
- /// Update the texture entry for this part.
- ///
- ///
- public void UpdateTextureEntry(Primitive.TextureEntry newTex)
- {
+ Primitive.TextureEntry newTex = new Primitive.TextureEntry(serializedTextureEntry, 0, serializedTextureEntry.Length);
Primitive.TextureEntry oldTex = Shape.Textures;
Changed changeFlags = 0;
@@ -5215,7 +5197,7 @@ namespace OpenSim.Region.Framework.Scenes
bool otherFieldsChanged = false;
int nsides = GetNumberOfSides();
- for (int i = 0 ; i < nsides; i++)
+ for (int i = 0; i < nsides; i++)
{
Primitive.TextureEntryFace newFace = defaultNewFace;
Primitive.TextureEntryFace oldFace = defaultOldFace;
@@ -5253,7 +5235,7 @@ namespace OpenSim.Region.Framework.Scenes
if (oldFace.Rotation != newFace.Rotation) otherFieldsChanged = true;
if (oldFace.Shiny != newFace.Shiny) otherFieldsChanged = true;
if (oldFace.TexMapType != newFace.TexMapType) otherFieldsChanged = true;
- if(otherFieldsChanged)
+ if (otherFieldsChanged)
changeFlags |= Changed.TEXTURE;
}
}
@@ -5264,6 +5246,36 @@ namespace OpenSim.Region.Framework.Scenes
TriggerScriptChangedEvent(changeFlags);
ParentGroup.HasGroupChanged = true;
ScheduleFullUpdate();
+
+ }
+
+ ///
+ /// Update the texture entry for this part.
+ ///
+ ///
+ public void UpdateTextureEntry(Primitive.TextureEntry newTex)
+ {
+ TextureAttributes dirty = newTex.GetDirtyFlags(32, true);
+ dirty &= ~TextureAttributes.MaterialID;
+ if(dirty == TextureAttributes.None)
+ return;
+
+ Changed changeFlags = 0;
+ if((dirty & TextureAttributes.RGBA) != 0)
+ {
+ changeFlags = Changed.COLOR;
+ dirty &= ~TextureAttributes.RGBA;
+ }
+ if (dirty != TextureAttributes.None)
+ changeFlags |= Changed.TEXTURE;
+
+ if (changeFlags == 0)
+ return;
+
+ m_shape.TextureEntry = newTex.GetBytes();
+ TriggerScriptChangedEvent(changeFlags);
+ ParentGroup.HasGroupChanged = true;
+ ScheduleFullUpdate();
}
internal void UpdatePhysicsSubscribedEvents()
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index 22443a9f80..2969060744 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -1947,7 +1947,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
texcolor.G = Util.Clip((float)color.y, 0.0f, 1.0f);
texcolor.B = Util.Clip((float)color.z, 0.0f, 1.0f);
tex.FaceTextures[face].RGBA = texcolor;
- part.UpdateTextureEntry(tex.GetBytes());
+ part.UpdateTextureEntry(tex);
return;
}
else if (face == ScriptBaseClass.ALL_SIDES)
@@ -1968,7 +1968,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
texcolor.B = Util.Clip((float)color.z, 0.0f, 1.0f);
tex.DefaultTexture.RGBA = texcolor;
}
- part.UpdateTextureEntry(tex.GetBytes());
+ part.UpdateTextureEntry(tex);
return;
}
@@ -2069,7 +2069,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
{
tex.CreateFace((uint) face);
tex.FaceTextures[face].TexMapType = textype;
- part.UpdateTextureEntry(tex.GetBytes());
+ part.UpdateTextureEntry(tex);
return;
}
else if (face == ScriptBaseClass.ALL_SIDES)
@@ -2080,9 +2080,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
{
tex.FaceTextures[i].TexMapType = textype;
}
- tex.DefaultTexture.TexMapType = textype;
}
- part.UpdateTextureEntry(tex.GetBytes());
+ tex.DefaultTexture.TexMapType = textype;
+ part.UpdateTextureEntry(tex);
return;
}
}
@@ -2099,7 +2099,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
{
tex.CreateFace((uint) face);
tex.FaceTextures[face].Glow = glow;
- part.UpdateTextureEntry(tex.GetBytes());
+ part.UpdateTextureEntry(tex);
return;
}
else if (face == ScriptBaseClass.ALL_SIDES)
@@ -2110,9 +2110,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
{
tex.FaceTextures[i].Glow = glow;
}
- tex.DefaultTexture.Glow = glow;
}
- part.UpdateTextureEntry(tex.GetBytes());
+ tex.DefaultTexture.Glow = glow;
+ part.UpdateTextureEntry(tex);
return;
}
}
@@ -2151,7 +2151,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
tex.CreateFace((uint) face);
tex.FaceTextures[face].Shiny = sval;
tex.FaceTextures[face].Bump = bump;
- part.UpdateTextureEntry(tex.GetBytes());
+ part.UpdateTextureEntry(tex);
return;
}
else if (face == ScriptBaseClass.ALL_SIDES)
@@ -2163,10 +2163,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
tex.FaceTextures[i].Shiny = sval;
tex.FaceTextures[i].Bump = bump;
}
- tex.DefaultTexture.Shiny = sval;
- tex.DefaultTexture.Bump = bump;
}
- part.UpdateTextureEntry(tex.GetBytes());
+ tex.DefaultTexture.Shiny = sval;
+ tex.DefaultTexture.Bump = bump;
+ part.UpdateTextureEntry(tex);
return;
}
}
@@ -2182,7 +2182,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
{
tex.CreateFace((uint) face);
tex.FaceTextures[face].Fullbright = bright;
- part.UpdateTextureEntry(tex.GetBytes());
+ part.UpdateTextureEntry(tex);
return;
}
else if (face == ScriptBaseClass.ALL_SIDES)
@@ -2195,7 +2195,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
}
}
tex.DefaultTexture.Fullbright = bright;
- part.UpdateTextureEntry(tex.GetBytes());
+ part.UpdateTextureEntry(tex);
return;
}
}
@@ -2263,7 +2263,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
texcolor = tex.CreateFace((uint)face).RGBA;
texcolor.A = Util.Clip((float)alpha, 0.0f, 1.0f);
tex.FaceTextures[face].RGBA = texcolor;
- part.UpdateTextureEntry(tex.GetBytes());
+ part.UpdateTextureEntry(tex);
return;
}
else if (face == ScriptBaseClass.ALL_SIDES)
@@ -2287,7 +2287,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
tex.DefaultTexture.RGBA = texcolor;
}
- part.UpdateTextureEntry(tex.GetBytes());
+ part.UpdateTextureEntry(tex);
return;
}
}
@@ -2464,7 +2464,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
Primitive.TextureEntryFace texface = tex.CreateFace((uint)face);
texface.TextureID = textureID;
tex.FaceTextures[face] = texface;
- part.UpdateTextureEntry(tex.GetBytes());
+ part.UpdateTextureEntry(tex);
return;
}
else if (face == ScriptBaseClass.ALL_SIDES)
@@ -2477,7 +2477,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
}
}
tex.DefaultTexture.TextureID = textureID;
- part.UpdateTextureEntry(tex.GetBytes());
+ part.UpdateTextureEntry(tex);
return;
}
}
@@ -2504,7 +2504,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
texface.RepeatU = (float)u;
texface.RepeatV = (float)v;
tex.FaceTextures[face] = texface;
- part.UpdateTextureEntry(tex.GetBytes());
+ part.UpdateTextureEntry(tex);
return;
}
if (face == ScriptBaseClass.ALL_SIDES)
@@ -2519,7 +2519,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
}
tex.DefaultTexture.RepeatU = (float)u;
tex.DefaultTexture.RepeatV = (float)v;
- part.UpdateTextureEntry(tex.GetBytes());
+ part.UpdateTextureEntry(tex);
return;
}
}
@@ -2545,7 +2545,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
texface.OffsetU = (float)u;
texface.OffsetV = (float)v;
tex.FaceTextures[face] = texface;
- part.UpdateTextureEntry(tex.GetBytes());
+ part.UpdateTextureEntry(tex);
return;
}
if (face == ScriptBaseClass.ALL_SIDES)
@@ -2560,7 +2560,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
}
tex.DefaultTexture.OffsetU = (float)u;
tex.DefaultTexture.OffsetV = (float)v;
- part.UpdateTextureEntry(tex.GetBytes());
+ part.UpdateTextureEntry(tex);
return;
}
}
@@ -2585,7 +2585,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
Primitive.TextureEntryFace texface = tex.CreateFace((uint)face);
texface.Rotation = (float)rotation;
tex.FaceTextures[face] = texface;
- part.UpdateTextureEntry(tex.GetBytes());
+ part.UpdateTextureEntry(tex);
return;
}
if (face == ScriptBaseClass.ALL_SIDES)
@@ -2598,7 +2598,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
}
}
tex.DefaultTexture.Rotation = (float)rotation;
- part.UpdateTextureEntry(tex.GetBytes());
+ part.UpdateTextureEntry(tex);
return;
}
}
@@ -13110,6 +13110,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
ParcelMediaCommandEnum? commandToSend = null;
float time = 0.0f; // default is from start
+ uint cmndFlags = 0;
ScenePresence presence = null;
int cmd;
for (int i = 0; i < commandList.Data.Length; i++)
@@ -13142,19 +13143,28 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
case ParcelMediaCommandEnum.Loop:
loop = 1;
+ cmndFlags |= (1 << ScriptBaseClass.PARCEL_MEDIA_COMMAND_LOOP);
commandToSend = command;
update = true; //need to send the media update packet to set looping
break;
case ParcelMediaCommandEnum.Play:
loop = 0;
+ cmndFlags |= (1 << ScriptBaseClass.PARCEL_MEDIA_COMMAND_PLAY);
commandToSend = command;
update = true; //need to send the media update packet to make sure it doesn't loop
break;
case ParcelMediaCommandEnum.Pause:
+ cmndFlags |= (1 << ScriptBaseClass.PARCEL_MEDIA_COMMAND_PAUSE);
+ commandToSend = command;
+ break;
case ParcelMediaCommandEnum.Stop:
+ cmndFlags |= (1 << ScriptBaseClass.PARCEL_MEDIA_COMMAND_STOP);
+ commandToSend = command;
+ break;
case ParcelMediaCommandEnum.Unload:
+ cmndFlags |= (1 << ScriptBaseClass.PARCEL_MEDIA_COMMAND_UNLOAD);
commandToSend = command;
break;
@@ -13190,6 +13200,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
if (commandList.Data[i + 1] is LSL_Float)
{
time = (float)(LSL_Float)commandList.Data[i + 1];
+ cmndFlags |= (1 << ScriptBaseClass.PARCEL_MEDIA_COMMAND_TIME);
}
else Error("llParcelMediaCommandList", "The argument of PARCEL_MEDIA_COMMAND_TIME must be a float");
++i;
@@ -13316,14 +13327,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
{
if (sp.currentParcelUUID == landData.GlobalID)
{
- sp.ControllingClient.SendParcelMediaCommand(0x4, // TODO what is this?
+ sp.ControllingClient.SendParcelMediaCommand(cmndFlags,
commandToSend.Value, time);
}
});
}
else if (!presence.IsChildAgent)
{
- presence.ControllingClient.SendParcelMediaCommand(0x4, // TODO what is this?
+ presence.ControllingClient.SendParcelMediaCommand(cmndFlags,
commandToSend.Value, time);
}
}
@@ -13334,6 +13345,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
{
m_host.AddScriptLPS(1);
LSL_List list = new LSL_List();
+ Vector3 pos = m_host.AbsolutePosition;
+
+ ILandObject landObject = World.LandChannel.GetLandObject(pos);
+ if(landObject == null)
+ return list;
+
+ if (!World.Permissions.CanEditParcelProperties(m_host.OwnerID, landObject, GroupPowers.ChangeMedia, false))
+ return list;
+
+ LandData land = landObject.LandData;
+ if(land == null)
+ return list;
+
//TO DO: make the implementation for the missing commands
//PARCEL_MEDIA_COMMAND_LOOP_SET float loop Use this to get or set the parcel's media loop duration. (1.19.1 RC0 or later)
for (int i = 0; i < aList.Data.Length; i++)
@@ -13344,27 +13368,26 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
switch ((ParcelMediaCommandEnum) Convert.ToInt32(aList.Data[i].ToString()))
{
case ParcelMediaCommandEnum.Url:
- list.Add(new LSL_String(World.GetLandData(m_host.AbsolutePosition).MediaURL));
+ list.Add(new LSL_String(land.MediaURL));
break;
case ParcelMediaCommandEnum.Desc:
- list.Add(new LSL_String(World.GetLandData(m_host.AbsolutePosition).Description));
+ list.Add(new LSL_String(land.MediaDescription));
break;
case ParcelMediaCommandEnum.Texture:
- list.Add(new LSL_String(World.GetLandData(m_host.AbsolutePosition).MediaID.ToString()));
+ list.Add(new LSL_String(land.MediaID.ToString()));
break;
case ParcelMediaCommandEnum.Type:
- list.Add(new LSL_String(World.GetLandData(m_host.AbsolutePosition).MediaType));
+ list.Add(new LSL_String(land.MediaType));
break;
case ParcelMediaCommandEnum.Size:
- list.Add(new LSL_String(World.GetLandData(m_host.AbsolutePosition).MediaWidth));
- list.Add(new LSL_String(World.GetLandData(m_host.AbsolutePosition).MediaHeight));
+ list.Add(new LSL_String(land.MediaWidth));
+ list.Add(new LSL_String(land.MediaHeight));
break;
default:
ParcelMediaCommandEnum mediaCommandEnum = ParcelMediaCommandEnum.Url;
NotImplemented("llParcelMediaQuery", "Parameter not supported yet: " + Enum.Parse(mediaCommandEnum.GetType() , aList.Data[i].ToString()).ToString());
break;
}
-
}
}
ScriptSleep(m_sleepMsOnParcelMediaQuery);
diff --git a/bin/OpenMetaverse.Rendering.Meshmerizer.dll b/bin/OpenMetaverse.Rendering.Meshmerizer.dll
index ae79057b62..d416048210 100755
Binary files a/bin/OpenMetaverse.Rendering.Meshmerizer.dll and b/bin/OpenMetaverse.Rendering.Meshmerizer.dll differ
diff --git a/bin/OpenMetaverse.StructuredData.dll b/bin/OpenMetaverse.StructuredData.dll
index ff7b4f6ade..8131e5c03d 100755
Binary files a/bin/OpenMetaverse.StructuredData.dll and b/bin/OpenMetaverse.StructuredData.dll differ
diff --git a/bin/OpenMetaverse.dll b/bin/OpenMetaverse.dll
index e39a4d4972..44bd2adbce 100755
Binary files a/bin/OpenMetaverse.dll and b/bin/OpenMetaverse.dll differ
diff --git a/bin/OpenMetaverseTypes.dll b/bin/OpenMetaverseTypes.dll
index ca1017b190..2c3e778e40 100755
Binary files a/bin/OpenMetaverseTypes.dll and b/bin/OpenMetaverseTypes.dll differ