예제 #1
0
        private void WriteMesh(Mesh storedMesh, OutputMesh output /*,bool useUnityNormals*/)
        {
            if (output.GetVertices().Length > CPNTessellationProcess.MAX_VERTICES_SIZE)
            {
                return;
            }

            storedMesh.Clear();
            storedMesh.vertices = output.GetVertices();
            storedMesh.uv       = output.GetUVs();
            storedMesh.normals  = output.GetNormals();

            int[][] triangles = output.GetTriangles();
            if (triangles.Length == 0)
            {
                storedMesh.SetTriangles(new int[0], 0);
            }
            else
            {
                storedMesh.subMeshCount = triangles.Length;
                for (int i = 0; i < triangles.Length; i++)
                {
                    storedMesh.SetTriangles(triangles[i], i);
                }
            }
        }
예제 #2
0
 public void Test(ITestAssert testAssert)
 {
     testAssert.CallTest(GetName());
     Execute();
     testAssert.AssertEquals(mesh.GetVertices().Length, 10, "Mesh Vertices");
     testAssert.AssertEquals(mesh.GetNormals().Length, 10, "Mesh Normals");
     //testAssert.AssertEquals(mesh.GetUVs().Length, 0, "Mesh UVs");
     //testAssert.AssertEquals(mesh.GetTangents().Length, 0, "Mesh Tangents");
     testAssert.AssertEquals(mesh.GetTriangles()[0].Length, 27, "Mesh Indices");
 }
예제 #3
0
        public void Execute()
        {
            CurvedPolygonsNet cpnet = asset.GetCPN();

            CurvedPolyVariants cpnVariants = new CurvedPolyVariants();

            cpnVariants.SetCPN(cpnet);

            short[] loqs = { 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 };

            CPNTessellationProcess tessellationProcess = ProcessesKeeper.GetTessellationProcess();

            TessellationOutput output = tessellationProcess.InitProcess(cpnet, loqs);

            //Debug.Log("cpnet.GetGeometriesCount() " + cpnet.GetGeometriesCount());

            tessellationProcess.BuildProfile();

            int[] builtTrianglesCount = output.GetBuiltTrianglesSize();
            int   builtVerticesCount  = output.GetBuiltVerticesSize();

            uvs_      = new Vector2[builtVerticesCount];
            vertices_ = new Vector3[builtVerticesCount];
            normals_  = new Vector3[builtVerticesCount];
            indices_  = new int[builtTrianglesCount.Length][];
            for (int i = 0; i < builtTrianglesCount.Length; i++)
            {
                indices_[i] = new int[builtTrianglesCount[i] * 3];
            }

            OutputMesh mesh = null;

            mesh = new OutputMesh(vertices_, uvs_, normals_, indices_);
            tessellationProcess.WriteMesh(mesh);

            //here
            int id = cpnVariants.GetFreeTessellationRecordId();

            cpnVariants.SetRecord(id, new OutputMesh(vertices_, uvs_, normals_, indices_), output);

            //this.outMesh = cpnVariants.GetMeshOutput(id).GetNewCloneVariant();

            CPNSubset subsSet = new CPNSubset();

            TessellationOutput output2 = tessellationProcess.InitProcess(cpnet, loqs, subsSet);

            this.mesh2 = new OutputMesh(outMesh.GetVertices(), outMesh.GetUVs(),
                                        outMesh.GetNormals(), outMesh.GetTriangles());
            tessellationProcess.WriteMesh(mesh2);
        }
