aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/Framework/Scenes/SceneObjectPart.cs')
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneObjectPart.cs82
1 files changed, 42 insertions, 40 deletions
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index dcbcfa3..c8b39a4 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
@@ -3178,7 +3178,10 @@ namespace OpenSim.Region.Framework.Scenes
3178 /// <param name="face"></param> 3178 /// <param name="face"></param>
3179 public void SetFaceColor(Vector3 color, int face) 3179 public void SetFaceColor(Vector3 color, int face)
3180 { 3180 {
3181 Primitive.TextureEntry tex = Shape.Textures; 3181 // The only way to get a deep copy/ If we don't do this, we can
3182 // mever detect color changes further down.
3183 Byte[] buf = Shape.Textures.GetBytes();
3184 Primitive.TextureEntry tex = new Primitive.TextureEntry(buf, 0, buf.Length);
3182 Color4 texcolor; 3185 Color4 texcolor;
3183 if (face >= 0 && face < GetNumberOfSides()) 3186 if (face >= 0 && face < GetNumberOfSides())
3184 { 3187 {
@@ -3187,8 +3190,7 @@ namespace OpenSim.Region.Framework.Scenes
3187 texcolor.G = Util.Clip((float)color.Y, 0.0f, 1.0f); 3190 texcolor.G = Util.Clip((float)color.Y, 0.0f, 1.0f);
3188 texcolor.B = Util.Clip((float)color.Z, 0.0f, 1.0f); 3191 texcolor.B = Util.Clip((float)color.Z, 0.0f, 1.0f);
3189 tex.FaceTextures[face].RGBA = texcolor; 3192 tex.FaceTextures[face].RGBA = texcolor;
3190 UpdateTexture(tex); 3193 UpdateTextureEntry(tex.GetBytes());
3191 TriggerScriptChangedEvent(Changed.COLOR);
3192 return; 3194 return;
3193 } 3195 }
3194 else if (face == ALL_SIDES) 3196 else if (face == ALL_SIDES)
@@ -3209,8 +3211,7 @@ namespace OpenSim.Region.Framework.Scenes
3209 texcolor.B = Util.Clip((float)color.Z, 0.0f, 1.0f); 3211 texcolor.B = Util.Clip((float)color.Z, 0.0f, 1.0f);
3210 tex.DefaultTexture.RGBA = texcolor; 3212 tex.DefaultTexture.RGBA = texcolor;
3211 } 3213 }
3212 UpdateTexture(tex); 3214 UpdateTextureEntry(tex.GetBytes());
3213 TriggerScriptChangedEvent(Changed.COLOR);
3214 return; 3215 return;
3215 } 3216 }
3216 } 3217 }
@@ -4538,48 +4539,49 @@ namespace OpenSim.Region.Framework.Scenes
4538 } 4539 }
4539 4540
4540 /// <summary> 4541 /// <summary>
4541 /// Update the textures on the part.
4542 /// </summary>
4543 /// <remarks>
4544 /// Added to handle bug in libsecondlife's TextureEntry.ToBytes()
4545 /// not handling RGBA properly. Cycles through, and "fixes" the color
4546 /// info
4547 /// </remarks>
4548 /// <param name="tex"></param>
4549 public void UpdateTexture(Primitive.TextureEntry tex)
4550 {
4551 //Color4 tmpcolor;
4552 //for (uint i = 0; i < 32; i++)
4553 //{
4554 // if (tex.FaceTextures[i] != null)
4555 // {
4556 // tmpcolor = tex.GetFace((uint) i).RGBA;
4557 // tmpcolor.A = tmpcolor.A*255;
4558 // tmpcolor.R = tmpcolor.R*255;
4559 // tmpcolor.G = tmpcolor.G*255;
4560 // tmpcolor.B = tmpcolor.B*255;
4561 // tex.FaceTextures[i].RGBA = tmpcolor;
4562 // }
4563 //}
4564 //tmpcolor = tex.DefaultTexture.RGBA;
4565 //tmpcolor.A = tmpcolor.A*255;
4566 //tmpcolor.R = tmpcolor.R*255;
4567 //tmpcolor.G = tmpcolor.G*255;
4568 //tmpcolor.B = tmpcolor.B*255;
4569 //tex.DefaultTexture.RGBA = tmpcolor;
4570 UpdateTextureEntry(tex.GetBytes());
4571 }
4572
4573 /// <summary>
4574 /// Update the texture entry for this part. 4542 /// Update the texture entry for this part.
4575 /// </summary> 4543 /// </summary>
4576 /// <param name="textureEntry"></param> 4544 /// <param name="textureEntry"></param>
4577 public void UpdateTextureEntry(byte[] textureEntry) 4545 public void UpdateTextureEntry(byte[] textureEntry)
4578 { 4546 {
4579 m_shape.TextureEntry = textureEntry; 4547 Primitive.TextureEntry newTex = new Primitive.TextureEntry(textureEntry, 0, textureEntry.Length);
4580 TriggerScriptChangedEvent(Changed.TEXTURE); 4548 Primitive.TextureEntry oldTex = Shape.Textures;
4549
4550 Changed changeFlags = 0;
4581 4551
4552 for (int i = 0 ; i < GetNumberOfSides(); i++)
4553 {
4554 Primitive.TextureEntryFace newFace = newTex.DefaultTexture;
4555 Primitive.TextureEntryFace oldFace = oldTex.DefaultTexture;
4556
4557 if (oldTex.FaceTextures[i] != null)
4558 oldFace = oldTex.FaceTextures[i];
4559 if (newTex.FaceTextures[i] != null)
4560 newFace = newTex.FaceTextures[i];
4561
4562 Color4 oldRGBA = oldFace.RGBA;
4563 Color4 newRGBA = newFace.RGBA;
4564
4565 if (oldRGBA.R != newRGBA.R ||
4566 oldRGBA.G != newRGBA.G ||
4567 oldRGBA.B != newRGBA.B ||
4568 oldRGBA.A != newRGBA.A)
4569 changeFlags |= Changed.COLOR;
4570
4571 if (oldFace.TextureID != newFace.TextureID)
4572 changeFlags |= Changed.TEXTURE;
4573
4574 // Max change, skip the rest of testing
4575 if (changeFlags == (Changed.TEXTURE | Changed.COLOR))
4576 break;
4577 }
4578
4579 m_shape.TextureEntry = textureEntry;
4580 if (changeFlags != 0)
4581 TriggerScriptChangedEvent(changeFlags);
4582 UpdateFlag = UpdateRequired.FULL;
4582 ParentGroup.HasGroupChanged = true; 4583 ParentGroup.HasGroupChanged = true;
4584
4583 //This is madness.. 4585 //This is madness..
4584 //ParentGroup.ScheduleGroupForFullUpdate(); 4586 //ParentGroup.ScheduleGroupForFullUpdate();
4585 //This is sparta 4587 //This is sparta