Exemple #1
0
        public static void AddMeshToSpace(GameObjectReference m, Cell c)
        {
            Model model = m.BaseGameObject as Model;

            if (model.StaticMesh)
            {
                InstancedMeshShape sms = null;
                if (staticMeshShapeCache.ContainsKey(model.Mesh3d.meshFileName))
                {
                    sms = staticMeshShapeCache[model.Mesh3d.meshFileName];
                }
                else
                {
                    Vector3[] verts    = model.Mesh3d.GetMeshVertices();
                    int[]     indecies = model.Mesh3d.GetMeshIndices();
                    sms = new InstancedMeshShape(verts, indecies);
                    staticMeshShapeCache.Add(model.Mesh3d.meshFileName, sms);
                }


                AffineTransform entityMatrix = new AffineTransform(m.Scale, Quaternion.RotationMatrix(m.Rotation), WorldSpace.GetRealWorldPos(m.Position, c));
                InstancedMesh   mm           = new InstancedMesh(sms, entityMatrix);
                mm.Tag = m;
                mm.ImproveBoundaryBehavior = true;
                mm.Sidedness = BEPUphysics.CollisionShapes.ConvexShapes.TriangleSidedness.Clockwise;
                PhysicsEngine.Space.Add(mm);
                m.PhysicsObj      = mm;
                m.EntityTransform = entityMatrix.Matrix;
            }
            else
            {
                MobileMeshShape mms = null;
                ShapeDistributionInformation shapeInfo;
                if (mobileMeshShapeCache.ContainsKey(model.Mesh3d.meshFileName))
                {
                    mms       = mobileMeshShapeCache[model.Mesh3d.meshFileName];
                    shapeInfo = mobileMeshInfoCache[model.Mesh3d.meshFileName];
                }
                else
                {
                    Vector3[] verts    = model.Mesh3d.GetMeshVertices();
                    int[]     indecies = model.Mesh3d.GetMeshIndices();
                    mms = new MobileMeshShape(verts, indecies, AffineTransform.Identity, MobileMeshSolidity.Solid, out shapeInfo);
                    mobileMeshShapeCache.Add(model.Mesh3d.meshFileName, mms);
                    mobileMeshInfoCache.Add(model.Mesh3d.meshFileName, shapeInfo);
                }
                mms.Sidedness = BEPUphysics.CollisionShapes.ConvexShapes.TriangleSidedness.Clockwise;


                Matrix mWorld = m.Rotation * Matrix.Translation(WorldSpace.GetRealWorldPos(m.Position, c));
                Entity e      = new Entity(mms, 10);
                e.CollisionInformation.LocalPosition = shapeInfo.Center;
                e.WorldTransform     = mWorld;
                e.Tag                = m;
                e.PositionUpdateMode = PositionUpdateMode.Continuous;
                PhysicsEngine.Space.Add(e);
                m.PhysicsObj      = e;
                m.EntityTransform = mWorld;
            }
        }
        /// <summary>
        /// Constructs a new demo.
        /// </summary>
        /// <param name="game">Game owning this demo.</param>
        public AddRemoveStressDemo(DemosGame game)
            : base(game)
        {
            Space.Remove(vehicle.Vehicle);

            var compoundShape = new CompoundShape(new List <CompoundShapeEntry>
            {
                new CompoundShapeEntry(new BoxShape(1, 1, 1), new Vector3(0, 1, 0), 1),
                new CompoundShapeEntry(new BoxShape(2, 1, 2), new Vector3(), 1),
                new CompoundShapeEntry(new BoxShape(1, 1, 1), new Vector3(0, -1, 0), 1)
            });

            for (int i = 0; i < 300; ++i)
            {
                var toAdd = new Entity(compoundShape, 10);
                addedEntities.Add(toAdd);
            }

            var boxShape = new BoxShape(1, 1, 1);

            for (int i = 0; i < 300; ++i)
            {
                var toAdd = new Entity(boxShape, 10);
                addedEntities.Add(toAdd);
            }

            Vector3[] vertices;
            int[]     indices;
            ModelDataExtractor.GetVerticesAndIndicesFromModel(game.Content.Load <Model>("cube"), out vertices, out indices);
            var mobileMeshShape = new MobileMeshShape(vertices, indices, new AffineTransform(Matrix3x3.CreateScale(1, 2, 1), new Vector3()), MobileMeshSolidity.Counterclockwise);

            for (int i = 0; i < 300; ++i)
            {
                var toAdd = new Entity(mobileMeshShape, 10);
                addedEntities.Add(toAdd);
            }

            for (int i = 0; i < addedEntities.Count; ++i)
            {
                var entity = addedEntities[i];
                entity.Gravity        = new Vector3();
                entity.Position       = GetRandomPosition(random);
                entity.LinearVelocity = 3 * Vector3.Normalize(entity.Position);
                Space.Add(entity);
            }


            var playgroundModel = game.Content.Load <Model>("playground");

            ModelDataExtractor.GetVerticesAndIndicesFromModel(playgroundModel, out vertices, out indices);
            var staticMesh = new StaticMesh(vertices, indices, new AffineTransform(Matrix3x3.CreateFromAxisAngle(Vector3.Up, MathHelper.Pi), new Vector3(0, -30, 0)));

            staticMesh.Sidedness = TriangleSidedness.Counterclockwise;

            Space.Add(staticMesh);
            game.ModelDrawer.Add(staticMesh);

            game.Camera.Position = new Vector3(0, 6, 15);
        }
