public void EvaluatePolyline(CurvedPolygonsNet net, OutputMesh mesh, CPNGuide guide) { bool uvAvailable = net.GetUv() != null && net.GetUv().Length != 0 && mesh.DoUseUVs(); int countP = mesh.CountProperties(); //bool tgAvailable = net.GetTangents() != null && net.GetTangents().Length != 0; short[] tessellationDegrees = CPNGuide_loqs; guide.vBuffer = CreateBufferWithIndices(guide.vBuffer, net.GetVertices(), guide.GetIndices()); guide.nBuffer = CreateBufferWithIndices(guide.vBuffer, net.GetNormals(), guide.GetIndices()); if (uvAvailable) { guide.uvsBuffer = CreateBufferWithIndices(guide.uvsBuffer, net.GetUv(), guide.GetIndices()); } if (countP > 0) { guide.PreparePropertiesBuffers(countP); for (int k = 0; k < countP; k++) { guide.propertiesBuffer[k] = CreateBufferWithIndices(guide.propertiesBuffer[k], net.GetProperties3()[k], guide.GetIndices()); } } }
public void EvaluateEdge(CurvedPolygonsNet net, OutputMesh mesh, CPNGuide guide, short edgeLength, short[] edge, int edgeIndex, short[] edgeHints, float[] edgeWeights, int[] edgeProfile, int realEdgeIndex) { bool isLinear = edgeLength == 2; bool uvAvailable = net.GetUv() != null && net.GetUv().Length != 0 && mesh.DoUseUVs(); int countP = mesh.CountProperties(); short[] tessellationDegrees = CPNGuide_loqs; if (isLinear) { FillBufferWithLine(guide.vBuffer, net.GetVertices(), edge, edgeIndex); if (uvAvailable) { FillBufferWithLine(guide.uvsBuffer, net.GetUv(), edge, edgeIndex); } guide.PreparePropertiesBuffers(countP); for (int k = 0; k < countP; k++) { FillBufferWithLine(guide.propertiesBuffer[k], net.GetProperties3()[k], edge, edgeIndex); } } else { FillBuffer(guide.vBuffer, net.GetVertices(), edge, edgeIndex); if (uvAvailable) { FillBuffer(guide.uvsBuffer, net.GetUv(), edge, edgeIndex); } guide.PreparePropertiesBuffers(countP); for (int k = 0; k < countP; k++) { FillBuffer(guide.propertiesBuffer[k], net.GetProperties3()[k], edge, edgeIndex); } } //if (tgAvailable) //Avoid tangents for now // FillBuffer(linear, polyline.tgsBuffer, net.GetTangents(), edge, edgeIndex); int handleIndex = (realEdgeIndex) << 1; guide.w2 = edgeWeights[handleIndex + 0]; guide.w3 = edgeWeights[handleIndex + 1]; guide.edgeNormal = net.GetNormals()[net.GetNumberOfVertices() + realEdgeIndex]; guide.firstNormal = net.GetNormals()[edge[edgeIndex + 0]]; guide.lastNormal = net.GetNormals()[edge[edgeIndex + (isLinear? 1 : 3)]]; //float r = edgeRots == null ? 0 : edgeRots[edgeProfileIndex]; //float r3 = edgeRots == null ? 0 : edgeRots[handleIndex + 1]; int N1 = 1; int N2 = 1; if (!isLinear) { N1 = tessellationDegrees[edgeHints[handleIndex + 0]]; N2 = tessellationDegrees[edgeHints[handleIndex + 1]]; } int N = guide.GetN(); float c = (2.0f * N1 * N2) / (N * (N1 + N2)); guide.tessellationStepA = c / N1; guide.tessellationStepB = c * 0.5f * (N1 - N2) / (N1 * N2 * N * 1.0f); int edgeInternal = edgeProfile[((realEdgeIndex) << 2) + 2]; float step = 1.0f / N; for (int j = 1; j < N; j++) { int index = edgeInternal + j - 1; EvalAt(j * step, guide); mesh.SetVertex(index, EvalVertex(guide)); if (uvAvailable) { mesh.SetUV(index, EvalUV(guide)); } for (int k = 0; k < countP; k++) { mesh.SetProperty3(index, k, EvalProperty(guide, k)); } } }