コード例 #1
0
        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);
        }
コード例 #2
0
        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;
        }
コード例 #3
0
        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);
                }
            }
        }