mirror of
https://github.com/opensim/opensim.git
synced 2026-08-11 20:05:33 +08:00
*Huge* structural changes in ODE/OdePrim to get all of the calls in threadlocked code. ODEPrim was almost completely re-written.
Copy/Space test needed.
This commit is contained in:
@@ -491,7 +491,7 @@ namespace OpenSim.Region.Environment.Scenes
|
||||
new Quaternion(rootPart.RotationOffset.W, rootPart.RotationOffset.X,
|
||||
rootPart.RotationOffset.Y, rootPart.RotationOffset.Z), UsePhysics);
|
||||
|
||||
rootPart.doPhysicsPropertyUpdate(UsePhysics);
|
||||
rootPart.doPhysicsPropertyUpdate(UsePhysics, true);
|
||||
|
||||
}
|
||||
rootPart.ScheduleFullUpdate();
|
||||
|
||||
@@ -604,7 +604,7 @@ namespace OpenSim.Region.Environment.Scenes
|
||||
new PhysicsVector(rootPart.Scale.X, rootPart.Scale.Y, rootPart.Scale.Z),
|
||||
new Quaternion(rootPart.RotationOffset.W, rootPart.RotationOffset.X,
|
||||
rootPart.RotationOffset.Y, rootPart.RotationOffset.Z), UsePhysics);
|
||||
rootPart.doPhysicsPropertyUpdate(UsePhysics);
|
||||
rootPart.doPhysicsPropertyUpdate(UsePhysics, true);
|
||||
}
|
||||
MainLog.Instance.Verbose("Loaded " + PrimsFromDB.Count.ToString() + " SceneObject(s)");
|
||||
}
|
||||
@@ -657,7 +657,7 @@ namespace OpenSim.Region.Environment.Scenes
|
||||
new PhysicsVector(shape.Scale.X, shape.Scale.Y, shape.Scale.Z),
|
||||
new Quaternion(), UsePhysics);
|
||||
// subscribe to physics events.
|
||||
rootPart.doPhysicsPropertyUpdate(UsePhysics);
|
||||
rootPart.doPhysicsPropertyUpdate(UsePhysics, true);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -150,6 +150,7 @@ namespace OpenSim.Region.Environment.Scenes
|
||||
m_rootPart.PhysActor.Position =
|
||||
new PhysicsVector(m_rootPart.GroupPosition.X, m_rootPart.GroupPosition.Y,
|
||||
m_rootPart.GroupPosition.Z);
|
||||
m_scene.PhysScene.AddPhysicsActorTaint(m_rootPart.PhysActor);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -480,7 +481,7 @@ namespace OpenSim.Region.Environment.Scenes
|
||||
new Quaternion(dupe.RootPart.RotationOffset.W, dupe.RootPart.RotationOffset.X,
|
||||
dupe.RootPart.RotationOffset.Y, dupe.RootPart.RotationOffset.Z),
|
||||
dupe.RootPart.PhysActor.IsPhysical);
|
||||
dupe.RootPart.doPhysicsPropertyUpdate(dupe.RootPart.PhysActor.IsPhysical);
|
||||
dupe.RootPart.doPhysicsPropertyUpdate(dupe.RootPart.PhysActor.IsPhysical, true);
|
||||
|
||||
}
|
||||
// Now we've made a copy that replaces this one, we need to
|
||||
@@ -784,6 +785,7 @@ namespace OpenSim.Region.Environment.Scenes
|
||||
if (linkPart.PhysActor != null)
|
||||
{
|
||||
m_scene.PhysScene.RemovePrim(linkPart.PhysActor);
|
||||
|
||||
linkPart.PhysActor = null;
|
||||
}
|
||||
|
||||
@@ -861,7 +863,7 @@ namespace OpenSim.Region.Environment.Scenes
|
||||
new Quaternion(linkPart.RotationOffset.W, linkPart.RotationOffset.X,
|
||||
linkPart.RotationOffset.Y, linkPart.RotationOffset.Z),
|
||||
m_rootPart.PhysActor.IsPhysical);
|
||||
m_rootPart.doPhysicsPropertyUpdate(m_rootPart.PhysActor.IsPhysical);
|
||||
m_rootPart.doPhysicsPropertyUpdate(m_rootPart.PhysActor.IsPhysical, true);
|
||||
|
||||
}
|
||||
|
||||
@@ -1170,7 +1172,7 @@ namespace OpenSim.Region.Environment.Scenes
|
||||
m_rootPart.RotationOffset.Y, m_rootPart.RotationOffset.Z),
|
||||
m_rootPart.PhysActor.IsPhysical);
|
||||
bool UsePhysics = ((m_rootPart.ObjectFlags & (uint)LLObject.ObjectFlags.Physics) != 0);
|
||||
m_rootPart.doPhysicsPropertyUpdate(UsePhysics);
|
||||
m_rootPart.doPhysicsPropertyUpdate(UsePhysics, true);
|
||||
|
||||
}
|
||||
}
|
||||
@@ -1196,6 +1198,7 @@ namespace OpenSim.Region.Environment.Scenes
|
||||
{
|
||||
m_rootPart.PhysActor.Size =
|
||||
new PhysicsVector(m_rootPart.Scale.X, m_rootPart.Scale.Y, m_rootPart.Scale.Z);
|
||||
m_scene.PhysScene.AddPhysicsActorTaint(m_rootPart.PhysActor);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1286,6 +1289,7 @@ namespace OpenSim.Region.Environment.Scenes
|
||||
m_rootPart.PhysActor.Orientation =
|
||||
new Quaternion(m_rootPart.RotationOffset.W, m_rootPart.RotationOffset.X, m_rootPart.RotationOffset.Y,
|
||||
m_rootPart.RotationOffset.Z);
|
||||
m_scene.PhysScene.AddPhysicsActorTaint(m_rootPart.PhysActor);
|
||||
}
|
||||
ScheduleGroupForTerseUpdate();
|
||||
}
|
||||
@@ -1303,6 +1307,7 @@ namespace OpenSim.Region.Environment.Scenes
|
||||
m_rootPart.PhysActor.Orientation =
|
||||
new Quaternion(m_rootPart.RotationOffset.W, m_rootPart.RotationOffset.X, m_rootPart.RotationOffset.Y,
|
||||
m_rootPart.RotationOffset.Z);
|
||||
m_scene.PhysScene.AddPhysicsActorTaint(m_rootPart.PhysActor);
|
||||
}
|
||||
AbsolutePosition = pos;
|
||||
ScheduleGroupForTerseUpdate();
|
||||
@@ -1346,6 +1351,7 @@ namespace OpenSim.Region.Environment.Scenes
|
||||
m_rootPart.PhysActor.Orientation =
|
||||
new Quaternion(m_rootPart.RotationOffset.W, m_rootPart.RotationOffset.X, m_rootPart.RotationOffset.Y,
|
||||
m_rootPart.RotationOffset.Z);
|
||||
m_scene.PhysScene.AddPhysicsActorTaint(m_rootPart.PhysActor);
|
||||
}
|
||||
|
||||
foreach (SceneObjectPart prim in m_parts.Values)
|
||||
|
||||
@@ -170,9 +170,10 @@ namespace OpenSim.Region.Environment.Scenes
|
||||
{
|
||||
try
|
||||
{
|
||||
//lock (m_scene.SyncRoot)
|
||||
//lock (m_parentGroup.m_scene.SyncRoot)
|
||||
//{
|
||||
PhysActor.Position = new PhysicsVector(value.X, value.Y, value.Z);
|
||||
m_parentGroup.m_scene.PhysScene.AddPhysicsActorTaint(PhysActor);
|
||||
//}
|
||||
}
|
||||
catch (Exception e)
|
||||
@@ -225,6 +226,7 @@ namespace OpenSim.Region.Environment.Scenes
|
||||
//lock (m_scene.SyncRoot)
|
||||
//{
|
||||
PhysActor.Orientation = new Quaternion(value.W, value.X, value.Y, value.Z);
|
||||
m_parentGroup.m_scene.PhysScene.AddPhysicsActorTaint(PhysActor);
|
||||
//}
|
||||
}
|
||||
catch (Exception ex)
|
||||
@@ -502,7 +504,7 @@ namespace OpenSim.Region.Environment.Scenes
|
||||
RotationOffset = rotation;
|
||||
ObjectFlags = flags;
|
||||
bool UsePhysics = ((ObjectFlags & (uint)LLObject.ObjectFlags.Physics) != 0);
|
||||
doPhysicsPropertyUpdate(UsePhysics);
|
||||
doPhysicsPropertyUpdate(UsePhysics, true);
|
||||
ScheduleFullUpdate();
|
||||
}
|
||||
|
||||
@@ -518,7 +520,7 @@ namespace OpenSim.Region.Environment.Scenes
|
||||
XmlSerializer serializer = new XmlSerializer(typeof (SceneObjectPart));
|
||||
SceneObjectPart newobject = (SceneObjectPart) serializer.Deserialize(xmlReader);
|
||||
bool UsePhysics = ((newobject.ObjectFlags & (uint)LLObject.ObjectFlags.Physics) != 0);
|
||||
newobject.doPhysicsPropertyUpdate(UsePhysics);
|
||||
newobject.doPhysicsPropertyUpdate(UsePhysics, true);
|
||||
|
||||
return newobject;
|
||||
}
|
||||
@@ -586,7 +588,7 @@ namespace OpenSim.Region.Environment.Scenes
|
||||
Array.Copy(Shape.ExtraParams, extraP, extraP.Length);
|
||||
dupe.Shape.ExtraParams = extraP;
|
||||
bool UsePhysics = ((dupe.ObjectFlags & (uint)LLObject.ObjectFlags.Physics) != 0);
|
||||
dupe.doPhysicsPropertyUpdate(UsePhysics);
|
||||
dupe.doPhysicsPropertyUpdate(UsePhysics, true);
|
||||
|
||||
return dupe;
|
||||
}
|
||||
@@ -852,7 +854,7 @@ namespace OpenSim.Region.Environment.Scenes
|
||||
AddFlag(LLObject.ObjectFlags.Physics);
|
||||
if (!wasUsingPhysics)
|
||||
{
|
||||
doPhysicsPropertyUpdate(UsePhysics);
|
||||
doPhysicsPropertyUpdate(UsePhysics,false);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -861,7 +863,7 @@ namespace OpenSim.Region.Environment.Scenes
|
||||
RemFlag(LLObject.ObjectFlags.Physics);
|
||||
if (wasUsingPhysics)
|
||||
{
|
||||
doPhysicsPropertyUpdate(UsePhysics);
|
||||
doPhysicsPropertyUpdate(UsePhysics, false);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -892,12 +894,12 @@ namespace OpenSim.Region.Environment.Scenes
|
||||
new PhysicsVector(Scale.X, Scale.Y, Scale.Z),
|
||||
new Quaternion(RotationOffset.W, RotationOffset.X,
|
||||
RotationOffset.Y, RotationOffset.Z), UsePhysics);
|
||||
doPhysicsPropertyUpdate(UsePhysics);
|
||||
doPhysicsPropertyUpdate(UsePhysics, true);
|
||||
}
|
||||
else
|
||||
{
|
||||
PhysActor.IsPhysical = UsePhysics;
|
||||
doPhysicsPropertyUpdate(UsePhysics);
|
||||
doPhysicsPropertyUpdate(UsePhysics,false);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -912,36 +914,45 @@ namespace OpenSim.Region.Environment.Scenes
|
||||
// System.Console.WriteLine("Update: PHY:" + UsePhysics.ToString() + ", T:" + IsTemporary.ToString() + ", PHA:" + IsPhantom.ToString() + " S:" + CastsShadows.ToString());
|
||||
ScheduleFullUpdate();
|
||||
}
|
||||
public void doPhysicsPropertyUpdate(bool UsePhysics)
|
||||
public void doPhysicsPropertyUpdate(bool UsePhysics, bool isNew)
|
||||
{
|
||||
|
||||
if (PhysActor != null)
|
||||
{
|
||||
if (PhysActor.IsPhysical)
|
||||
{
|
||||
if (UsePhysics != PhysActor.IsPhysical || isNew)
|
||||
{
|
||||
PhysActor.OnRequestTerseUpdate -= PhysicsRequestingTerseUpdate;
|
||||
PhysActor.OnOutOfBounds -= PhysicsOutOfBounds;
|
||||
}
|
||||
m_parentGroup.m_scene.PhysScene.RemovePrim(PhysActor);
|
||||
/// that's not wholesome. Had to make m_scene public
|
||||
PhysActor = null;
|
||||
|
||||
if ((ObjectFlags & (uint)LLObject.ObjectFlags.Phantom) == 0)
|
||||
{
|
||||
PhysActor = m_parentGroup.m_scene.PhysScene.AddPrimShape(
|
||||
Name,
|
||||
Shape,
|
||||
new PhysicsVector(AbsolutePosition.X, AbsolutePosition.Y,
|
||||
AbsolutePosition.Z),
|
||||
new PhysicsVector(Scale.X, Scale.Y, Scale.Z),
|
||||
new Quaternion(RotationOffset.W, RotationOffset.X,
|
||||
RotationOffset.Y, RotationOffset.Z), UsePhysics);
|
||||
if (UsePhysics)
|
||||
|
||||
if (PhysActor.IsPhysical)
|
||||
{
|
||||
PhysActor.OnRequestTerseUpdate += PhysicsRequestingTerseUpdate;
|
||||
PhysActor.OnOutOfBounds += PhysicsOutOfBounds;
|
||||
PhysActor.OnRequestTerseUpdate -= PhysicsRequestingTerseUpdate;
|
||||
PhysActor.OnOutOfBounds -= PhysicsOutOfBounds;
|
||||
}
|
||||
|
||||
PhysActor.IsPhysical = UsePhysics;
|
||||
// If we're not what we're supposed to be in the physics scene, recreate ourselves.
|
||||
//m_parentGroup.m_scene.PhysScene.RemovePrim(PhysActor);
|
||||
/// that's not wholesome. Had to make m_scene public
|
||||
//PhysActor = null;
|
||||
|
||||
|
||||
if ((ObjectFlags & (uint)LLObject.ObjectFlags.Phantom) == 0)
|
||||
{
|
||||
//PhysActor = m_parentGroup.m_scene.PhysScene.AddPrimShape(
|
||||
//Name,
|
||||
//Shape,
|
||||
//new PhysicsVector(AbsolutePosition.X, AbsolutePosition.Y,
|
||||
//AbsolutePosition.Z),
|
||||
//new PhysicsVector(Scale.X, Scale.Y, Scale.Z),
|
||||
//new Quaternion(RotationOffset.W, RotationOffset.X,
|
||||
//RotationOffset.Y, RotationOffset.Z), UsePhysics);
|
||||
if (UsePhysics)
|
||||
{
|
||||
PhysActor.OnRequestTerseUpdate += PhysicsRequestingTerseUpdate;
|
||||
PhysActor.OnOutOfBounds += PhysicsOutOfBounds;
|
||||
}
|
||||
}
|
||||
}
|
||||
m_parentGroup.m_scene.PhysScene.AddPhysicsActorTaint(PhysActor);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1195,8 +1206,11 @@ namespace OpenSim.Region.Environment.Scenes
|
||||
public void PhysicsOutOfBounds(PhysicsVector pos)
|
||||
{
|
||||
OpenSim.Framework.Console.MainLog.Instance.Verbose("PHYSICS", "Physical Object went out of bounds.");
|
||||
doPhysicsPropertyUpdate(false);
|
||||
ScheduleFullUpdate();
|
||||
RemFlag(LLObject.ObjectFlags.Physics);
|
||||
doPhysicsPropertyUpdate(false,true);
|
||||
m_parentGroup.m_scene.PhysScene.AddPhysicsActorTaint(PhysActor);
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -55,7 +55,7 @@ namespace OpenSim.Region.Environment.Scenes
|
||||
new PhysicsVector(rootPart.Scale.X, rootPart.Scale.Y, rootPart.Scale.Z),
|
||||
new Quaternion(rootPart.RotationOffset.W, rootPart.RotationOffset.X,
|
||||
rootPart.RotationOffset.Y, rootPart.RotationOffset.Z), UsePhysics);
|
||||
rootPart.doPhysicsPropertyUpdate(UsePhysics);
|
||||
rootPart.doPhysicsPropertyUpdate(UsePhysics, true);
|
||||
|
||||
}
|
||||
primCount++;
|
||||
@@ -125,7 +125,7 @@ namespace OpenSim.Region.Environment.Scenes
|
||||
new PhysicsVector(rootPart.Scale.X, rootPart.Scale.Y, rootPart.Scale.Z),
|
||||
new Quaternion(rootPart.RotationOffset.W, rootPart.RotationOffset.X,
|
||||
rootPart.RotationOffset.Y, rootPart.RotationOffset.Z), UsePhysics);
|
||||
rootPart.doPhysicsPropertyUpdate(UsePhysics);
|
||||
rootPart.doPhysicsPropertyUpdate(UsePhysics, true);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user