aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorJustin Clark-Casey (justincc)2011-07-16 01:36:27 +0100
committerJustin Clark-Casey (justincc)2011-07-16 01:36:27 +0100
commit18652eb87ef0613b66664059581f991448d76af4 (patch)
treed0ca27e3ccaed6d82d56e8431136ebf4ccb6df63
parentuse constants in llGetObjectDetails() rather than magic numbers (diff)
downloadopensim-SC-18652eb87ef0613b66664059581f991448d76af4.zip
opensim-SC-18652eb87ef0613b66664059581f991448d76af4.tar.gz
opensim-SC-18652eb87ef0613b66664059581f991448d76af4.tar.bz2
opensim-SC-18652eb87ef0613b66664059581f991448d76af4.tar.xz
Fix physics proxy regeneration when a mesh with more than one submesh is resized
Addresses http://opensimulator.org/mantis/view.php?id=5584
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs12
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneObjectPart.cs9
-rw-r--r--OpenSim/Region/Physics/Meshing/Meshmerizer.cs5
-rw-r--r--OpenSim/Region/Physics/OdePlugin/ODEPrim.cs1
4 files changed, 25 insertions, 2 deletions
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index 0fbd746..fd5f1b0 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -2662,13 +2662,18 @@ namespace OpenSim.Region.Framework.Scenes
2662 SceneObjectPart part = GetChildPart(localID); 2662 SceneObjectPart part = GetChildPart(localID);
2663 if (part != null) 2663 if (part != null)
2664 { 2664 {
2665// m_log.DebugFormat(
2666// "[SCENE OBJECT GROUP]: Group resizing {0} {1} from {2} to {3}", Name, localID, part.Scale, scale);
2667
2665 part.IgnoreUndoUpdate = true; 2668 part.IgnoreUndoUpdate = true;
2669
2666 if (scale.X > m_scene.m_maxNonphys) 2670 if (scale.X > m_scene.m_maxNonphys)
2667 scale.X = m_scene.m_maxNonphys; 2671 scale.X = m_scene.m_maxNonphys;
2668 if (scale.Y > m_scene.m_maxNonphys) 2672 if (scale.Y > m_scene.m_maxNonphys)
2669 scale.Y = m_scene.m_maxNonphys; 2673 scale.Y = m_scene.m_maxNonphys;
2670 if (scale.Z > m_scene.m_maxNonphys) 2674 if (scale.Z > m_scene.m_maxNonphys)
2671 scale.Z = m_scene.m_maxNonphys; 2675 scale.Z = m_scene.m_maxNonphys;
2676
2672 if (part.PhysActor != null && part.PhysActor.IsPhysical) 2677 if (part.PhysActor != null && part.PhysActor.IsPhysical)
2673 { 2678 {
2674 if (scale.X > m_scene.m_maxPhys) 2679 if (scale.X > m_scene.m_maxPhys)
@@ -2780,7 +2785,14 @@ namespace OpenSim.Region.Framework.Scenes
2780 newSize.Z *= z; 2785 newSize.Z *= z;
2781 obPart.Resize(newSize); 2786 obPart.Resize(newSize);
2782 obPart.UpdateOffSet(currentpos); 2787 obPart.UpdateOffSet(currentpos);
2788
2789 if (obPart.PhysActor != null)
2790 {
2791 obPart.PhysActor.Size = newSize;
2792 m_scene.PhysicsScene.AddPhysicsActorTaint(obPart.PhysActor);
2793 }
2783 } 2794 }
2795
2784 obPart.IgnoreUndoUpdate = false; 2796 obPart.IgnoreUndoUpdate = false;
2785 obPart.StoreUndoState(); 2797 obPart.StoreUndoState();
2786 } 2798 }
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index 7604510..96dc82b8 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
@@ -2839,6 +2839,8 @@ namespace OpenSim.Region.Framework.Scenes
2839 /// <param name="scale"></param> 2839 /// <param name="scale"></param>
2840 public void Resize(Vector3 scale) 2840 public void Resize(Vector3 scale)
2841 { 2841 {
2842// m_log.DebugFormat("[SCENE OBJECT PART]: Resizing {0} {1} to {2}", Name, LocalId, scale);
2843
2842 StoreUndoState(); 2844 StoreUndoState();
2843 m_shape.Scale = scale; 2845 m_shape.Scale = scale;
2844 2846
@@ -2976,6 +2978,11 @@ namespace OpenSim.Region.Framework.Scenes
2976 } 2978 }
2977 } 2979 }
2978 2980
2981 /// <summary>
2982 /// Sets sculpt and mesh data, and tells the physics engine to process the change.
2983 /// </summary>
2984 /// <param name="textureID">Texture id of the mesh. XXX: Redundant since this is also in AssetBase</param>
2985 /// <param name="texture">The mesh itself.</param>
2979 public void SculptTextureCallback(UUID textureID, AssetBase texture) 2986 public void SculptTextureCallback(UUID textureID, AssetBase texture)
2980 { 2987 {
2981 if (m_shape.SculptEntry) 2988 if (m_shape.SculptEntry)
@@ -4613,7 +4620,7 @@ namespace OpenSim.Region.Framework.Scenes
4613 /// </remarks> 4620 /// </remarks>
4614 public void CheckSculptAndLoad() 4621 public void CheckSculptAndLoad()
4615 { 4622 {
4616// m_log.Debug("Processing CheckSculptAndLoad for {0} {1}", Name, LocalId); 4623// m_log.DebugFormat("Processing CheckSculptAndLoad for {0} {1}", Name, LocalId);
4617 4624
4618 if (ParentGroup.IsDeleted) 4625 if (ParentGroup.IsDeleted)
4619 return; 4626 return;
diff --git a/OpenSim/Region/Physics/Meshing/Meshmerizer.cs b/OpenSim/Region/Physics/Meshing/Meshmerizer.cs
index 5ca5f20..5413aa8 100644
--- a/OpenSim/Region/Physics/Meshing/Meshmerizer.cs
+++ b/OpenSim/Region/Physics/Meshing/Meshmerizer.cs
@@ -303,6 +303,10 @@ namespace OpenSim.Region.Physics.Meshing
303 303
304 private Mesh CreateMeshFromPrimMesher(string primName, PrimitiveBaseShape primShape, Vector3 size, float lod) 304 private Mesh CreateMeshFromPrimMesher(string primName, PrimitiveBaseShape primShape, Vector3 size, float lod)
305 { 305 {
306// m_log.DebugFormat(
307// "[MESH]: Creating physics proxy for {0}, shape {1}",
308// primName, (OpenMetaverse.SculptType)primShape.SculptType);
309
306 PrimMesh primMesh; 310 PrimMesh primMesh;
307 PrimMesher.SculptMesh sculptMesh; 311 PrimMesher.SculptMesh sculptMesh;
308 312
@@ -668,7 +672,6 @@ namespace OpenSim.Region.Physics.Meshing
668 672
669 // If this mesh has been created already, return it instead of creating another copy 673 // If this mesh has been created already, return it instead of creating another copy
670 // For large regions with 100k+ prims and hundreds of copies of each, this can save a GB or more of memory 674 // For large regions with 100k+ prims and hundreds of copies of each, this can save a GB or more of memory
671
672 key = GetMeshKey(primShape, size, lod); 675 key = GetMeshKey(primShape, size, lod);
673 if (m_uniqueMeshes.TryGetValue(key, out mesh)) 676 if (m_uniqueMeshes.TryGetValue(key, out mesh))
674 return mesh; 677 return mesh;
diff --git a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs
index 27bf942..b3045bd 100644
--- a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs
+++ b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs
@@ -2284,6 +2284,7 @@ Console.WriteLine("changeshape not need meshing");
2284 if (value.IsFinite()) 2284 if (value.IsFinite())
2285 { 2285 {
2286 _size = value; 2286 _size = value;
2287// m_log.DebugFormat("[PHYSICS]: Set size on {0} to {1}", Name, value);
2287 } 2288 }
2288 else 2289 else
2289 { 2290 {