private Vector3 evalVertex(CPNSideEdge sidedEdgeA, CPNSideEdge sidedEdgeB, float U, float V) { //int backBIndex = bufferPrev.N - Bindex; evaluator.EvalAt(0, sidedEdgeA); Vector3 v0 = evaluator.EvalVertex(sidedEdgeA); Vector3 dA0 = evaluator.EvalDev(sidedEdgeA); evaluator.EvalAt(U, sidedEdgeA); Vector3 vA = evaluator.EvalVertex(sidedEdgeA); Vector3 nA = evaluator.EvalNormal(sidedEdgeA); evaluator.EvalAt(1 - V, sidedEdgeB); Vector3 vB = evaluator.EvalVertex(sidedEdgeB); Vector3 nB = evaluator.EvalNormal(sidedEdgeB); evaluator.EvalAt(1, sidedEdgeB); Vector3 dB0 = -evaluator.EvalDev(sidedEdgeB); float kA = -Vector3.Dot(dB0, nA); Vector3 part1 = vA + /*sidedEdgeA.guide[0].thickness **/ ((vB - v0) + kA * V * nA); float kB = -Vector3.Dot(dA0, nB); Vector3 part2 = vB + /*sidedEdgeB.guide[0].thickness * */ ((vA - v0) + kB * U * nB); float U2 = U * U; float V2 = V * V; return((part1 * U2 + part2 * V2) / (U2 + V2)); }
public void writeWithGuideBack(CPNSideEdge guide, int N, float step, OutputMesh mesh, CPNGuideEvaluator evaluator) { this.step = step; requestSize(N + 1); //We should have only one thickness on multisided edge, you know? this.thickness = 1; for (int i = 0; i <= N; i++) { //This is the eval-back evaluator.EvalAt(1.0f - i * step, guide); Vector3 dev = evaluator.EvalDev(guide); vertices[i] = evaluator.EvalVertex(guide); if (i == 0) { devFirst = dev; } if (i == N) { devLast = dev; } evaluator.EvalAt(i * step + DELTA, guide); verticesDplus[i] = evaluator.EvalVertex(guide); evaluator.EvalAt(i * step - DELTA, guide); verticesDminus[i] = evaluator.EvalVertex(guide); normals[i] = evaluator.EvalNormal(guide, dev).normalized; uvs[i] = evaluator.EvalUV(guide); for (int k = 0; k < countP; k++) { properties[k][i] = evaluator.EvalProperty(guide, k); } } }