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); } } }
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"); }
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); }
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); }
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()]); }
public void BuildModel(GameObject gameObject) { Execute(); MeshAssigner.AssignMesh(gameObject, mesh2.GetVertices(), mesh2.GetNormals(), mesh2.GetUVs(), outMesh.GetTriangles()); }
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()]); }