diff options
author | Justin Clark-Casey (justincc) | 2011-07-16 01:36:27 +0100 |
---|---|---|
committer | Justin Clark-Casey (justincc) | 2011-07-16 01:36:27 +0100 |
commit | 18652eb87ef0613b66664059581f991448d76af4 (patch) | |
tree | d0ca27e3ccaed6d82d56e8431136ebf4ccb6df63 | |
parent | use constants in llGetObjectDetails() rather than magic numbers (diff) | |
download | opensim-SC_OLD-18652eb87ef0613b66664059581f991448d76af4.zip opensim-SC_OLD-18652eb87ef0613b66664059581f991448d76af4.tar.gz opensim-SC_OLD-18652eb87ef0613b66664059581f991448d76af4.tar.bz2 opensim-SC_OLD-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.cs | 12 | ||||
-rw-r--r-- | OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 9 | ||||
-rw-r--r-- | OpenSim/Region/Physics/Meshing/Meshmerizer.cs | 5 | ||||
-rw-r--r-- | OpenSim/Region/Physics/OdePlugin/ODEPrim.cs | 1 |
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 | { |