Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        /*--------------------------------------------------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);
        }
Ejemplo n.º 3
0
 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));
 }
Ejemplo n.º 4
0
        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);
        }
Ejemplo n.º 5
0
        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);
        }
Ejemplo n.º 6
0
        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()));
        }
Ejemplo n.º 7
0
        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));
        }
Ejemplo n.º 8
0
            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();
            }
Ejemplo n.º 9
0
        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);
        }
Ejemplo n.º 10
0
 public void Apply(agx.Vec3Vector vertices, agx.UInt32Vector indices)
 {
     Vertices = vertices.Select(v => v.ToVector3()).ToArray();
     Indices  = indices.Select(i => (int)i).ToArray();
 }