public override void updatePhysics()
{
foreach (Chunk chunk in this.Chunks)
chunk.Activate();
bool hasVolume = false;
List<CompoundShapeEntry> bodies = new List<CompoundShapeEntry>();
float mass = 0.0f;
float volume = 0.0f;
foreach (Box box in this.Chunks.SelectMany(x => x.Boxes))
{
if (!box.Type.Fake)
{
bodies.Add(box.GetCompoundShapeEntry());
float v = box.Width * box.Height * box.Depth;
volume += v;
mass += v * box.Type.Density;
}
}
if (bodies.Count > 0)
{
Vector3 c;
CompoundShape shape = new CompoundShape(bodies, out c);
this.PhysicsEntity.Position += Vector3.TransformNormal(c - this.Offset.Value, this.Transform);
this.Offset.Value = c;
if (!this.main.EditorEnabled && this.EnablePhysics)
{
hasVolume = true;
EntityCollidable collisionInfo = shape.GetCollidableInstance();
collisionInfo.Events.ContactCreated += new BEPUphysics.BroadPhaseEntries.Events.ContactCreatedEventHandler<BEPUphysics.BroadPhaseEntries.MobileCollidables.EntityCollidable>(Events_ContactCreated);
collisionInfo.Tag = this;
this.PhysicsEntity.SetCollisionInformation(collisionInfo, mass);
// TODO: figure out how to manually override volume in new BEPUphysics
//this.PhysicsEntity.Volume = volume;
this.PhysicsEntity.ActivityInformation.Activate();
}
}
if (!this.addedToSpace && hasVolume && !this.Suspended && !this.main.EditorEnabled)
{
this.main.Space.SpaceObjectBuffer.Add(this.PhysicsEntity);
this.addedToSpace = true;
}
else if (this.addedToSpace && this.PhysicsEntity.Space != null && !hasVolume)
{
this.main.Space.SpaceObjectBuffer.Remove(this.PhysicsEntity);
this.addedToSpace = false;
}
if (this.firstPhysicsUpdate)
this.firstPhysicsUpdate = false;
else
{
lock (this.physicsLock)
this.physicsUpdated = true;
}
}