Exemple #3
0
        /// <summary>
        /// Creates a new kinematic MobileMesh.
        /// </summary>
        /// <param name="vertices">Vertices in the mesh.</param>
        /// <param name="indices">Indices of the mesh.</param>
        /// <param name="localTransform">Affine transform to apply to the vertices.</param>
        /// <param name="solidity">Solidity/sidedness of the mesh.  "Solid" is only permitted if the mesh is closed.</param>
        public MobileMesh(Vector3[] vertices, int[] indices, AffineTransform localTransform, MobileMeshSolidity solidity)
        {
            ShapeDistributionInformation info;
            var shape = new MobileMeshShape(vertices, indices, localTransform, solidity, out info);

            Initialize(new MobileMeshCollidable(shape));
            Position = info.Center;
        }
        /// <summary>
        /// Creates a new dynamic MobileMesh.
        /// </summary>
        /// <param name="vertices">Vertices in the mesh.</param>
        /// <param name="indices">Indices of the mesh.</param>
        /// <param name="localTransform">Affine transform to apply to the vertices.</param>
        /// <param name="solidity">Solidity/sidedness of the mesh.  "Solid" is only permitted if the mesh is closed.</param>
        /// <param name="mass">Mass of the mesh.</param>
        public MobileMesh(Vector3[] vertices, int[] indices, AffineTransform localTransform, MobileMeshSolidity solidity, float mass)
        {
            Vector3 center;
            var     shape = new MobileMeshShape(vertices, indices, localTransform, solidity, out center);

            Initialize(new MobileMeshCollidable(shape), mass);
            Position = center;
        }
Exemple #5
0
        /// <summary>
        /// Creates a new kinematic MobileMesh.
        /// </summary>
        /// <param name="vertices">Vertices in the mesh.</param>
        /// <param name="indices">Indices of the mesh.</param>
        /// <param name="localTransform">Affine transform to apply to the vertices.</param>
        /// <param name="solidity">Solidity/sidedness of the mesh.  "Solid" is only permitted if the mesh is closed.</param>
        public MobileMesh(System.Numerics.Vector3[] vertices, int[] indices, AffineTransform localTransform, MobileMeshSolidity solidity)
        {
            System.Numerics.Vector3 center;
            var shape = new MobileMeshShape(vertices, indices, localTransform, solidity, out center);

            Initialize(new MobileMeshCollidable(shape));
            Position = center;
        }
Exemple #6
0
        /// <summary>
        /// Creates a new dynamic MobileMesh.
        /// </summary>
        /// <param name="vertices">Vertices in the mesh.</param>
        /// <param name="indices">Indices of the mesh.</param>
        /// <param name="localTransform">Affine transform to apply to the vertices.</param>
        /// <param name="solidity">Solidity/sidedness of the mesh.  "Solid" is only permitted if the mesh is closed.</param>
        /// <param name="mass">Mass of the mesh.</param>
        public MobileMesh(Vector3[] vertices, int[] indices, AffineTransform localTransform, MobileMeshSolidity solidity, float mass)
        {
            ShapeDistributionInformation info;
            var       shape = new MobileMeshShape(vertices, indices, localTransform, solidity, out info);
            Matrix3X3 inertia;

            Matrix3X3.Multiply(ref info.VolumeDistribution, mass * InertiaHelper.InertiaTensorScale, out inertia);
            Initialize(new MobileMeshCollidable(shape), mass, inertia, info.Volume);
            Position = info.Center;
        }
