public static MeshSplitter Split(agx.Vec3Vector vertices, agx.UInt32Vector indices, Func <agx.Vec3, Vector3> transformer, int maxNumVertices = Int16.MaxValue) { var splitter = new MeshSplitter(); splitter.m_vertices = new List <Vector3>(vertices.Count); for (int i = 0; i < vertices.Count; ++i) { splitter.m_vertices.Add(transformer(vertices[i])); } for (int i = 0; i < indices.Count; i += 3) { if (i == 0 || splitter.m_subMeshData.Last().NumVertices >= maxNumVertices) { splitter.m_subMeshData.Add(new SubMeshData(maxNumVertices)); } splitter.m_subMeshData.Last().Add(splitter.m_vertices[Convert.ToInt32(indices[i + 0])], splitter.m_vertices[Convert.ToInt32(indices[i + 2])], splitter.m_vertices[Convert.ToInt32(indices[i + 1])]); } foreach (var data in splitter.m_subMeshData) { data.CreateMesh(); } return(splitter); }
/*--------------------------------------------------Creating terrain--------------------------------------------------*/ //public void Create_Terrain(Guid guid, string heightmap, Vector3 position, string materialName, double restitution, double friction, double height) public AgX_Scene(Guid guid, List <Vector3> vertices, List <int> triangles, Vector3 position, string materialName) { this.guid = guid; //AgX: agx.Vec3Vector agx_vertices = new agx.Vec3Vector(); agx.UInt32Vector agx_indices = new agx.UInt32Vector(); for (int i = 0; i < vertices.Count; i++) { agx_vertices.Add(Operations.ToAgxVec3(vertices[i])); } for (int i = 0; i < triangles.Count; i++) { agx_indices.Add((uint)triangles[i]); } terrain = new agx.RigidBody(); //uint optionsMask = (uint)agxCollide.Trimesh.TrimeshOptionsFlags.TERRAIN; var terrain_trimesh = new agxCollide.Trimesh(agx_vertices, agx_indices, "handmade terrain");//, optionsMask, height); var geometry = new agxCollide.Geometry(); geometry.add(terrain_trimesh); geometry.setMaterial(new agx.Material(materialName)); terrain.add(geometry); terrain.setMotionControl(agx.RigidBody.MotionControl.STATIC); //position.y -= height; terrain.setLocalPosition(Operations.ToAgxVec3(position));//move right and -height for global 0 ///Adds terrain to simulation //simulation.add(terrain); Agx_Simulation.sim_Instance.add(terrain); }
public static MeshSplitter Split(agx.Vec3Vector vertices, agx.UInt32Vector indices, Func <agx.Vec3, Vector3> transformer, int maxNumVertices = Int16.MaxValue) { return(Split(vertices, indices, null, transformer, maxNumVertices)); }
public static MeshSplitter Split(agx.Vec3Vector vertices, agx.UInt32Vector indices, agx.Vec2Vector uvs, Func <agx.Vec3, Vector3> vertexTransformer, int maxNumVertices = Int16.MaxValue) { var splitter = new MeshSplitter(); if (vertices.Count < maxNumVertices) { splitter.m_subMeshData.Add(new SubMeshData(uvs != null, vertices.Count)); splitter.m_subMeshData.Last().CreateMesh(vertices, indices, uvs, vertexTransformer); return(splitter); } // This works but isn't correct. It's not possible to recover // the triangles list for a mesh with #vertices < MaxValue. splitter.m_vertices = new List <Vector3>(vertices.Count); for (int i = 0; i < vertices.Count; ++i) { splitter.m_vertices.Add(vertexTransformer(vertices[i])); } var hasUvs = uvs != null && uvs.Count == vertices.Count; for (int i = 0; i < indices.Count; i += 3) { if (i == 0 || splitter.m_subMeshData.Last().NumVertices >= maxNumVertices) { splitter.m_subMeshData.Add(new SubMeshData(hasUvs, maxNumVertices)); } if (hasUvs) { splitter.m_subMeshData.Last().Add(splitter.m_vertices[Convert.ToInt32(indices[i + 0])], splitter.m_vertices[Convert.ToInt32(indices[i + 2])], splitter.m_vertices[Convert.ToInt32(indices[i + 1])], uvs[Convert.ToInt32(indices[i + 0])].ToVector2(), uvs[Convert.ToInt32(indices[i + 2])].ToVector2(), uvs[Convert.ToInt32(indices[i + 1])].ToVector2()); } else { splitter.m_subMeshData.Last().Add(splitter.m_vertices[Convert.ToInt32(indices[i + 0])], splitter.m_vertices[Convert.ToInt32(indices[i + 2])], splitter.m_vertices[Convert.ToInt32(indices[i + 1])]); } } foreach (var data in splitter.m_subMeshData) { data.CreateMesh(); } return(splitter); }
public static agx.Vec3Vector ToAgxVec3Vector(Vector3[] vector3) { agx.Vec3Vector vec3 = vector3.Count() > 0 ? new agx.Vec3Vector(vector3.Count()) : new agx.Vec3Vector(); for (int i = 0; i < vector3.Count(); i++) { vec3.Add(new agx.Vec3(vector3[i].x, vector3[i].y, vector3[i].z)); } return(vec3); }
public agxCollide.Mesh CreateShape(Func <Vector3, Vector3> transformer, CollisionMeshOptions.MeshMode mode) { // The transformer will return the vertex in left handed frame since // it has been scaled. var vertices = new agx.Vec3Vector(Vertices.Select(v => transformer(v).ToHandedVec3()).ToArray()); var indices = new agx.UInt32Vector(Indices.Select(i => (uint)i).ToArray()); return(mode == CollisionMeshOptions.MeshMode.Trimesh ? new agxCollide.Trimesh(vertices, indices, "AGXUnity.Mesh: Trimesh") : new agxCollide.Convex(vertices, indices, "AGXUnity.Mesh: " + mode.ToString())); }
public bool Reduce(agx.Vec3Vector vertices, agx.UInt32Vector indices, float reductionRatio, float reductionAggressiveness) { if (vertices.Count < 3 || (indices.Count % 3) != 0) { return(false); } m_vertices = vertices; m_indices = indices; return(Reduce(reductionRatio, reductionAggressiveness)); }
public void CreateMesh(agx.Vec3Vector vertices, agx.UInt32Vector indices, agx.Vec2Vector uvs, Func <agx.Vec3, Vector3> vertexTransformer) { m_vertices.AddRange(from v in vertices select vertexTransformer(v)); if (uvs != null) { m_uvs.AddRange(from uv in uvs select uv.ToVector2()); } for (int i = 0; i < indices.Count; i += 3) { m_indices.Add(Convert.ToInt32(indices[i + 0])); m_indices.Add(Convert.ToInt32(indices[i + 2])); m_indices.Add(Convert.ToInt32(indices[i + 1])); } CreateMesh(); }
public bool Reduce(float reductionRatio, float reductionAggressiveness) { if (m_vertices.Count == 0) { return(false); } var reducedVertices = new agx.Vec3Vector(); var reducedIndices = new agx.UInt32Vector(); if (agxUtil.agxUtilSWIG.reduceMesh(Vertices, Indices, reducedVertices, reducedIndices, reductionRatio, reductionAggressiveness) is var success) { m_vertices = reducedVertices; m_indices = reducedIndices; } return(success); }
public void Apply(agx.Vec3Vector vertices, agx.UInt32Vector indices) { Vertices = vertices.Select(v => v.ToVector3()).ToArray(); Indices = indices.Select(i => (int)i).ToArray(); }