public void Build( HardwareVertexBuffer destVertexBuffer, int vertexStart, HardwareIndexBuffer destIndexBuffer, int indexStart )
{
if ( controlPoints.Count == 0 )
{
return;
}
vertexBuffer = destVertexBuffer;
vertexOffset = vertexStart;
indexBuffer = destIndexBuffer;
indexOffset = indexStart;
// lock just the region we are interested in
IntPtr lockedBuffer = vertexBuffer.Lock(
vertexOffset * declaration.GetVertexSize( 0 ),
requiredVertexCount * declaration.GetVertexSize( 0 ),
BufferLocking.NoOverwrite );
DistributeControlPoints( lockedBuffer );
// subdivide the curves to the max
// Do u direction first, so need to step over v levels not done yet
int vStep = 1 << maxVLevel;
int uStep = 1 << maxULevel;
// subdivide this row in u
for ( int v = 0; v < meshHeight; v += vStep )
{
SubdivideCurve( lockedBuffer, v * meshWidth, uStep, meshWidth / uStep, uLevel );
}
// Now subdivide in v direction, this time all the u direction points are there so no step
for ( int u = 0; u < meshWidth; u++ )
{
SubdivideCurve( lockedBuffer, u, vStep * meshWidth, meshHeight / vStep, vLevel );
}
// don't forget to unlock!
vertexBuffer.Unlock();
// Make triangles from mesh at this current level of detail
MakeTriangles();
}