void Tesselator(int
NumberOfVVertices, int NumberOfUVertices)
{
Vstep = 1 / ( NumberOfVVertices-1);
VstepMatrix = (Vstep3,
0, 0, 0,
0, Vstep2,
0, 0,
0, 0, Vstep, 0,
0,
0, 0,1);
Ustep = 1 / ( NumberOfUVertices-1);
UstepMatrix = (Ustep3,
0, 0, 0,
0, Ustep2, 0, 0,
0, 0, Ustep, 0,
0, 0, 0, 1);
M = (VstepMatrix (B * P * BT)) * UstepMatrix;
Vtx = M33;
dvVtx = M30 + M31 + M32;
ddvVtx = 6 * M30 + 2 * M31;
dddvVtx = 6 * M30;
duVtx = M03 + M13 + M23;
dvduVtx = M00 + M01 + M02 + M10
+ M11 + M12 + M20 + M21 +
M22 ;
ddvduVtx = 6 * (M00 + M10 + M20) 2 * (M01
+ M11 + M21) ;
dddvduVtx = 6 * (M00 + M10 + M20) ;
dduVtx = 6 * M03 ;
dvdduVtx = 6 * (M00 + M01 + M02) ;
ddvdduVtx = 36 * M00 + 12 * M01 ;
dddvdduVtx = 36 * M00 ;
ddduVtx = 6 * M03 + 2 * M13 ;
dvddduVtx = 6 * (M00 + M01 + M02)
+ 2 * (M10 + M11 + M12) ;
ddvddduVtx = 36 * M00 + 12 * (M01 + M10) +
4 * M11;
dddvddduVtx = 36 * M00 + 12 * M10;
// TangV
// We don’t forget the factors of vTVector
f3210 = (3, 0, 0, 0,
0, 2, 0, 0,
0, 0, 1, 0,
0, 0, 0, 0);
MM = f3210 * M;
TangentV = MM32;
duTangentV = MM02 + MM12 + MM22;
dduTangentV = MM02 * 6.F + MM12 * 2.F;
ddduTangentV = MM02 * 6.F;
dvTangentV = MM30+MM31;
dvduTangentV = MM00+MM01 + MM10+MM11
+ MM20+MM21;
dvdduTangentV = = MM00+MM01 * 6.F + = MM10+MM11
* 2.F;
dvddduTangentV = = MM00+MM01 * 6.F;
ddvTangentV = MM30*2.F;
ddvduTangentV = MM00*2.F + MM10*2.F + MM20*2.F;
ddvdduTangentV = MM00*12.F + MM10*4.F;
ddvddduTangentV = MM00*12.F;
// TangU
// We don’t forget the factors of uTVector
MM = M *f3210;
TangentU = MM23;
duTangentU = MM03 + MM13;
dduTangentU = MM03 * 2.F;
dvTangentU = MM20+MM21+MM22;
dvduTangentU = MM00+MM01+MM02 + MM10+MM11+MM12;
dvdduTangentU = = MM00+MM01+MM02 * 2.F;
ddvTangentU = MM20*6.F+MM21*2.F;
ddvduTangentU = MM00*6.F+MM01*2.F + MM10*6.F+MM11*2.F;
ddvdduTangentU = MM00*12.F+MM01*4.F;
dddvTangentU = MM20*6.F;
dddvduTangentU = MM00*6.F + MM10*6.F;
dddvdduTangentU = MM00 * 12.F;
for(unsigned int vInt=0; vInt < NumberOfVVertices; vInt++)
{
lVtx = Vtx;
lduVtx = duVtx;
ldduVtx = dduVtx;
lTangentV = TangentV;
lduTangentV = duTangentV;
ldduTangentV = dduTangentV;
lTangentU = TangentU;
lduTangentU = duTangentU;
for(unsigned int uInt=0; uInt < NumberOfUVertices; uInt++)
{
output(Vtx);
Normal = Normalize(CrossProduct(TangentV, TangentU));
output(Normal);
lVtx +=
lduVtx;
lduVtx += ldduVtx;
ldduVtx += ddduVtx;
lTangentV += lduTangentV;
lduTangentV += ldduTangentV;
ldduTangentV += ddduTangentV;
lTangentU += lduTangentU;
lduTangentU += ldduTangentU;
}
// Vertex
Vtx += dvVtx;
dvVtx += ddvVtx;
ddvVtx += dddvVtx;
duVtx += dvduVtx;
dvduVtx += ddvduVtx;
ddvduVtx += dddvduVtx;
dduVtx += dvdduVtx;
dvdduVtx += ddvdduVtx;
ddvdduVtx += dddvdduVtx;
ddduVtx += dvddduVtx;
dvddduVtx += ddvddduVtx;
ddvddduVtx += dddvddduVtx;
//TangV
TangentV += dvTangentV;
duTangentV += dvduTangentV;
dduTangentV += dvdduTangentV;
ddduTangentV += dvddduTangentV;
dvTangentV += ddvTangentV;
dvduTangentV += ddvduTangentV;
dvdduTangentV += ddvdduTangentV;
dvddduTangentV += ddvddduTangentV;
// TangU
TangentU += dvTangentU;
duTangentU += dvduTangentU;
dduTangentU += dvdduTangentU;
dvTangentU += ddvTangentU;
dvduTangentU += ddvduTangentU;
dvdduTangentU += ddvdduTangentU;
ddvTangentU += dddvTangentU;
ddvduTangentU += dddvduTangentU;
ddvdduTangentU += dddvdduTangentU;
}
} |