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); }
/// <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; }
/// <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; }
/// <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; }
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); }
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; } }
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]); } }
/// <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>(); }
/// <summary> /// Constructs a new mobile mesh collidable. /// </summary> /// <param name="shape">Shape to use in the collidable.</param> public MobileMeshCollidable(MobileMeshShape shape) : base(shape) { }