public ActorDesc CreateActorDesc(EntityWorldEntity entityNode, Entity entity, Vector3 position, Quaternion orientation, Vector3 scale) { ActorDesc actorDesc = new ActorDesc(); actorDesc.GlobalPosition = position; actorDesc.GlobalOrientation = orientation.ToRotationMatrix(); if (entityNode.CollisionMode == CollisionMode.ConvexHull || entityNode.CollisionMode == CollisionMode.TriangleMesh) { StaticMeshData meshData = new StaticMeshData(entity.GetMesh(), scale); if (entityNode.CollisionMode == CollisionMode.TriangleMesh) { actorDesc.Shapes.Add(Engine.Physics.CreateTriangleMesh(meshData)); } else { actorDesc.Shapes.Add(Engine.Physics.CreateConvexHull(meshData)); } } else { switch (entityNode.CollisionMode) { case CollisionMode.BoundingBox: actorDesc.Shapes.Add(new BoxShapeDesc(entity.BoundingBox.HalfSize * scale, entity.BoundingBox.Center * scale)); break; case CollisionMode.BoundingSphere: actorDesc.Shapes.Add(new SphereShapeDesc(Engine.MaxAxis(entity.BoundingBox.HalfSize), entity.BoundingBox.Center * scale)); break; case CollisionMode.Shapes: foreach (ShapeDesc shapeDesc in entityNode.Shapes) { actorDesc.Shapes.Add(shapeDesc); } break; default: throw new Exception(entityNode.CollisionMode.ToString() + " not implemented"); } } return(actorDesc); }
public ActorDesc CreateActorDesc(EntityWorldEntity entityNode, Entity entity, Vector3 position, Quaternion orientation, Vector3 scale) { ActorDesc actorDesc = new ActorDesc(); actorDesc.GlobalPosition = position; actorDesc.GlobalOrientation = orientation.ToRotationMatrix(); if (entityNode.CollisionMode == CollisionMode.ConvexHull || entityNode.CollisionMode == CollisionMode.TriangleMesh) { StaticMeshData meshData = new StaticMeshData(entity.GetMesh(), scale); if (entityNode.CollisionMode == CollisionMode.TriangleMesh) actorDesc.Shapes.Add(Engine.Physics.CreateTriangleMesh(meshData)); else actorDesc.Shapes.Add(Engine.Physics.CreateConvexHull(meshData)); } else { switch (entityNode.CollisionMode) { case CollisionMode.BoundingBox: actorDesc.Shapes.Add(new BoxShapeDesc(entity.BoundingBox.HalfSize * scale, entity.BoundingBox.Center * scale)); break; case CollisionMode.BoundingSphere: actorDesc.Shapes.Add(new SphereShapeDesc(Engine.MaxAxis(entity.BoundingBox.HalfSize), entity.BoundingBox.Center * scale)); break; case CollisionMode.Shapes: foreach (ShapeDesc shapeDesc in entityNode.Shapes) actorDesc.Shapes.Add(shapeDesc); break; default: throw new Exception(entityNode.CollisionMode.ToString() + " not implemented"); } } return actorDesc; }
public void OnContactNotify(ContactPair pair, ContactPairFlags events) { Vector3 position = Vector3.ZERO; if (pair.ActorFirst.IsDynamic) { position = pair.ActorFirst.GlobalPosition; } else if (pair.ActorSecond.IsDynamic) { position = pair.ActorSecond.GlobalPosition; } float volume = pair.SumNormalForce.Length / 1000.0f; if (volume > 1.0f) { volume = 1.0f; } if (volume > 0.0f) { EntityWorldEntity node1 = pair.ActorFirst.UserData as EntityWorldEntity; EntityWorldEntity node2 = pair.ActorSecond.UserData as EntityWorldEntity; if (node1 != null) { Engine.Sound.Play3D(node1.CollisionSound, position, volume); } if (node2 != null) { Engine.Sound.Play3D(node2.CollisionSound, position, volume); } } }