예제 #4
0
        public static int CreateSideTriangles2(OutputMesh builder,
                                               IMeshIndicesArray inside, IMeshIndicesArray outside,
                                               int intTrIndex)
        {
            Vector3[] vs = builder.GetVertices();

            int   outerEdgeLength = outside.Count();
            int   innerEdgeLength = inside.Count();
            int   outerIndex      = 0;
            int   innerIndex      = 0;
            float dtInner         = innerEdgeLength > 1 ? 1.0f / (innerEdgeLength - 1) : 1;
            float dtOuter         = outerEdgeLength > 1 ? 1.0f / (outerEdgeLength - 1) : 1;

            float kIn  = 0;
            float kOut = 1;

            if (outerEdgeLength > 1 && innerEdgeLength > 1)
            {
                Vector3 A = vs[outside.GetIndex()];
                Vector3 B = vs[outside.GetNext()];
                Vector3 C = vs[inside.GetIndex()];
                Vector3 D = vs[outside.GetAtIndex(outerEdgeLength - 2)];
                Vector3 E = vs[outside.GetAtIndex(outerEdgeLength - 1)];
                Vector3 F = vs[inside.GetAtIndex(innerEdgeLength - 1)];

                kIn  = Vector3.Dot(C - A, B - A) / Vector3.Dot(B - A, B - A);
                kOut = Vector3.Dot(F - D, E - D) / Vector3.Dot(E - D, E - D);

                float rect = 1.0f / (outerEdgeLength - 1);
                kIn  = kIn * rect;
                kOut = 1 - (1 - kOut) * rect;
            }

            while (innerIndex < innerEdgeLength - 1 || outerIndex < outerEdgeLength - 1)
            {
                if (innerIndex < innerEdgeLength - 1)
                {
                    if (outerIndex < outerEdgeLength - 1)
                    {
                        int id1 = outside.GetIndex();
                        int id2 = inside.GetIndex();
                        int id3 = outside.GetNext();
                        int id4 = inside.GetNext();

                        float tOuter = dtOuter * (outerIndex);
                        float tInner = dtInner * (innerIndex) * (kOut - kIn) + kIn;

                        if (tInner <= tOuter)
                        {
                            intTrIndex = builder.WriteTriangle(intTrIndex, id1, id4, id2);
                            innerIndex++;
                            inside.Move();
                        }
                        else
                        {
                            intTrIndex = builder.WriteTriangle(intTrIndex, id1, id3, id2);
                            outerIndex++;
                            outside.Move();
                        }
                    }
                    else
                    {
                        int id1 = outside.GetIndex();
                        int id2 = inside.GetIndex();
                        int id4 = inside.GetNext();

                        intTrIndex = builder.WriteTriangle(intTrIndex, id1, id4, id2);
                        innerIndex++;
                        inside.Move();
                    }
                }
                else
                {
                    int id1 = outside.GetIndex();
                    int id2 = inside.GetIndex();
                    int id3 = outside.GetNext();
                    intTrIndex = builder.WriteTriangle(
                        intTrIndex, id1, id3, id2);
                    outerIndex++;
                    outside.Move();
                }
            }
            return(intTrIndex);
        }