Exemple #7
0
        public static DebugInfo GetDebugInfo(BEPUphysics.Entities.Entity DisplayedObject, Color color)
        {
            MobileMeshShape shape        = DisplayedObject.CollisionInformation.Shape as MobileMeshShape;
            var             tempVertices = new VertexPositionNormalTexture[shape.TriangleMesh.Data.Vertices.Length];

            for (int i = 0; i < shape.TriangleMesh.Data.Vertices.Length; i++)
            {
                Vector3 position;
                shape.TriangleMesh.Data.GetVertexPosition(i, out position);
                tempVertices[i] = new VertexPositionNormalTexture(
                    position,
                    Vector3.Zero,
                    Vector2.Zero);
            }

            List <VertexPositionColor> vertices = new List <VertexPositionColor>();
            List <short> indices = new List <short>();

            for (int i = 0; i < shape.TriangleMesh.Data.Indices.Length; i++)
            {
                indices.Add((short)shape.TriangleMesh.Data.Indices[i]);
            }
            for (int i = 0; i < indices.Count; i += 3)
            {
                int     a      = indices[i];
                int     b      = indices[i + 1];
                int     c      = indices[i + 2];
                Vector3 normal = Vector3.Normalize(Vector3.Cross(
                                                       tempVertices[c].Position - tempVertices[a].Position,
                                                       tempVertices[b].Position - tempVertices[a].Position));
                tempVertices[a].Normal += normal;
                tempVertices[b].Normal += normal;
                tempVertices[c].Normal += normal;
            }

            for (int i = 0; i < tempVertices.Length; i++)
            {
                tempVertices[i].Normal.Normalize();

                vertices.Add(new VertexPositionColor(tempVertices[i].Position, color));
            }

            DebugInfo DebugInfo = new DebugInfo();

            DebugInfo.vertices = vertices.ToArray();
            DebugInfo.indices  = indices.ToArray();
            return(DebugInfo);
        }
Exemple #8
0
        public override void Start()
        {
            if (Mesh != null)
            {
                MeshAsset  mergedMesh = Mesh.Merged;
                Vector3f[] positions  = mergedMesh.VerticesPositions;
                Vector3f[] collection = new Vector3f[positions.Length];
                Transform  t          = gameElement.WorldTransform;

                for (int i = 0, l = positions.Length; i < l; i++)
                {
                    // TODO: Transform positions here !!
                    collection[i] = positions[i];
                }

                Vector3f center;
                _shape        = new MobileMeshShape(collection, mergedMesh.Indices, new AffineTransform(t.Scale, Quaternion.FromEulerAngles(t.Rotation.Z, t.Rotation.Y, t.Rotation.X), t.Translation), MobileMeshSolidity.DoubleSided, out center);
                _centerOffset = (Vector3f)center;
            }
        }
Exemple #9
0
        protected override Entity CreateEntity()
        {
            MeshData meshData = Mesh.Get(_as.Database);

            Vector3[]       positions = meshData.GetVertexPositions().Select(v => v * Transform.Scale).ToArray();
            int[]           indices   = meshData.GetIndices();
            Vector3         center;
            MobileMeshShape mms = new MobileMeshShape(
                positions,
                indices,
                AffineTransform.Identity,
                MobileMeshSolidity.Solid,
                out center);

            foreach (var meshRenderer in GameObject.GetComponents <MeshRenderer>())
            {
                meshRenderer.RenderOffset = Matrix4x4.CreateTranslation(-center / Transform.Scale);
            }

            return(new Entity(mms, Mass));
        }
        public static void GetShapeMeshData(EntityCollidable collidable, List <VertexPositionNormalTexture> vertices, List <ushort> indices)
        {
            MobileMeshShape shape        = collidable.Shape as MobileMeshShape;
            var             tempVertices = new VertexPositionNormalTexture[shape.TriangleMesh.Data.Vertices.Length];

            for (int i = 0; i < shape.TriangleMesh.Data.Vertices.Length; i++)
            {
                BEPUphysics.MathExtensions.Vector3 position;
                shape.TriangleMesh.Data.GetVertexPosition(i, out position);
                tempVertices[i] = new VertexPositionNormalTexture(
                    MathConverter.Convert(position),
                    Vector3.Zero,
                    Vector2.Zero);
            }

            for (int i = 0; i < shape.TriangleMesh.Data.Indices.Length; i++)
            {
                indices.Add((ushort)shape.TriangleMesh.Data.Indices[i]);
            }
            for (int i = 0; i < indices.Count; i += 3)
            {
                int     a      = indices[i];
                int     b      = indices[i + 1];
                int     c      = indices[i + 2];
                Vector3 normal = Vector3.Normalize(Vector3.Cross(
                                                       tempVertices[c].Position - tempVertices[a].Position,
                                                       tempVertices[b].Position - tempVertices[a].Position));
                tempVertices[a].Normal += normal;
                tempVertices[b].Normal += normal;
                tempVertices[c].Normal += normal;
            }

            for (int i = 0; i < tempVertices.Length; i++)
            {
                tempVertices[i].Normal.Normalize();
                vertices.Add(tempVertices[i]);
            }
        }
Exemple #11
0
 /// <summary>
 /// Constructs a new mobile mesh collidable.
 /// </summary>
 /// <param name="shape">Shape to use in the collidable.</param>
 public MobileMeshCollidable(MobileMeshShape shape)
     : base(shape)
 {
     Events = new ContactEventManager <EntityCollidable>();
 }
Exemple #12
0
 /// <summary>
 /// Constructs a new mobile mesh collidable.
 /// </summary>
 /// <param name="shape">Shape to use in the collidable.</param>
 public MobileMeshCollidable(MobileMeshShape shape)
     : base(shape)
 {
 }