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;

}

}

<<<Back