aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs4
-rwxr-xr-xOpenSim/Region/Physics/BulletSPlugin/BSLinkset.cs11
-rwxr-xr-xOpenSim/Region/Physics/BulletSPlugin/BSLinksetCompound.cs18
-rwxr-xr-xOpenSim/Region/Physics/BulletSPlugin/BSLinksetConstraints.cs28
-rwxr-xr-xOpenSim/Region/Physics/BulletSPlugin/BSPhysObject.cs9
-rw-r--r--OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs42
-rwxr-xr-xOpenSim/Region/Physics/BulletSPlugin/BSPrimLinkable.cs8
7 files changed, 101 insertions, 19 deletions
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs b/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs
index 63b70e4..c670cca 100644
--- a/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSCharacter.cs
@@ -73,8 +73,12 @@ public sealed class BSCharacter : BSPhysObject
73// base.RawVelocity = value; } 73// base.RawVelocity = value; }
74// } 74// }
75 75
76 // Avatars are always complete (in the physics engine sense)
77 public override bool IsIncomplete { get { return false; } }
78
76 public BSCharacter( 79 public BSCharacter(
77 uint localID, String avName, BSScene parent_scene, OMV.Vector3 pos, OMV.Vector3 vel, OMV.Vector3 size, bool isFlying) 80 uint localID, String avName, BSScene parent_scene, OMV.Vector3 pos, OMV.Vector3 vel, OMV.Vector3 size, bool isFlying)
81
78 : base(parent_scene, localID, avName, "BSCharacter") 82 : base(parent_scene, localID, avName, "BSCharacter")
79 { 83 {
80 _physicsActorType = (int)ActorTypes.Agent; 84 _physicsActorType = (int)ActorTypes.Agent;
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSLinkset.cs b/OpenSim/Region/Physics/BulletSPlugin/BSLinkset.cs
index 77f69a5..e7b10fe 100755
--- a/OpenSim/Region/Physics/BulletSPlugin/BSLinkset.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSLinkset.cs
@@ -1,4 +1,4 @@
1/* 1/*
2 * Copyright (c) Contributors, http://opensimulator.org/ 2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders. 3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 * 4 *
@@ -128,6 +128,7 @@ public abstract class BSLinkset
128 m_children = new Dictionary<BSPrimLinkable, BSLinkInfo>(); 128 m_children = new Dictionary<BSPrimLinkable, BSLinkInfo>();
129 LinksetMass = parent.RawMass; 129 LinksetMass = parent.RawMass;
130 Rebuilding = false; 130 Rebuilding = false;
131 RebuildScheduled = false;
131 132
132 parent.ClearDisplacement(); 133 parent.ClearDisplacement();
133 } 134 }
@@ -297,8 +298,16 @@ public abstract class BSLinkset
297 298
298 // Flag denoting the linkset is in the process of being rebuilt. 299 // Flag denoting the linkset is in the process of being rebuilt.
299 // Used to know not the schedule a rebuild in the middle of a rebuild. 300 // Used to know not the schedule a rebuild in the middle of a rebuild.
301 // Because of potential update calls that could want to schedule another rebuild.
300 protected bool Rebuilding { get; set; } 302 protected bool Rebuilding { get; set; }
301 303
304 // Flag saying a linkset rebuild has been scheduled.
305 // This is turned on when the rebuild is requested and turned off when
306 // the rebuild is complete. Used to limit modifications to the
307 // linkset parameters while the linkset is in an intermediate state.
308 // Protected by a "lock(this)" on the BSLinkset object
309 public bool RebuildScheduled { get; protected set; }
310
302 // The object is going dynamic (physical). Do any setup necessary 311 // The object is going dynamic (physical). Do any setup necessary
303 // for a dynamic linkset. 312 // for a dynamic linkset.
304 // Only the state of the passed object can be modified. The rest of the linkset 313 // Only the state of the passed object can be modified. The rest of the linkset
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSLinksetCompound.cs b/OpenSim/Region/Physics/BulletSPlugin/BSLinksetCompound.cs
index 6586099..582ba5b 100755
--- a/OpenSim/Region/Physics/BulletSPlugin/BSLinksetCompound.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSLinksetCompound.cs
@@ -106,13 +106,21 @@ public sealed class BSLinksetCompound : BSLinkset
106 // When rebuilding, it is possible to set properties that would normally require a rebuild. 106 // When rebuilding, it is possible to set properties that would normally require a rebuild.
107 // If already rebuilding, don't request another rebuild. 107 // If already rebuilding, don't request another rebuild.
108 // If a linkset with just a root prim (simple non-linked prim) don't bother rebuilding. 108 // If a linkset with just a root prim (simple non-linked prim) don't bother rebuilding.
109 if (!Rebuilding && HasAnyChildren) 109 lock (this)
110 { 110 {
111 m_physicsScene.PostTaintObject("BSLinksetCompound.ScheduleRebuild", LinksetRoot.LocalID, delegate() 111 if (!RebuildScheduled)
112 { 112 {
113 if (HasAnyChildren) 113 if (!Rebuilding && HasAnyChildren)
114 RecomputeLinksetCompound(); 114 {
115 }); 115 RebuildScheduled = true;
116 m_physicsScene.PostTaintObject("BSLinksetCompound.ScheduleRebuild", LinksetRoot.LocalID, delegate()
117 {
118 if (HasAnyChildren)
119 RecomputeLinksetCompound();
120 RebuildScheduled = false;
121 });
122 }
123 }
116 } 124 }
117 } 125 }
118 126
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSLinksetConstraints.cs b/OpenSim/Region/Physics/BulletSPlugin/BSLinksetConstraints.cs
index b0a5ef1..4384cdc 100755
--- a/OpenSim/Region/Physics/BulletSPlugin/BSLinksetConstraints.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSLinksetConstraints.cs
@@ -212,20 +212,28 @@ public sealed class BSLinksetConstraints : BSLinkset
212 // When rebuilding, it is possible to set properties that would normally require a rebuild. 212 // When rebuilding, it is possible to set properties that would normally require a rebuild.
213 // If already rebuilding, don't request another rebuild. 213 // If already rebuilding, don't request another rebuild.
214 // If a linkset with just a root prim (simple non-linked prim) don't bother rebuilding. 214 // If a linkset with just a root prim (simple non-linked prim) don't bother rebuilding.
215 if (!Rebuilding && HasAnyChildren) 215 lock (this)
216 { 216 {
217 // Queue to happen after all the other taint processing 217 if (!RebuildScheduled)
218 m_physicsScene.PostTaintObject("BSLinksetContraints.Refresh", requestor.LocalID, delegate()
219 { 218 {
220 if (HasAnyChildren) 219 if (!Rebuilding && HasAnyChildren)
221 { 220 {
222 // Constraints that have not been changed are not rebuild but make sure 221 RebuildScheduled = true;
223 // the constraint of the requestor is rebuilt. 222 // Queue to happen after all the other taint processing
224 PhysicallyUnlinkAChildFromRoot(LinksetRoot, requestor); 223 m_physicsScene.PostTaintObject("BSLinksetContraints.Refresh", requestor.LocalID, delegate()
225 // Rebuild the linkset and all its constraints. 224 {
226 RecomputeLinksetConstraints(); 225 if (HasAnyChildren)
226 {
227 // Constraints that have not been changed are not rebuild but make sure
228 // the constraint of the requestor is rebuilt.
229 PhysicallyUnlinkAChildFromRoot(LinksetRoot, requestor);
230 // Rebuild the linkset and all its constraints.
231 RecomputeLinksetConstraints();
232 }
233 RebuildScheduled = false;
234 });
227 } 235 }
228 }); 236 }
229 } 237 }
230 } 238 }
231 239
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSPhysObject.cs b/OpenSim/Region/Physics/BulletSPlugin/BSPhysObject.cs
index e4d8df8..2b744a0 100755
--- a/OpenSim/Region/Physics/BulletSPlugin/BSPhysObject.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSPhysObject.cs
@@ -136,6 +136,15 @@ public abstract class BSPhysObject : PhysicsActor
136 // This mostly prevents property updates and collisions until the object is completely here. 136 // This mostly prevents property updates and collisions until the object is completely here.
137 public bool IsInitialized { get; protected set; } 137 public bool IsInitialized { get; protected set; }
138 138
139 // Set to 'true' if an object (mesh/linkset/sculpty) is not completely constructed.
140 // This test is used to prevent some updates to the object when it only partially exists.
141 // There are several reasons and object might be incomplete:
142 // Its underlying mesh/sculpty is an asset which must be fetched from the asset store
143 // It is a linkset who is being added to or removed from
144 // It is changing state (static to physical, for instance) which requires rebuilding
145 // This is a computed value based on the underlying physical object construction
146 abstract public bool IsIncomplete { get; }
147
139 // Return the object mass without calculating it or having side effects 148 // Return the object mass without calculating it or having side effects
140 public abstract float RawMass { get; } 149 public abstract float RawMass { get; }
141 // Set the raw mass but also update physical mass properties (inertia, ...) 150 // Set the raw mass but also update physical mass properties (inertia, ...)
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs b/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs
index 27ee5ac..c88a5c2 100644
--- a/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSPrim.cs
@@ -1,4 +1,4 @@
1/* 1/*
2 * Copyright (c) Contributors, http://opensimulator.org/ 2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders. 3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 * 4 *
@@ -141,6 +141,18 @@ public class BSPrim : BSPhysObject
141 public override bool Stopped { 141 public override bool Stopped {
142 get { return false; } 142 get { return false; }
143 } 143 }
144
145 public override bool IsIncomplete {
146 get {
147 return ShapeRebuildScheduled;
148 }
149 }
150
151 // 'true' if this object's shape is in need of a rebuild and a rebuild has been queued.
152 // The prim is still available but its underlying shape will change soon.
153 // This is protected by a 'lock(this)'.
154 public bool ShapeRebuildScheduled { get; protected set; }
155
144 public override OMV.Vector3 Size { 156 public override OMV.Vector3 Size {
145 get { return _size; } 157 get { return _size; }
146 set { 158 set {
@@ -159,13 +171,37 @@ public class BSPrim : BSPhysObject
159 ForceBodyShapeRebuild(false); 171 ForceBodyShapeRebuild(false);
160 } 172 }
161 } 173 }
174 // Cause the body and shape of the prim to be rebuilt if necessary.
175 // If there are no changes required, this is quick and does not make changes to the prim.
176 // If rebuilding is necessary (like changing from static to physical), that will happen.
177 // The 'ShapeRebuildScheduled' tells any checker that the body/shape may change shortly.
178 // The return parameter is not used by anyone.
162 public override bool ForceBodyShapeRebuild(bool inTaintTime) 179 public override bool ForceBodyShapeRebuild(bool inTaintTime)
163 { 180 {
164 PhysScene.TaintedObject(inTaintTime, LocalID, "BSPrim.ForceBodyShapeRebuild", delegate() 181 if (inTaintTime)
165 { 182 {
183 // If called in taint time, do the operation immediately
166 _mass = CalculateMass(); // changing the shape changes the mass 184 _mass = CalculateMass(); // changing the shape changes the mass
167 CreateGeomAndObject(true); 185 CreateGeomAndObject(true);
168 }); 186 }
187 else
188 {
189 lock (this)
190 {
191 // If a rebuild is not already in the queue
192 if (!ShapeRebuildScheduled)
193 {
194 // Remember that a rebuild is queued -- this is used to flag an incomplete object
195 ShapeRebuildScheduled = true;
196 PhysScene.TaintedObject(LocalID, "BSPrim.ForceBodyShapeRebuild", delegate()
197 {
198 _mass = CalculateMass(); // changing the shape changes the mass
199 CreateGeomAndObject(true);
200 ShapeRebuildScheduled = false;
201 });
202 }
203 }
204 }
169 return true; 205 return true;
170 } 206 }
171 public override bool Grabbed { 207 public override bool Grabbed {
diff --git a/OpenSim/Region/Physics/BulletSPlugin/BSPrimLinkable.cs b/OpenSim/Region/Physics/BulletSPlugin/BSPrimLinkable.cs
index 430d645..cdd912d 100755
--- a/OpenSim/Region/Physics/BulletSPlugin/BSPrimLinkable.cs
+++ b/OpenSim/Region/Physics/BulletSPlugin/BSPrimLinkable.cs
@@ -54,6 +54,14 @@ public class BSPrimLinkable : BSPrimDisplaced
54 54
55 public BSLinkset.LinksetImplementation LinksetType { get; set; } 55 public BSLinkset.LinksetImplementation LinksetType { get; set; }
56 56
57 public override bool IsIncomplete
58 {
59 get
60 {
61 return base.IsIncomplete || Linkset.RebuildScheduled ;
62 }
63 }
64
57 public BSPrimLinkable(uint localID, String primName, BSScene parent_scene, OMV.Vector3 pos, OMV.Vector3 size, 65 public BSPrimLinkable(uint localID, String primName, BSScene parent_scene, OMV.Vector3 pos, OMV.Vector3 size,
58 OMV.Quaternion rotation, PrimitiveBaseShape pbs, bool pisPhysical) 66 OMV.Quaternion rotation, PrimitiveBaseShape pbs, bool pisPhysical)
59 : base(localID, primName, parent_scene, pos, size, rotation, pbs, pisPhysical) 67 : base(localID, primName, parent_scene, pos, size, rotation, pbs, pisPhysical)