BulletSim: delay adding a scene presence to the list of presences

until it is fully configured. Another addition to fixing the
collisions stopping problem.
0.8.2-post-fixes
Robert Adams 2015-08-23 21:15:04 -07:00
parent 11209c72f5
commit 062ec0efbd
3 changed files with 33 additions and 19 deletions

View File

@ -75,9 +75,10 @@ public sealed class BSCharacter : BSPhysObject
// Avatars are always complete (in the physics engine sense) // Avatars are always complete (in the physics engine sense)
public override bool IsIncomplete { get { return false; } } public override bool IsIncomplete { get { return false; } }
// 'activate' is called with this character after all initialization is complete
public BSCharacter( public BSCharacter(
uint localID, String avName, BSScene parent_scene, OMV.Vector3 pos, OMV.Vector3 vel, OMV.Vector3 size, bool isFlying) uint localID, String avName, BSScene parent_scene,
OMV.Vector3 pos, OMV.Vector3 vel, OMV.Vector3 size, bool isFlying, Action<BSCharacter> activate)
: base(parent_scene, localID, avName, "BSCharacter") : base(parent_scene, localID, avName, "BSCharacter")
{ {
_physicsActorType = (int)ActorTypes.Agent; _physicsActorType = (int)ActorTypes.Agent;
@ -124,6 +125,9 @@ public sealed class BSCharacter : BSPhysObject
SetPhysicalProperties(); SetPhysicalProperties();
IsInitialized = true; IsInitialized = true;
if (activate != null)
activate(this);
}); });
return; return;
} }
@ -472,12 +476,13 @@ public sealed class BSCharacter : BSPhysObject
} }
} }
// Force the setting of velocity. Called at taint time.
// Exists so that setting force by anyone can be overridden by a subcless.
public override OMV.Vector3 ForceVelocity { public override OMV.Vector3 ForceVelocity {
get { return RawVelocity; } get { return RawVelocity; }
set { set {
PhysScene.AssertInTaintTime("BSCharacter.ForceVelocity"); PhysScene.AssertInTaintTime("BSCharacter.ForceVelocity");
// Util.PrintCallStack(); DetailLog("{0},BSCharacter.setForceVelocity,call,vel={1}", LocalID, value);
DetailLog("{0}: set ForceVelocity = {1}", LocalID, value);
RawVelocity = value; RawVelocity = value;
PhysScene.PE.SetLinearVelocity(PhysBody, RawVelocity); PhysScene.PE.SetLinearVelocity(PhysBody, RawVelocity);

View File

@ -71,6 +71,11 @@ public abstract class BSPhysObject : PhysicsActor
{ {
} }
protected BSPhysObject(BSScene parentScene, uint localID, string name, string typeName) protected BSPhysObject(BSScene parentScene, uint localID, string name, string typeName)
{
InitializePhysObject(parentScene, localID, name, typeName);
}
protected void InitializePhysObject(BSScene parentScene, uint localID, string name, string typeName)
{ {
IsInitialized = false; IsInitialized = false;
@ -119,6 +124,8 @@ public abstract class BSPhysObject : PhysicsActor
// Tell the object to clean up. // Tell the object to clean up.
public virtual void Destroy() public virtual void Destroy()
{ {
SubscribedEventsMs = 0;
PhysicalActors.Enable(false); PhysicalActors.Enable(false);
PhysScene.TaintedObject(LocalID, "BSPhysObject.Destroy", delegate() PhysScene.TaintedObject(LocalID, "BSPhysObject.Destroy", delegate()
{ {
@ -455,6 +462,7 @@ public abstract class BSPhysObject : PhysicsActor
// Return 'true' if a collision was processed and should be sent up. // Return 'true' if a collision was processed and should be sent up.
// Return 'false' if this object is not enabled/subscribed/appropriate for or has already seen this collision. // Return 'false' if this object is not enabled/subscribed/appropriate for or has already seen this collision.
// Called at taint time from within the Step() function // Called at taint time from within the Step() function
// Both 'CollisionLock' and 'PhysObjects' are locked when this is called by 'SendCollisions'.
public delegate bool CollideCall(uint collidingWith, BSPhysObject collidee, OMV.Vector3 contactPoint, OMV.Vector3 contactNormal, float pentrationDepth); public delegate bool CollideCall(uint collidingWith, BSPhysObject collidee, OMV.Vector3 contactPoint, OMV.Vector3 contactNormal, float pentrationDepth);
public virtual bool Collide(uint collidingWith, BSPhysObject collidee, public virtual bool Collide(uint collidingWith, BSPhysObject collidee,
OMV.Vector3 contactPoint, OMV.Vector3 contactNormal, float pentrationDepth) OMV.Vector3 contactPoint, OMV.Vector3 contactNormal, float pentrationDepth)
@ -545,7 +553,7 @@ public abstract class BSPhysObject : PhysicsActor
// Subscribe for collision events. // Subscribe for collision events.
// Parameter is the millisecond rate the caller wishes collision events to occur. // Parameter is the millisecond rate the caller wishes collision events to occur.
public override void SubscribeEvents(int ms) { public override void SubscribeEvents(int ms) {
// DetailLog("{0},{1}.SubscribeEvents,subscribing,ms={2}", LocalID, TypeName, ms); DetailLog("{0},{1}.SubscribeEvents,subscribing,ms={2}", LocalID, TypeName, ms);
SubscribedEventsMs = ms; SubscribedEventsMs = ms;
if (ms > 0) if (ms > 0)
{ {

View File

@ -477,16 +477,19 @@ public sealed class BSScene : PhysicsScene, IPhysicsParameters
if (!m_initialized) return null; if (!m_initialized) return null;
BSCharacter actor = new BSCharacter(localID, avName, this, position, velocity, size, isFlying); BSCharacter actor = new BSCharacter(localID, avName, this, position, velocity, size, isFlying,
lock (PhysObjects) (aa) =>
PhysObjects.Add(localID, actor); {
// While the actor exists, don't add it to the active avatar lists until completely initialized
// TODO: Remove kludge someday. lock (PhysObjects)
// We must generate a collision for avatars whether they collide or not. PhysObjects.Add(localID, aa);
// This is required by OpenSim to update avatar animations, etc.
lock (AvatarsInSceneLock)
AvatarsInScene.Add(actor);
// TODO: Remove kludge someday.
// We must generate a collision for avatars whether they collide or not.
// This is required by OpenSim to update avatar animations, etc.
lock (AvatarsInSceneLock)
AvatarsInScene.Add(aa);
});
return actor; return actor;
} }
@ -830,10 +833,8 @@ public sealed class BSScene : PhysicsScene, IPhysicsParameters
if (collider.Collide(collidingWith, collidee, collidePoint, collideNormal, penetration)) if (collider.Collide(collidingWith, collidee, collidePoint, collideNormal, penetration))
{ {
// If a collision was 'good', remember to send it to the simulator // If a collision was 'good', remember to send it to the simulator
lock (CollisionLock) // Note that 'CollisionLock' was locked before the call to 'SendCollsions'
{ ObjectsWithCollisions.Add(collider);
ObjectsWithCollisions.Add(collider);
}
} }
} }