Guys, sorry for creating another thread for this, but I would like to know how is the way to proper render a NURBS into a Display List. I tried but the problem is the surface doesn’t render correctly (it stays buggy, malformed) inside a display list. When I render normally (at display func, i.e) it works well, with the exactly same steps as rendering to a display list. The function is as follow:
void DisplayList_Montanha()
{
GLUnurbsObj *theNurb;
GLfloat ctlpoints[4][4][3];
GLfloat knots[8] = {0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0};
/* Define o material da montanha */
GLfloat MMatSpecular[4] = { 1, 1, 1, 1 };
GLfloat MMatDifuseAmbient[4] = {0.5, 0.5, 0.5, 1.0};
GLfloat MMatShininess[1] = { 40 };
GLfloat MMatEmissao[4] = {0, 0, 0, 1.0};
int u, v;
for (u = 0; u < 4; u++) {
for (v = 0; v < 4; v++) {
ctlpoints[u][v][0] = 2.0*((GLfloat)u - 1.5);
ctlpoints[u][v][1] = 2.0*((GLfloat)v - 1.5);
if ( (u == 1 || u == 2) && (v == 1 || v == 2))
ctlpoints[u][v][2] = 3.0;
else
ctlpoints[u][v][2] = -3.0;
}
}
theNurb = gluNewNurbsRenderer();
gluNurbsProperty(theNurb, GLU_SAMPLING_TOLERANCE, 25.0);
gluNurbsProperty(theNurb, GLU_DISPLAY_MODE, GLU_FILL);
//gluNurbsProperty(theNurb, GLU_AUTO_LOAD_MATRIX, GLU_FALSE);
Dl_Montanha = glGenLists(1);
glNewList(Dl_Montanha,GL_COMPILE);
/* seta o material para a montanha */
glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, MMatEmissao);
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, MMatSpecular);
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, MMatDifuseAmbient);
glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, MMatShininess);
gluBeginSurface(theNurb);
gluNurbsSurface(theNurb,8, knots, 8, knots, 4*3, 3, &ctlpoints[0][0][0], 4, 4, GL_MAP2_VERTEX_3);
gluEndSurface(theNurb);
glEndList();
gluDeleteNurbsRenderer(theNurb);
}
regards!