예제 #5
0
        public static int CreateSideTriangles(OutputMesh builder,
                                              IMeshIndicesArray inside, IMeshIndicesArray outside,
                                              int intTrIndex)
        {
            /*Vector3[] vs = builder.GetVertices();
             * int outerEdgeLength = outside.Count();
             * int innerEdgeLength = inside.Count();
             * int outerIndex = 0;
             * int innerIndex = 0;
             *
             * while (innerIndex < innerEdgeLength - 1 || outerIndex < outerEdgeLength - 1)
             * {
             *  if (innerIndex < innerEdgeLength - 1)
             *  {
             *      if (outerIndex < outerEdgeLength - 1)
             *      {
             *          int id1 = outerIndex;
             *          int id2 = innerIndex;
             *          int id3 = outside.GetNext();
             *          int id4 = inside.GetNext();
             *
             *          Vector3 P1 = vs[id1];
             *          Vector3 P2 = vs[id2];
             *          Vector3 P3 = vs[id3];
             *          Vector3 P4 = vs[id4];
             *
             *          float dInner = (P4 - P1).sqrMagnitude;
             *          float dOuter = (P3 - P2).sqrMagnitude;
             *
             *          if (dInner < dOuter) {
             *              intTrIndex = builder.WriteTriangle(intTrIndex, id1, id4, id2);
             *              innerIndex++;
             *              inside.Move();
             *          } else {
             *              intTrIndex = builder.WriteTriangle(intTrIndex, id1, id3, id2);
             *              outerIndex++;
             *              outside.Move();
             *
             *          }
             *      }
             *      else
             *      {
             *
             *          int id1 = outerIndex;
             *          int id2 = innerIndex;
             *          int id4 = inside.GetNext();
             *
             *          intTrIndex = builder.WriteTriangle(intTrIndex, id1, id4, id2);
             *          innerIndex++;
             *          inside.Move();
             *      }
             *  }
             *  else
             *  {
             *      int id1 = outerIndex;
             *      int id2 = innerIndex;
             *      int id3 = outside.GetNext();
             *      intTrIndex = builder.WriteTriangle(
             *          intTrIndex, id1, id3, id2);
             *      outerIndex++;
             *      outside.Move();
             *  }
             * }
             *
             * return intTrIndex;*/


            Vector3[] vs = builder.GetVertices();

            int outerEdgeLength = outside.Count();
            int innerEdgeLength = inside.Count();
            int outerIndex      = 0;
            int innerIndex      = 0;

            while (innerIndex < innerEdgeLength - 1 || outerIndex < outerEdgeLength - 1)
            {
                if (innerIndex < innerEdgeLength - 1)
                {
                    if (outerIndex < outerEdgeLength - 1)
                    {
                        int id1 = outside.GetIndex();
                        int id2 = inside.GetIndex();
                        int id3 = outside.GetNext();
                        int id4 = inside.GetNext();

                        Vector3 P1 = vs[id1];
                        Vector3 P2 = vs[id2];
                        Vector3 P3 = vs[id3];
                        Vector3 P4 = vs[id4];

                        float dInner = (P4 - P1).sqrMagnitude;
                        float dOuter = (P3 - P2).sqrMagnitude;

                        if (dInner <= dOuter)
                        {
                            intTrIndex = builder.WriteTriangle(intTrIndex, id1, id4, id2);
                            innerIndex++;
                            inside.Move();
                        }
                        else
                        {
                            intTrIndex = builder.WriteTriangle(intTrIndex, id1, id3, id2);
                            outerIndex++;
                            outside.Move();
                        }
                    }
                    else
                    {
                        int id1 = outside.GetIndex();
                        int id2 = inside.GetIndex();
                        int id4 = inside.GetNext();

                        intTrIndex = builder.WriteTriangle(intTrIndex, id1, id4, id2);
                        innerIndex++;
                        inside.Move();
                    }
                }
                else
                {
                    int id1 = outside.GetIndex();
                    int id2 = inside.GetIndex();
                    int id3 = outside.GetNext();
                    intTrIndex = builder.WriteTriangle(
                        intTrIndex, id1, id3, id2);
                    outerIndex++;
                    outside.Move();
                }
            }
            return(intTrIndex);
        }
 public Vector3 GetNextValue()
 {
     return(builder.GetVertices()[GetNext()]);
 }
예제 #7
0
 public void BuildModel(GameObject gameObject)
 {
     Execute();
     MeshAssigner.AssignMesh(gameObject, mesh2.GetVertices(), mesh2.GetNormals(),
                             mesh2.GetUVs(), outMesh.GetTriangles());
 }
예제 #8
0
 public static void AssignMesh(GameObject gameObject, OutputMesh outputMesh)
 {
     AssignMesh(gameObject, outputMesh.GetVertices(), outputMesh.GetNormals(),
                outputMesh.GetUVs(), outputMesh.GetTriangles());
 }
 public Vector3 GetNextValue()
 {
     return(source.GetVertices()[GetNext()]);
 }