From cf9ebd301c32fa7cd991e78647ce011b0aefc796 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Wed, 14 Mar 2012 18:24:04 +0000 Subject: bug fixs, added a default physics shape estimator based on being a mesh or not and use it on unlink if new root part as type none. Viewer doesn't get updated even with fullupdates we are missing something still --- .../Region/Framework/Scenes/SceneObjectGroup.cs | 4 ++ OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 84 ++++++++++++++++++---- .../Scenes/Serialization/SceneObjectSerializer.cs | 10 +-- 3 files changed, 80 insertions(+), 18 deletions(-) (limited to 'OpenSim/Region/Framework') diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs index 6feb333..5507aa0 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs @@ -2723,6 +2723,10 @@ namespace OpenSim.Region.Framework.Scenes // When we delete a group, we currently have to force persist to the database if the object id has changed // (since delete works by deleting all rows which have a given object id) + // this is as it seems to be in sl now + if(linkPart.PhysicsShapeType == (byte)PhysShapeType.none) + linkPart.PhysicsShapeType = linkPart.DefaultPhysicsShapeType(); // root prims can't have type none for now + if (m_rootPart.PhysActor != null) m_rootPart.PhysActor.Building = false; diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index a68b3eb..84ed40c 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs @@ -986,7 +986,11 @@ namespace OpenSim.Region.Framework.Scenes public PrimitiveBaseShape Shape { get { return m_shape; } - set { m_shape = value;} + set + { + m_shape = value; + m_physicsShapeType = DefaultPhysicsShapeType(); + } } /// @@ -1377,31 +1381,68 @@ namespace OpenSim.Region.Framework.Scenes { if (value >= 0 && value <= (byte)SOPMaterialData.MaxMaterial) { - m_material = (Material)value; - m_friction = SOPMaterialData.friction(m_material); - m_bounce = SOPMaterialData.bounce(m_material); - if (PhysActor != null) + bool update = false; + + if (m_material != (Material)value) + { + update = true; + m_material = (Material)value; + } + + if (m_friction != SOPMaterialData.friction(m_material)) + { + update = true; + m_friction = SOPMaterialData.friction(m_material); + } + + if (m_bounce != SOPMaterialData.bounce(m_material)) { - PhysActor.SetMaterial((int)value); + update = true; + m_bounce = SOPMaterialData.bounce(m_material); + } + + if (update) + { + if (PhysActor != null) + { + PhysActor.SetMaterial((int)value); + } + if(ParentGroup != null) + ParentGroup.HasGroupChanged = true; + ScheduleFullUpdateIfNone(); } } } } + // not a propriety to move to methods place later + public byte DefaultPhysicsShapeType() + { + byte type; + + if (Shape != null && (Shape.SculptType == (byte)SculptType.Mesh)) + type = (byte)PhysShapeType.convex; + else + type = (byte)PhysShapeType.prim; + + return type; + } + public byte PhysicsShapeType { get { return m_physicsShapeType; } set { - if (value < 0 || value >= (byte)PhysShapeType.convex) - value = (byte)PhysShapeType.prim; //convex not supported ? - - else if (value == (byte)PhysShapeType.none) + if (value >= 0 && value <= (byte)PhysShapeType.convex) { - if (ParentGroup == null || ParentGroup.RootPart == this) - value = (byte)PhysShapeType.prim; + if (value == (byte)PhysShapeType.none && ParentGroup != null && ParentGroup.RootPart == this) + m_physicsShapeType = DefaultPhysicsShapeType(); + else + m_physicsShapeType = value; + ScheduleFullUpdateIfNone(); } - m_physicsShapeType = value; + else + m_physicsShapeType = DefaultPhysicsShapeType(); } } @@ -1413,6 +1454,7 @@ namespace OpenSim.Region.Framework.Scenes if (value >=1 && value <= 22587.0) { m_density = value; + ScheduleFullUpdateIfNone(); } } } @@ -1423,6 +1465,7 @@ namespace OpenSim.Region.Framework.Scenes set { if( value >= -1 && value <=28.0f) m_gravitymod = value; + ScheduleFullUpdateIfNone(); } } @@ -1434,6 +1477,7 @@ namespace OpenSim.Region.Framework.Scenes if (value >= 0 && value <= 255.0f) { m_friction = value; + ScheduleFullUpdateIfNone(); } } } @@ -1446,6 +1490,7 @@ namespace OpenSim.Region.Framework.Scenes if (value >= 0 && value <= 1.0f) { m_bounce = value; + ScheduleFullUpdateIfNone(); } } } @@ -2942,6 +2987,19 @@ namespace OpenSim.Region.Framework.Scenes APIDTarget = Quaternion.Identity; } + + + public void ScheduleFullUpdateIfNone() + { + if (ParentGroup == null) + return; + +// ??? ParentGroup.HasGroupChanged = true; + + if (UpdateFlag != UpdateRequired.FULL) + ScheduleFullUpdate(); + } + /// /// Schedules this prim for a full update /// diff --git a/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs b/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs index dfa24e5..1cd8189 100644 --- a/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs +++ b/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs @@ -597,22 +597,22 @@ namespace OpenSim.Region.Framework.Scenes.Serialization private static void ProcessDensity(SceneObjectPart obj, XmlTextReader reader) { - obj.Density = (byte)reader.ReadElementContentAsInt("Density", String.Empty); + obj.Density = reader.ReadElementContentAsFloat("Density", String.Empty); } private static void ProcessFriction(SceneObjectPart obj, XmlTextReader reader) { - obj.Friction = (byte)reader.ReadElementContentAsInt("Friction", String.Empty); + obj.Friction = reader.ReadElementContentAsFloat("Friction", String.Empty); } private static void ProcessBounce(SceneObjectPart obj, XmlTextReader reader) { - obj.Bounciness = (byte)reader.ReadElementContentAsInt("Bounce", String.Empty); + obj.Bounciness = reader.ReadElementContentAsFloat("Bounce", String.Empty); } private static void ProcessGravityModifier(SceneObjectPart obj, XmlTextReader reader) { - obj.GravityModifier = (byte)reader.ReadElementContentAsInt("GravityModifier", String.Empty); + obj.GravityModifier = reader.ReadElementContentAsFloat("GravityModifier", String.Empty); } private static void ProcessVehicle(SceneObjectPart obj, XmlTextReader reader) @@ -1321,7 +1321,7 @@ namespace OpenSim.Region.Framework.Scenes.Serialization if (sop.sopVehicle != null) sop.sopVehicle.ToXml2(writer); - if(sop.PhysicsShapeType != (byte)PhysShapeType.prim) + if(sop.PhysicsShapeType != sop.DefaultPhysicsShapeType()) writer.WriteElementString("PhysicsShapeType", sop.PhysicsShapeType.ToString().ToLower()); if (sop.Density != 1000.0f) writer.WriteElementString("Density", sop.Density.ToString().ToLower()); -- cgit v1.1