/// <summary> /// Return the Instanced MEsh shape from a IModelo /// </summary> /// <param name="model"></param> /// <returns></returns> public static InstancedMeshShape GetInstacedMesh(IModelo model) { Vector3[] vertices = null; int[] indices = null; ExtractData(ref vertices, ref indices, model); return new InstancedMeshShape(vertices, indices); }
public PhysxTriangleMesh(PhysxPhysicWorld PhysxPhysicWorld, IModelo model,Microsoft.Xna.Framework.Matrix localTransformation, Microsoft.Xna.Framework.Matrix worldTransformation, Microsoft.Xna.Framework.Vector3 scale, MaterialDescription MaterialDescription) { Microsoft.Xna.Framework.Vector3[] vertices = null; int[] indices = null; ExtractData(ref vertices, ref indices, model); TriangleMeshDesc meshDesc = new TriangleMeshDesc(); Vector3[] points = new Vector3[vertices.Count()]; for (int i = 0; i < vertices.Count(); i++) { points[i] = vertices[i].AsPhysX(); } meshDesc.Points = points; meshDesc.SetTriangles<int>(indices); //meshDesc.Triangles = indices; MemoryStream ms = new MemoryStream(); if(PhysxPhysicWorld.Cooking.CookTriangleMesh(meshDesc,ms)==false) { PloobsEngine.Engine.Logger.ActiveLogger.LogMessage("Cant Cook Model",Engine.Logger.LogLevel.FatalError); } ms.Position = 0; TriangleMesh triangleMesh = PhysxPhysicWorld.Physix.CreateTriangleMesh(ms); staticActor = PhysxPhysicWorld.Physix.CreateRigidStatic(worldTransformation.AsPhysX()); TriangleMeshGeometry TriangleMeshGeometry = new TriangleMeshGeometry(triangleMesh,new MeshScale(scale.AsPhysX(),Quaternion.Identity)); material = PhysxPhysicWorld.Physix.CreateMaterial(MaterialDescription.StaticFriction, MaterialDescription.DynamicFriction, MaterialDescription.Bounciness); aTriMeshShape = staticActor.CreateShape(TriangleMeshGeometry, material, localTransformation.AsPhysX()); this.Scale = scale; }
/// <summary> /// Initializes a new instance of the <see cref="TriangleMeshObject"/> class. /// </summary> /// <param name="model">The model.</param> /// <param name="pos">The pos.</param> /// <param name="rotation">The rotation.</param> /// <param name="scale">The scale.</param> /// <param name="materialDescription">The material description.</param> public TriangleMeshObject(IModelo model, Vector3 pos, Matrix? rotation = null, Vector3? scale= null, MaterialDescription materialDescription = null) { if (materialDescription == null) materialDescription = MaterialDescription.DefaultBepuMaterial(); if (!rotation.HasValue) rotation = Matrix.Identity; if (!scale.HasValue) scale = Vector3.One; System.Diagnostics.Debug.Assert(model != null); System.Diagnostics.Debug.Assert(scale != Vector3.Zero); this.rotation = rotation.Value; this.scale = scale.Value; this.position = pos; Vector3[] vertices = null; int[] indices = null; ExtractData(ref vertices, ref indices, model); triangleGroup = new StaticMesh(vertices, indices, new AffineTransform(scale.Value, Quaternion.CreateFromRotationMatrix(rotation.Value), position)); faceVector = Vector3.Transform(Vector3.Forward, triangleGroup.WorldTransform.Matrix); triangleGroup.Material = new BEPUphysics.Materials.Material(materialDescription.StaticFriction, materialDescription.DynamicFriction, materialDescription.Bounciness); }
public static void CookTriangleMesh(PhysxPhysicWorld PhysxPhysicWorld, IModelo model, FileStream FileStream) { Microsoft.Xna.Framework.Vector3[] vertices = null; int[] indices = null; ExtractData(ref vertices, ref indices, model); TriangleMeshDesc meshDesc = new TriangleMeshDesc(); Vector3[] points = new Vector3[vertices.Count()]; for (int i = 0; i < vertices.Count(); i++) { points[i] = vertices[i].AsPhysX(); } meshDesc.Points = points; meshDesc.SetTriangles<int>(indices); if (PhysxPhysicWorld.Cooking.CookTriangleMesh(meshDesc, FileStream) == false) { PloobsEngine.Engine.Logger.ActiveLogger.LogMessage("Cant Cook Model", Engine.Logger.LogLevel.FatalError); } }
public BulletTriangleMesh(IModelo model, Vector3 pos, Matrix rotation, Vector3 scale) { TriangleMesh TriangleMesh = new BulletSharp.TriangleMesh(true,false); Vector3[] vertices = null; int[] indices = null; ExtractData(ref vertices, ref indices, model); for (int i = 0; i < indices.Count(); i+=3) { TriangleMesh.AddTriangle(vertices[indices[i]], vertices[indices[i+1]], vertices[indices[i+2]]); } vertices = null; indices = null; BvhTriangleMeshShape = new BvhTriangleMeshShape(TriangleMesh, true, true); this.Shape = BvhTriangleMeshShape; this.Scale = scale; Shape.LocalScaling = scale; Object = LocalCreateRigidBody(0, Matrix.CreateTranslation(pos) * rotation, Shape); }
/// <summary> /// Initializes a new instance of the <see cref="IObject"/> class. /// </summary> /// <param name="Material">The material. (cannot be null, use the InvisibleMaterial.GetInstance when you dont need Material)</param> /// <param name="Modelo">The modelo. (can be null)</param> /// <param name="PhysicObject">The physic object. (cannot be null)</param> /// <param name="name">The name of the IObject (just an identifier).</param> public IObject(IMaterial Material, IModelo Modelo, IPhysicObject PhysicObject,String name = null) { System.Diagnostics.Debug.Assert(Material != null); System.Diagnostics.Debug.Assert(PhysicObject != null); this.Material = Material; this.Modelo = Modelo; this.PhysicObject = PhysicObject; this.Name = name; IObjectAttachment = new List<IObjectAttachment>(); if (this.Modelo == null && this.Material != null) { Material.IsVisible = false; #if !WINDOWS_PHONE && !REACH Material.CanAppearOfReflectionRefraction = false; Material.CanCreateShadow = false; #endif } }
public static void CookTriangleMesh(IModelo model, FileStream FileStream) { Microsoft.Xna.Framework.Vector3[] vertices = null; int[] indices = null; ExtractData(ref vertices, ref indices, model); TriangleMeshDescription meshDesc = new TriangleMeshDescription(); meshDesc.AllocateVertices<Microsoft.Xna.Framework.Vector3>(vertices.Count()); meshDesc.VerticesStream.SetData<Microsoft.Xna.Framework.Vector3>(vertices); meshDesc.AllocateTriangles<int>(indices.Count()); meshDesc.TriangleStream.SetData<int>(indices); meshDesc.Flags = 0; meshDesc.VertexCount = vertices.Count(); meshDesc.TriangleCount = indices.Count(); Cooking.InitializeCooking(); if (Cooking.CookTriangleMesh(meshDesc, FileStream) == false) { PloobsEngine.Engine.Logger.ActiveLogger.LogMessage("Cant Cook Model", Engine.Logger.LogLevel.FatalError); } Cooking.CloseCooking(); }
/// <summary> /// Initializes a new instance of the <see cref="MobileMeshObject "/> class. /// </summary> /// <param name="model">The model.</param> /// <param name="pos">The pos.</param> /// <param name="rotation">The rotation.</param> /// <param name="scale">The scale.</param> /// <param name="materialDescription">The material description.</param> /// <param name="MobileMeshSolidity">The mobile mesh solidity.</param> /// <param name="mass">The mass.</param> public MobileMeshObject(IModelo model, Vector3 pos, Matrix? rotation = null, Vector3? scale = null, MaterialDescription materialDescription = null,MobileMeshSolidity MobileMeshSolidity = MobileMeshSolidity.Solid,float mass = 10) { if (materialDescription == null) materialDescription = MaterialDescription.DefaultBepuMaterial(); if (!rotation.HasValue) rotation = Matrix.Identity; if (!scale.HasValue) scale = Vector3.One; System.Diagnostics.Debug.Assert(scale != Vector3.Zero); System.Diagnostics.Debug.Assert(model != null); this.scale = scale.Value; Vector3[] vertices = null; int[] indices = null; ExtractData(ref vertices, ref indices, model); triangleGroup = new MobileMesh(vertices, indices, new AffineTransform(scale.Value, Quaternion.CreateFromRotationMatrix(rotation.Value), pos), MobileMeshSolidity,mass); triangleGroup.Material = new BEPUphysics.Materials.Material(materialDescription.StaticFriction, materialDescription.DynamicFriction, materialDescription.Bounciness); }
/// <summary> /// Initializes a new instance of the <see cref="PhysxTriangleMesh"/> class. /// Cooks the Model on the fly /// </summary> /// <param name="PhysxPhysicWorld">The physx physic world.</param> /// <param name="model">The model.</param> /// <param name="worldTransformation">The world transformation.</param> /// <param name="scale">The scale.</param> /// <param name="density">The density.</param> /// <param name="material">The material.</param> public PhysxTriangleMesh(PhysxPhysicWorld PhysxPhysicWorld, IModelo model, Microsoft.Xna.Framework.Matrix worldTransformation, Microsoft.Xna.Framework.Vector3 scale, float density = 1,StillDesign.PhysX.Material material = null) { Microsoft.Xna.Framework.Vector3[] vertices = null; int[] indices = null; ExtractData(ref vertices, ref indices, model); TriangleMeshDescription meshDesc = new TriangleMeshDescription(); meshDesc.AllocateVertices<Microsoft.Xna.Framework.Vector3>(vertices.Count()); meshDesc.VerticesStream.SetData<Microsoft.Xna.Framework.Vector3>(vertices); meshDesc.AllocateTriangles<int>(indices.Count()); meshDesc.TriangleStream.SetData<int>(indices); meshDesc.Flags = 0; meshDesc.VertexCount = vertices.Count(); meshDesc.TriangleCount = indices.Count(); MemoryStream ms = new MemoryStream(); Cooking.InitializeCooking(); if (Cooking.CookTriangleMesh(meshDesc, ms) == false) { PloobsEngine.Engine.Logger.ActiveLogger.LogMessage("Cant Cook Model",Engine.Logger.LogLevel.FatalError); } Cooking.CloseCooking(); ms.Position = 0; TriangleMesh triangleMesh = PhysxPhysicWorld.Core.CreateTriangleMesh(ms); TriangleMeshShapeDescription bunnyShapeDesc = new TriangleMeshShapeDescription(); if (material != null) bunnyShapeDesc.Material = material; bunnyShapeDesc.TriangleMesh = triangleMesh; ActorDesc = new ActorDescription(); ActorDesc.Shapes.Add(bunnyShapeDesc); ActorDesc.BodyDescription= null; ActorDesc.GlobalPose = worldTransformation.AsPhysX(); this.Scale = scale; }
public RVOObject(int id, IMaterial mat, IModelo model,IPhysicObject py) : base(mat,model,py) { this.RVOID = id; }
/// <summary> /// Initializes a new instance of the <see cref="IObject"/> class. /// </summary> /// <param name="Material">The material.</param> /// <param name="Modelo">The modelo.</param> /// <param name="PhysicObject">The physic object.</param> public BaseObject(IMaterial Material, IModelo Modelo, IPhysicObject PhysicObject) : base(Material,Modelo,PhysicObject) { }
/// <summary> /// Helper to get the vertex and index List from the model. /// </summary> /// <param name="vert">The vert.</param> /// <param name="ind">The ind.</param> /// <param name="model">The model.</param> private void ExtractData(ref Vector3[] vert, ref int[] ind, IModelo model) { List<Vector3> vertices = new List<Vector3>(); List<int> indices = new List<int>(); for (int i = 0; i < model.MeshNumber; i++) { BatchInformation[] bi = model.GetBatchInformation(i); for (int j = 0; j < bi.Length; j++) { BatchInformation info = bi[j]; int offset = vertices.Count; Vector3[] a = new Vector3[info.NumVertices]; // Read the format of the vertex buffer VertexDeclaration declaration = bi[j].VertexBuffer.VertexDeclaration; VertexElement[] vertexElements = declaration.GetVertexElements(); // Find the element that holds the position VertexElement vertexPosition = new VertexElement(); foreach (VertexElement elem in vertexElements) { if (elem.VertexElementUsage == VertexElementUsage.Position && elem.VertexElementFormat == VertexElementFormat.Vector3) { vertexPosition = elem; // There should only be one break; } } // Check the position element found is valid if (vertexPosition == null || vertexPosition.VertexElementUsage != VertexElementUsage.Position || vertexPosition.VertexElementFormat != VertexElementFormat.Vector3) { throw new Exception("Model uses unsupported vertex format!"); } // This where we store the vertices until transformed // Read the vertices from the buffer in to the array bi[j].VertexBuffer.GetData<Vector3>( bi[j].BaseVertex * declaration.VertexStride + vertexPosition.Offset, a, 0, bi[j].NumVertices, declaration.VertexStride); for (int k = 0; k != a.Length; ++k) { Vector3.Transform(ref a[k], ref info.ModelLocalTransformation, out a[k]); } vertices.AddRange(a); if (info.IndexBuffer != null) { if (info.IndexBuffer.IndexElementSize != IndexElementSize.SixteenBits) { int[] s = new int[info.PrimitiveCount * 3]; info.IndexBuffer.GetData<int>(info.StartIndex * 2, s, 0, info.PrimitiveCount * 3); for (int k = 0; k != info.PrimitiveCount; ++k) { indices.Add(s[k * 3 + 2] + offset); indices.Add(s[k * 3 + 1] + offset); indices.Add(s[k * 3 + 0] + offset); } } else { short[] s = new short[info.PrimitiveCount * 3]; info.IndexBuffer.GetData<short>(info.StartIndex * 2, s, 0, info.PrimitiveCount * 3); for (int k = 0; k != info.PrimitiveCount; ++k) { indices.Add(s[k * 3 + 2] + offset); indices.Add(s[k * 3 + 1] + offset); indices.Add(s[k * 3 + 0] + offset); } } } else { for (int t = 0; t < vertices.Count; t++) { indices.Add(t); } } } } ind = indices.ToArray(); vert = vertices.ToArray(); }
private static void ExtractData(ref Vector3[] vert, ref int[] ind, ref Vector2[] tex, IModelo model, XNA.Vector3 scale) { List <Vector3> vertices = new List <Vector3>(); List <Vector2> texcoords = new List <Vector2>(); List <int> indices = new List <int>(); for (int i = 0; i < model.MeshNumber; i++) { BatchInformation[] bi = model.GetBatchInformation(i); for (int j = 0; j < bi.Length; j++) { BatchInformation info = bi[j]; int offset = vertices.Count; Microsoft.Xna.Framework.Vector3[] a = new Microsoft.Xna.Framework.Vector3[info.NumVertices]; // Read the format of the vertex buffer VertexDeclaration declaration = bi[j].VertexBuffer.VertexDeclaration; VertexElement[] vertexElements = declaration.GetVertexElements(); // Find the element that holds the position VertexElement vertexPosition = new VertexElement(); foreach (VertexElement elem in vertexElements) { if (elem.VertexElementUsage == VertexElementUsage.Position && elem.VertexElementFormat == VertexElementFormat.Vector3) { vertexPosition = elem; // There should only be one break; } } // Check the position element found is valid if (vertexPosition == null || vertexPosition.VertexElementUsage != VertexElementUsage.Position || vertexPosition.VertexElementFormat != VertexElementFormat.Vector3) { throw new Exception("Model uses unsupported vertex format!"); } // This where we store the vertices until transformed // Read the vertices from the buffer in to the array bi[j].VertexBuffer.GetData <Microsoft.Xna.Framework.Vector3>( bi[j].BaseVertex * declaration.VertexStride + vertexPosition.Offset, a, 0, bi[j].NumVertices, declaration.VertexStride); for (int k = 0; k != a.Length; ++k) { XNA.Matrix tra = info.ModelLocalTransformation * XNA.Matrix.CreateScale(scale); Microsoft.Xna.Framework.Vector3.Transform(ref a[k], ref tra, out a[k]); vertices.Add(a[k].AsPhysX()); } foreach (VertexElement elem in vertexElements) { if (elem.VertexElementUsage == VertexElementUsage.TextureCoordinate && elem.VertexElementFormat == VertexElementFormat.Vector2) { vertexPosition = elem; // There should only be one break; } } Microsoft.Xna.Framework.Vector2[] b = new Microsoft.Xna.Framework.Vector2[info.NumVertices]; // This where we store the vertices until transformed // Read the vertices from the buffer in to the array bi[j].VertexBuffer.GetData <Microsoft.Xna.Framework.Vector2>( bi[j].BaseVertex * declaration.VertexStride + vertexPosition.Offset, b, 0, bi[j].NumVertices, declaration.VertexStride); for (int k = 0; k != b.Length; ++k) { texcoords.Add(b[k].AsPhysX()); } if (info.IndexBuffer.IndexElementSize != IndexElementSize.SixteenBits) { int[] s = new int[info.PrimitiveCount * 3]; info.IndexBuffer.GetData <int>(info.StartIndex * 2, s, 0, info.PrimitiveCount * 3); for (int k = 0; k != info.PrimitiveCount; ++k) { indices.Add(s[k * 3 + 2] + offset); indices.Add(s[k * 3 + 1] + offset); indices.Add(s[k * 3 + 0] + offset); } } else { short[] s = new short[info.PrimitiveCount * 3]; info.IndexBuffer.GetData <short>(info.StartIndex * 2, s, 0, info.PrimitiveCount * 3); for (int k = 0; k != info.PrimitiveCount; ++k) { indices.Add(s[k * 3 + 2] + offset); indices.Add(s[k * 3 + 1] + offset); indices.Add(s[k * 3 + 0] + offset); } } } } ind = indices.ToArray(); vert = vertices.ToArray(); tex = texcoords.ToArray(); }
public ThrowParticlesObject(DefaultSprite3DBillboardParticleSystem particleSystem, IMaterial material, IModelo modelo, IPhysicObject physicObject) : base(material, modelo, physicObject) { this.particleSystem = particleSystem; }
public BaseObject(IMaterial mat, IPhysicObject py, IModelo model) : base(mat,model,py) { }
private static void ExtractData(ref Vector3[] vert, ref int[] ind, ref Vector2[] tex, IModelo model, XNA.Vector3 scale) { List<Vector3> vertices = new List<Vector3>(); List<Vector2> texcoords = new List<Vector2>(); List<int> indices = new List<int>(); for (int i = 0; i < model.MeshNumber; i++) { BatchInformation[] bi = model.GetBatchInformation(i); for (int j = 0; j < bi.Length; j++) { BatchInformation info = bi[j]; int offset = vertices.Count; Microsoft.Xna.Framework.Vector3[] a = new Microsoft.Xna.Framework.Vector3[info.NumVertices]; // Read the format of the vertex buffer VertexDeclaration declaration = bi[j].VertexBuffer.VertexDeclaration; VertexElement[] vertexElements = declaration.GetVertexElements(); // Find the element that holds the position VertexElement vertexPosition = new VertexElement(); foreach (VertexElement elem in vertexElements) { if (elem.VertexElementUsage == VertexElementUsage.Position && elem.VertexElementFormat == VertexElementFormat.Vector3) { vertexPosition = elem; // There should only be one break; } } // Check the position element found is valid if (vertexPosition == null || vertexPosition.VertexElementUsage != VertexElementUsage.Position || vertexPosition.VertexElementFormat != VertexElementFormat.Vector3) { throw new Exception("Model uses unsupported vertex format!"); } // This where we store the vertices until transformed // Read the vertices from the buffer in to the array bi[j].VertexBuffer.GetData<Microsoft.Xna.Framework.Vector3>( bi[j].BaseVertex * declaration.VertexStride + vertexPosition.Offset, a, 0, bi[j].NumVertices, declaration.VertexStride); for (int k = 0; k != a.Length; ++k) { XNA.Matrix tra = info.ModelLocalTransformation * XNA.Matrix.CreateScale(scale); Microsoft.Xna.Framework.Vector3.Transform(ref a[k], ref tra, out a[k]); vertices.Add(a[k].AsPhysX()); } foreach (VertexElement elem in vertexElements) { if (elem.VertexElementUsage == VertexElementUsage.TextureCoordinate && elem.VertexElementFormat == VertexElementFormat.Vector2) { vertexPosition = elem; // There should only be one break; } } Microsoft.Xna.Framework.Vector2[] b = new Microsoft.Xna.Framework.Vector2[info.NumVertices]; // This where we store the vertices until transformed // Read the vertices from the buffer in to the array bi[j].VertexBuffer.GetData<Microsoft.Xna.Framework.Vector2>( bi[j].BaseVertex * declaration.VertexStride + vertexPosition.Offset, b, 0, bi[j].NumVertices, declaration.VertexStride); for (int k = 0; k != b.Length; ++k) { texcoords.Add(b[k].AsPhysX()); } if (info.IndexBuffer.IndexElementSize != IndexElementSize.SixteenBits) { int[] s = new int[info.PrimitiveCount * 3]; info.IndexBuffer.GetData<int>(info.StartIndex * 2, s, 0, info.PrimitiveCount * 3); for (int k = 0; k != info.PrimitiveCount; ++k) { indices.Add(s[k * 3 + 2] + offset); indices.Add(s[k * 3 + 1] + offset); indices.Add(s[k * 3 + 0] + offset); } } else { short[] s = new short[info.PrimitiveCount * 3]; info.IndexBuffer.GetData<short>(info.StartIndex * 2, s, 0, info.PrimitiveCount * 3); for (int k = 0; k != info.PrimitiveCount; ++k) { indices.Add(s[k * 3 + 2] + offset); indices.Add(s[k * 3 + 1] + offset); indices.Add(s[k * 3 + 0] + offset); } } } } ind = indices.ToArray(); vert = vertices.ToArray(); tex = texcoords.ToArray(); }
/// <summary> /// Initializes this instance. /// </summary> public virtual void Initialize(GraphicInfo ginfo, GraphicFactory factory, IObject obj) { #if !WINDOWS_PHONE && !REACH basicDraw = factory.GetEffect("clippingPlane", false, true); getDepth = factory.GetEffect("ShadowDepth",false,true); BasicDrawSamplerState = SamplerState.LinearWrap; #endif if (useOcclusionCulling) { if(Modelo==null) Modelo = new SimpleModel(factory, "block", true); if (BasicEffect == null) { BasicEffect = factory.GetBasicEffect(); BasicEffect.TextureEnabled = false; BasicEffect.VertexColorEnabled = false; } if (BlendState == null) { BlendState = new Microsoft.Xna.Framework.Graphics.BlendState(); BlendState.ColorWriteChannels = ColorWriteChannels.None; } OcclusionQuery = factory.CreateOcclusionQuery(); OcclusionQuery.Tag = "Begin"; } this.GraphicFactory = factory; isInitialized = true; }