public Vector3 evalProperty(int k, int sIndex, CPNSideEdge sidedEdge, float t) { int backSIndex = prev.N - sIndex; evaluator.EvalAt(t, sidedEdge); Vector3 A = evaluator.EvalProperty(sidedEdge, k); Vector3 B = prev.properties[k][backSIndex]; Vector3 C = next.properties[k][sIndex]; Vector3 A0 = buffer.properties[k][0]; Vector3 AN = buffer.properties[k][buffer.N]; float sB = 1 - prev.ts[backSIndex]; float sC = prev.ts[sIndex]; float s = (1 - t) * sB + t * sC; float size = (1 - s) * (1 - s) * (1 - s) /* * s0[==1] */ + (s1 * (1 - s) * (1 - s) + s2 * s * (1 - s) + s3 * s * s) * s; //float sB = 1 - prev.ts[backSIndex]; //float sC = prev.ts[sIndex]; //float s = (1 - t) * sB + t * sC; Vector3 At = (1 - t) * A0 + t * AN; //Vector3 PA = A - At; Vector3 PA = (A - At) * size; Vector3 PBC = (1 - t) * B + t * C; return(PA + PBC); //return A + (1 - t) * (B - A0) + t * (C - AN); }
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); } } }