diff options
Diffstat (limited to 'OpenSim/Region/Framework')
-rw-r--r-- | OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 82 |
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 |