From 7a574be3fd28ffbd9bce4cfa08451d705728fa20 Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Sat, 21 Apr 2012 00:12:07 +0100
Subject: Remove redundant prim_geom != IntPtr.Zero checks in ODEPrim.
prim_geom == IntPtr.Zero only before a new add prim taint is processed (which is the first taint) or in operations such as scale change which are done in taint or under lock.
Therefore, we can remove these checks which were not consistently applied anyway.
If there is a genuine problem, better to see it quickly in a NullReferenceException than hide the bug.
---
OpenSim/Region/Physics/OdePlugin/ODEPrim.cs | 204 ++++++++++++----------------
1 file changed, 88 insertions(+), 116 deletions(-)
(limited to 'OpenSim/Region/Physics/OdePlugin')
diff --git a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs
index 7d67da3..0a8cf75 100644
--- a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs
+++ b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs
@@ -156,7 +156,15 @@ namespace OpenSim.Region.Physics.OdePlugin
///
public IntPtr m_targetSpace = IntPtr.Zero;
+ ///
+ /// The prim geometry, used for collision detection.
+ ///
+ ///
+ /// This is never null except for a brief period when the geometry needs to be replaced (due to resizing or
+ /// mesh change) or when the physical prim is being removed from the scene.
+ ///
public IntPtr prim_geom { get; private set; }
+
public IntPtr _triMeshData { get; private set; }
private IntPtr _linkJointGroup = IntPtr.Zero;
@@ -325,14 +333,11 @@ namespace OpenSim.Region.Physics.OdePlugin
{
prim_geom = geom;
//Console.WriteLine("SetGeom to " + prim_geom + " for " + Name);
- if (prim_geom != IntPtr.Zero)
- {
- d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories);
- d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags);
- _parent_scene.geom_name_map[prim_geom] = Name;
- _parent_scene.actor_name_map[prim_geom] = this;
- }
+ d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories);
+ d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags);
+
+ _parent_scene.geom_name_map[prim_geom] = Name;
if (childPrim)
{
@@ -765,11 +770,8 @@ namespace OpenSim.Region.Physics.OdePlugin
m_collisionCategories &= ~CollisionCategories.Body;
m_collisionFlags &= ~(CollisionCategories.Wind | CollisionCategories.Land);
- if (prim_geom != IntPtr.Zero)
- {
- d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories);
- d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags);
- }
+ d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories);
+ d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags);
d.BodyDestroy(Body);
lock (childrenPrim)
@@ -793,11 +795,8 @@ namespace OpenSim.Region.Physics.OdePlugin
m_collisionCategories &= ~CollisionCategories.Body;
m_collisionFlags &= ~(CollisionCategories.Wind | CollisionCategories.Land);
- if (prim_geom != IntPtr.Zero)
- {
- d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories);
- d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags);
- }
+ d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories);
+ d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags);
Body = IntPtr.Zero;
}
@@ -864,10 +863,7 @@ namespace OpenSim.Region.Physics.OdePlugin
// _parent_scene.waitForSpaceUnlock(m_targetSpace);
try
{
- if (prim_geom == IntPtr.Zero)
- {
- SetGeom(d.CreateTriMesh(m_targetSpace, _triMeshData, parent_scene.triCallback, null, null));
- }
+ SetGeom(d.CreateTriMesh(m_targetSpace, _triMeshData, parent_scene.triCallback, null, null));
}
catch (AccessViolationException)
{
@@ -890,73 +886,67 @@ namespace OpenSim.Region.Physics.OdePlugin
#if SPAM
Console.WriteLine("ZProcessTaints for " + Name);
#endif
+
+ // This must be processed as the very first taint so that later operations have a prim_geom to work with
+ // if this is a new prim.
if (m_taintadd)
- {
changeadd();
- }
-
- if (prim_geom != IntPtr.Zero)
- {
- if (!_position.ApproxEquals(m_taintposition, 0f))
- changemove();
- if (m_taintrot != _orientation)
- {
- if (childPrim && IsPhysical) // For physical child prim...
- {
- rotate();
- // KF: ODE will also rotate the parent prim!
- // so rotate the root back to where it was
- OdePrim parent = (OdePrim)_parent;
- parent.rotate();
- }
- else
- {
- //Just rotate the prim
- rotate();
- }
+ if (!_position.ApproxEquals(m_taintposition, 0f))
+ changemove();
+
+ if (m_taintrot != _orientation)
+ {
+ if (childPrim && IsPhysical) // For physical child prim...
+ {
+ rotate();
+ // KF: ODE will also rotate the parent prim!
+ // so rotate the root back to where it was
+ OdePrim parent = (OdePrim)_parent;
+ parent.rotate();
}
-
- if (m_taintPhysics != IsPhysical && !(m_taintparent != _parent))
- changePhysicsStatus();
+ else
+ {
+ //Just rotate the prim
+ rotate();
+ }
+ }
+
+ if (m_taintPhysics != IsPhysical && !(m_taintparent != _parent))
+ changePhysicsStatus();
- if (!_size.ApproxEquals(m_taintsize, 0f))
- changesize();
+ if (!_size.ApproxEquals(m_taintsize, 0f))
+ changesize();
- if (m_taintshape)
- changeshape();
+ if (m_taintshape)
+ changeshape();
- if (m_taintforce)
- changeAddForce();
+ if (m_taintforce)
+ changeAddForce();
- if (m_taintaddangularforce)
- changeAddAngularForce();
+ if (m_taintaddangularforce)
+ changeAddAngularForce();
- if (!m_taintTorque.ApproxEquals(Vector3.Zero, 0.001f))
- changeSetTorque();
+ if (!m_taintTorque.ApproxEquals(Vector3.Zero, 0.001f))
+ changeSetTorque();
- if (m_taintdisable)
- changedisable();
+ if (m_taintdisable)
+ changedisable();
- if (m_taintselected != m_isSelected)
- changeSelectedStatus();
+ if (m_taintselected != m_isSelected)
+ changeSelectedStatus();
- if (!m_taintVelocity.ApproxEquals(Vector3.Zero, 0.001f))
- changevelocity();
+ if (!m_taintVelocity.ApproxEquals(Vector3.Zero, 0.001f))
+ changevelocity();
- if (m_taintparent != _parent)
- changelink();
+ if (m_taintparent != _parent)
+ changelink();
- if (m_taintCollidesWater != m_collidesWater)
- changefloatonwater();
+ if (m_taintCollidesWater != m_collidesWater)
+ changefloatonwater();
- if (!m_angularlock.ApproxEquals(m_taintAngularLock,0f))
- changeAngularLock();
- }
- else
- {
- m_log.ErrorFormat("[PHYSICS]: The scene reused a disposed PhysActor for {0}! *waves finger*, Don't be evil. A couple of things can cause this. An improper prim breakdown(be sure to set prim_geom to zero after d.GeomDestroy! An improper buildup (creating the geom failed). Or, the Scene Reused a physics actor after disposing it.)", Name);
- }
+ if (!m_angularlock.ApproxEquals(m_taintAngularLock,0f))
+ changeAngularLock();
}
///
@@ -1093,18 +1083,10 @@ Console.WriteLine("ZProcessTaints for " + Name);
prm.m_collisionCategories |= CollisionCategories.Body;
prm.m_collisionFlags |= (CollisionCategories.Land | CollisionCategories.Wind);
- if (prm.prim_geom == IntPtr.Zero)
- {
- m_log.WarnFormat(
- "[PHYSICS]: Unable to link one of the linkset elements {0} for parent {1}. No geom yet",
- prm.Name, prim.Name);
- continue;
- }
//Console.WriteLine(" GeomSetCategoryBits 1: " + prm.prim_geom + " - " + (int)prm.m_collisionCategories + " for " + Name);
d.GeomSetCategoryBits(prm.prim_geom, (int)prm.m_collisionCategories);
d.GeomSetCollideBits(prm.prim_geom, (int)prm.m_collisionFlags);
-
d.Quaternion quat = new d.Quaternion();
quat.W = prm._orientation.W;
quat.X = prm._orientation.X;
@@ -1303,11 +1285,8 @@ Console.WriteLine("ZProcessTaints for " + Name);
disableBodySoft();
}
- if (prim_geom != IntPtr.Zero)
- {
- d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories);
- d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags);
- }
+ d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories);
+ d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags);
if (IsPhysical)
{
@@ -1328,11 +1307,8 @@ Console.WriteLine("ZProcessTaints for " + Name);
if (m_collidesWater)
m_collisionFlags |= CollisionCategories.Water;
- if (prim_geom != IntPtr.Zero)
- {
- d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories);
- d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags);
- }
+ d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories);
+ d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags);
if (IsPhysical)
{
@@ -1472,6 +1448,9 @@ Console.WriteLine("CreateGeom:");
}
else
{
+ m_log.WarnFormat(
+ "[ODE PRIM]: Called RemoveGeom() on {0} {1} where geometry was already null.", Name, LocalID);
+
return false;
}
}
@@ -1505,16 +1484,13 @@ Console.WriteLine("changeadd 1");
#endif
CreateGeom(m_targetSpace, mesh);
- if (prim_geom != IntPtr.Zero)
- {
- d.GeomSetPosition(prim_geom, _position.X, _position.Y, _position.Z);
- d.Quaternion myrot = new d.Quaternion();
- myrot.X = _orientation.X;
- myrot.Y = _orientation.Y;
- myrot.Z = _orientation.Z;
- myrot.W = _orientation.W;
- d.GeomSetQuaternion(prim_geom, ref myrot);
- }
+ d.GeomSetPosition(prim_geom, _position.X, _position.Y, _position.Z);
+ d.Quaternion myrot = new d.Quaternion();
+ myrot.X = _orientation.X;
+ myrot.Y = _orientation.Y;
+ myrot.Z = _orientation.Z;
+ myrot.W = _orientation.W;
+ d.GeomSetQuaternion(prim_geom, ref myrot);
if (IsPhysical && Body == IntPtr.Zero)
enableBody();
@@ -1588,13 +1564,11 @@ Console.WriteLine(" JointCreateFixed");
m_targetSpace = tempspace;
// _parent_scene.waitForSpaceUnlock(m_targetSpace);
- if (prim_geom != IntPtr.Zero)
- {
- d.GeomSetPosition(prim_geom, _position.X, _position.Y, _position.Z);
+
+ d.GeomSetPosition(prim_geom, _position.X, _position.Y, _position.Z);
// _parent_scene.waitForSpaceUnlock(m_targetSpace);
- d.SpaceAdd(m_targetSpace, prim_geom);
- }
+ d.SpaceAdd(m_targetSpace, prim_geom);
changeSelectedStatus();
@@ -2045,18 +2019,16 @@ Console.WriteLine(" JointCreateFixed");
{
m_collidesWater = m_taintCollidesWater;
- if (prim_geom != IntPtr.Zero)
+ if (m_collidesWater)
{
- if (m_collidesWater)
- {
- m_collisionFlags |= CollisionCategories.Water;
- }
- else
- {
- m_collisionFlags &= ~CollisionCategories.Water;
- }
- d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags);
+ m_collisionFlags |= CollisionCategories.Water;
+ }
+ else
+ {
+ m_collisionFlags &= ~CollisionCategories.Water;
}
+
+ d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags);
}
///
--
cgit v1.1
From f60959459574b1473dbe35d780aa0fbe4d688580 Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Sat, 21 Apr 2012 03:23:51 +0100
Subject: refactor: Simplify ODEPrim.AddChildPrim() by returning early where
appropriate.
---
OpenSim/Region/Physics/OdePlugin/ODEPrim.cs | 232 ++++++++++++++--------------
1 file changed, 117 insertions(+), 115 deletions(-)
(limited to 'OpenSim/Region/Physics/OdePlugin')
diff --git a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs
index 0a8cf75..cbb49ac 100644
--- a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs
+++ b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs
@@ -1042,142 +1042,144 @@ Console.WriteLine("ZProcessTaints for " + Name);
/// Child prim
private void AddChildPrim(OdePrim prim)
{
-//Console.WriteLine("AddChildPrim " + Name);
- if (LocalID != prim.LocalID)
+ if (LocalID == prim.LocalID)
+ return;
+
+ if (Body == IntPtr.Zero)
{
- if (Body == IntPtr.Zero)
+ Body = d.BodyCreate(_parent_scene.world);
+ setMass();
+ }
+
+ lock (childrenPrim)
+ {
+ if (childrenPrim.Contains(prim))
+ return;
+
+//Console.WriteLine("childrenPrim.Add " + prim);
+ childrenPrim.Add(prim);
+
+ foreach (OdePrim prm in childrenPrim)
{
- Body = d.BodyCreate(_parent_scene.world);
- setMass();
+ d.Mass m2;
+ d.MassSetZero(out m2);
+ d.MassSetBoxTotal(out m2, prim.CalculateMass(), prm._size.X, prm._size.Y, prm._size.Z);
+
+ d.Quaternion quat = new d.Quaternion();
+ quat.W = prm._orientation.W;
+ quat.X = prm._orientation.X;
+ quat.Y = prm._orientation.Y;
+ quat.Z = prm._orientation.Z;
+
+ d.Matrix3 mat = new d.Matrix3();
+ d.RfromQ(out mat, ref quat);
+ d.MassRotate(ref m2, ref mat);
+ d.MassTranslate(ref m2, Position.X - prm.Position.X, Position.Y - prm.Position.Y, Position.Z - prm.Position.Z);
+ d.MassAdd(ref pMass, ref m2);
}
- if (Body != IntPtr.Zero)
+
+ foreach (OdePrim prm in childrenPrim)
{
- lock (childrenPrim)
- {
- if (!childrenPrim.Contains(prim))
- {
-//Console.WriteLine("childrenPrim.Add " + prim);
- childrenPrim.Add(prim);
-
- foreach (OdePrim prm in childrenPrim)
- {
- d.Mass m2;
- d.MassSetZero(out m2);
- d.MassSetBoxTotal(out m2, prim.CalculateMass(), prm._size.X, prm._size.Y, prm._size.Z);
-
- d.Quaternion quat = new d.Quaternion();
- quat.W = prm._orientation.W;
- quat.X = prm._orientation.X;
- quat.Y = prm._orientation.Y;
- quat.Z = prm._orientation.Z;
-
- d.Matrix3 mat = new d.Matrix3();
- d.RfromQ(out mat, ref quat);
- d.MassRotate(ref m2, ref mat);
- d.MassTranslate(ref m2, Position.X - prm.Position.X, Position.Y - prm.Position.Y, Position.Z - prm.Position.Z);
- d.MassAdd(ref pMass, ref m2);
- }
-
- foreach (OdePrim prm in childrenPrim)
- {
- prm.m_collisionCategories |= CollisionCategories.Body;
- prm.m_collisionFlags |= (CollisionCategories.Land | CollisionCategories.Wind);
+ prm.m_collisionCategories |= CollisionCategories.Body;
+ prm.m_collisionFlags |= (CollisionCategories.Land | CollisionCategories.Wind);
//Console.WriteLine(" GeomSetCategoryBits 1: " + prm.prim_geom + " - " + (int)prm.m_collisionCategories + " for " + Name);
- d.GeomSetCategoryBits(prm.prim_geom, (int)prm.m_collisionCategories);
- d.GeomSetCollideBits(prm.prim_geom, (int)prm.m_collisionFlags);
-
- d.Quaternion quat = new d.Quaternion();
- quat.W = prm._orientation.W;
- quat.X = prm._orientation.X;
- quat.Y = prm._orientation.Y;
- quat.Z = prm._orientation.Z;
-
- d.Matrix3 mat = new d.Matrix3();
- d.RfromQ(out mat, ref quat);
- if (Body != IntPtr.Zero)
- {
- d.GeomSetBody(prm.prim_geom, Body);
- prm.childPrim = true;
- d.GeomSetOffsetWorldPosition(prm.prim_geom, prm.Position.X , prm.Position.Y, prm.Position.Z);
- //d.GeomSetOffsetPosition(prim.prim_geom,
- // (Position.X - prm.Position.X) - pMass.c.X,
- // (Position.Y - prm.Position.Y) - pMass.c.Y,
- // (Position.Z - prm.Position.Z) - pMass.c.Z);
- d.GeomSetOffsetWorldRotation(prm.prim_geom, ref mat);
- //d.GeomSetOffsetRotation(prm.prim_geom, ref mat);
- d.MassTranslate(ref pMass, -pMass.c.X, -pMass.c.Y, -pMass.c.Z);
- d.BodySetMass(Body, ref pMass);
- }
- else
- {
- m_log.DebugFormat("[PHYSICS]: {0} ain't got no boooooooooddy, no body", Name);
- }
+ d.GeomSetCategoryBits(prm.prim_geom, (int)prm.m_collisionCategories);
+ d.GeomSetCollideBits(prm.prim_geom, (int)prm.m_collisionFlags);
- prm.m_interpenetrationcount = 0;
- prm.m_collisionscore = 0;
- prm.m_disabled = false;
+ d.Quaternion quat = new d.Quaternion();
+ quat.W = prm._orientation.W;
+ quat.X = prm._orientation.X;
+ quat.Y = prm._orientation.Y;
+ quat.Z = prm._orientation.Z;
- // The body doesn't already have a finite rotation mode set here
- if ((!m_angularlock.ApproxEquals(Vector3.Zero, 0f)) && _parent == null)
- {
- prm.createAMotor(m_angularlock);
- }
- prm.Body = Body;
- _parent_scene.ActivatePrim(prm);
- }
+ d.Matrix3 mat = new d.Matrix3();
+ d.RfromQ(out mat, ref quat);
+ if (Body != IntPtr.Zero)
+ {
+ d.GeomSetBody(prm.prim_geom, Body);
+ prm.childPrim = true;
+ d.GeomSetOffsetWorldPosition(prm.prim_geom, prm.Position.X , prm.Position.Y, prm.Position.Z);
+ //d.GeomSetOffsetPosition(prim.prim_geom,
+ // (Position.X - prm.Position.X) - pMass.c.X,
+ // (Position.Y - prm.Position.Y) - pMass.c.Y,
+ // (Position.Z - prm.Position.Z) - pMass.c.Z);
+ d.GeomSetOffsetWorldRotation(prm.prim_geom, ref mat);
+ //d.GeomSetOffsetRotation(prm.prim_geom, ref mat);
+ d.MassTranslate(ref pMass, -pMass.c.X, -pMass.c.Y, -pMass.c.Z);
+ d.BodySetMass(Body, ref pMass);
+ }
+ else
+ {
+ m_log.DebugFormat("[PHYSICS]: {0} ain't got no boooooooooddy, no body", Name);
+ }
+
+ prm.m_interpenetrationcount = 0;
+ prm.m_collisionscore = 0;
+ prm.m_disabled = false;
+
+ // The body doesn't already have a finite rotation mode set here
+ if ((!m_angularlock.ApproxEquals(Vector3.Zero, 0f)) && _parent == null)
+ {
+ prm.createAMotor(m_angularlock);
+ }
+ prm.Body = Body;
+ _parent_scene.ActivatePrim(prm);
+ }
- m_collisionCategories |= CollisionCategories.Body;
- m_collisionFlags |= (CollisionCategories.Land | CollisionCategories.Wind);
+ m_collisionCategories |= CollisionCategories.Body;
+ m_collisionFlags |= (CollisionCategories.Land | CollisionCategories.Wind);
//Console.WriteLine("GeomSetCategoryBits 2: " + prim_geom + " - " + (int)m_collisionCategories + " for " + Name);
- d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories);
+ d.GeomSetCategoryBits(prim_geom, (int)m_collisionCategories);
//Console.WriteLine(" Post GeomSetCategoryBits 2");
- d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags);
-
- d.Quaternion quat2 = new d.Quaternion();
- quat2.W = _orientation.W;
- quat2.X = _orientation.X;
- quat2.Y = _orientation.Y;
- quat2.Z = _orientation.Z;
-
- d.Matrix3 mat2 = new d.Matrix3();
- d.RfromQ(out mat2, ref quat2);
- d.GeomSetBody(prim_geom, Body);
- d.GeomSetOffsetWorldPosition(prim_geom, Position.X - pMass.c.X, Position.Y - pMass.c.Y, Position.Z - pMass.c.Z);
- //d.GeomSetOffsetPosition(prim.prim_geom,
- // (Position.X - prm.Position.X) - pMass.c.X,
- // (Position.Y - prm.Position.Y) - pMass.c.Y,
- // (Position.Z - prm.Position.Z) - pMass.c.Z);
- //d.GeomSetOffsetRotation(prim_geom, ref mat2);
- d.MassTranslate(ref pMass, -pMass.c.X, -pMass.c.Y, -pMass.c.Z);
- d.BodySetMass(Body, ref pMass);
-
- d.BodySetAutoDisableFlag(Body, true);
- d.BodySetAutoDisableSteps(Body, body_autodisable_frames);
+ d.GeomSetCollideBits(prim_geom, (int)m_collisionFlags);
- m_interpenetrationcount = 0;
- m_collisionscore = 0;
- m_disabled = false;
+ d.Quaternion quat2 = new d.Quaternion();
+ quat2.W = _orientation.W;
+ quat2.X = _orientation.X;
+ quat2.Y = _orientation.Y;
+ quat2.Z = _orientation.Z;
- // The body doesn't already have a finite rotation mode set here
- if ((!m_angularlock.ApproxEquals(Vector3.Zero, 0f)) && _parent == null)
- {
- createAMotor(m_angularlock);
- }
- d.BodySetPosition(Body, Position.X, Position.Y, Position.Z);
- if (m_vehicle.Type != Vehicle.TYPE_NONE)
- m_vehicle.Enable(Body, _parent_scene);
+ d.Matrix3 mat2 = new d.Matrix3();
+ d.RfromQ(out mat2, ref quat2);
+ d.GeomSetBody(prim_geom, Body);
+ d.GeomSetOffsetWorldPosition(prim_geom, Position.X - pMass.c.X, Position.Y - pMass.c.Y, Position.Z - pMass.c.Z);
+ //d.GeomSetOffsetPosition(prim.prim_geom,
+ // (Position.X - prm.Position.X) - pMass.c.X,
+ // (Position.Y - prm.Position.Y) - pMass.c.Y,
+ // (Position.Z - prm.Position.Z) - pMass.c.Z);
+ //d.GeomSetOffsetRotation(prim_geom, ref mat2);
+ d.MassTranslate(ref pMass, -pMass.c.X, -pMass.c.Y, -pMass.c.Z);
+ d.BodySetMass(Body, ref pMass);
- _parent_scene.ActivatePrim(this);
- }
- }
+ d.BodySetAutoDisableFlag(Body, true);
+ d.BodySetAutoDisableSteps(Body, body_autodisable_frames);
+
+ m_interpenetrationcount = 0;
+ m_collisionscore = 0;
+ m_disabled = false;
+
+ // The body doesn't already have a finite rotation mode set here
+ if ((!m_angularlock.ApproxEquals(Vector3.Zero, 0f)) && _parent == null)
+ {
+ createAMotor(m_angularlock);
}
+
+ d.BodySetPosition(Body, Position.X, Position.Y, Position.Z);
+
+ if (m_vehicle.Type != Vehicle.TYPE_NONE)
+ m_vehicle.Enable(Body, _parent_scene);
+
+ _parent_scene.ActivatePrim(this);
}
}
private void ChildSetGeom(OdePrim odePrim)
{
+// m_log.DebugFormat(
+// "[ODE PRIM]: ChildSetGeom {0} {1} for {2} {3}", odePrim.Name, odePrim.LocalID, Name, LocalID);
+
//if (IsPhysical && Body != IntPtr.Zero)
lock (childrenPrim)
{
--
cgit v1.1
From ae2b8f70074e4dfe2cbbd03dd543c7468fc50cc1 Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Sat, 21 Apr 2012 03:42:54 +0100
Subject: Comment out spurious Body != IntPtr.Zero code after disableBody(),
since disableBody() sets Body == IntPtr.Zero on all code paths.
---
OpenSim/Region/Physics/OdePlugin/ODEPrim.cs | 27 ++++++++++++++++++---------
OpenSim/Region/Physics/OdePlugin/OdeScene.cs | 3 ++-
2 files changed, 20 insertions(+), 10 deletions(-)
(limited to 'OpenSim/Region/Physics/OdePlugin')
diff --git a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs
index cbb49ac..3f88353 100644
--- a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs
+++ b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs
@@ -1056,7 +1056,9 @@ Console.WriteLine("ZProcessTaints for " + Name);
if (childrenPrim.Contains(prim))
return;
-//Console.WriteLine("childrenPrim.Add " + prim);
+// m_log.DebugFormat(
+// "[ODE PRIM]: Linking prim {0} {1} to {2} {3}", prim.Name, prim.LocalID, Name, LocalID);
+
childrenPrim.Add(prim);
foreach (OdePrim prm in childrenPrim)
@@ -1194,12 +1196,14 @@ Console.WriteLine("ZProcessTaints for " + Name);
//prm.childPrim = false;
}
}
+
disableBody();
- if (Body != IntPtr.Zero)
- {
- _parent_scene.DeactivatePrim(this);
- }
+ // Spurious - Body == IntPtr.Zero after disableBody()
+// if (Body != IntPtr.Zero)
+// {
+// _parent_scene.DeactivatePrim(this);
+// }
lock (childrenPrim)
{
@@ -1213,6 +1217,9 @@ Console.WriteLine("ZProcessTaints for " + Name);
private void ChildDelink(OdePrim odePrim)
{
+// m_log.DebugFormat(
+// "[ODE PRIM]: Delinking prim {0} {1} from {2} {3}", odePrim.Name, odePrim.LocalID, Name, LocalID);
+
// Okay, we have a delinked child.. need to rebuild the body.
lock (childrenPrim)
{
@@ -1227,6 +1234,7 @@ Console.WriteLine("ZProcessTaints for " + Name);
//prm.childPrim = false;
}
}
+
disableBody();
lock (childrenPrim)
@@ -1235,10 +1243,11 @@ Console.WriteLine("ZProcessTaints for " + Name);
childrenPrim.Remove(odePrim);
}
- if (Body != IntPtr.Zero)
- {
- _parent_scene.DeactivatePrim(this);
- }
+ // Spurious - Body == IntPtr.Zero after disableBody()
+// if (Body != IntPtr.Zero)
+// {
+// _parent_scene.DeactivatePrim(this);
+// }
lock (childrenPrim)
{
diff --git a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs
index 842ff91..409b27b 100644
--- a/OpenSim/Region/Physics/OdePlugin/OdeScene.cs
+++ b/OpenSim/Region/Physics/OdePlugin/OdeScene.cs
@@ -2226,7 +2226,8 @@ namespace OpenSim.Region.Physics.OdePlugin
///
internal void RemovePrimThreadLocked(OdePrim prim)
{
-//Console.WriteLine("RemovePrimThreadLocked " + prim.m_primName);
+// m_log.DebugFormat("[ODE SCENE]: Removing physical prim {0} {1}", prim.Name, prim.LocalID);
+
lock (prim)
{
RemoveCollisionEventReporting(prim);
--
cgit v1.1