How to automatically create displaylists in opengl 3.0?

Started by
10 comments, last by DominicHughes 11 years, 11 months ago
I have my 3d model wavefront obj c++ parser using sscanf functions,etc,etc

and I wanted to know how I can load more then one model with the parser without it deleting the current model because the parser only uses one displaylist so I looked into it and I think I need to create a automatic diplaylist creation and use it automatically but I don't really know how to do it?.

Could anyone give me some tips or ideas on how to do this?.


OpenGL 3.0
Win32 API
C++
Advertisement
Anyone ? :) I know its deprecated but for now it doesn't really matter
What are you doing now so that you cannot have more than one? I don't see how there should be any problem with multiple objects if you just allocate and return the necessary resources when you load the object.
Well I'm basically parsing the data found in szFileName in WIN32 file dialog with this function call but it doesn't create more then one displaylist and I don't know how to make it work so the function automatically creates displaylists. the code below is that function BrotherBob?
int ModelLoad(const char *filename)
{
vector<string*> values;
vector<cordinate*> vertex;
vector<face*> faces;
vector<cordinate*> normals;
ifstream file(filename);
if(!file.is_open())
{
cout << "Model Load Failed :( make shore to set your blender or 3ds max settings correctly and or use the right file format" << endl;
return -1;
}
char buffer[256];
while(!file.eof())
{
file.getline(buffer, 256);
values.push_back(new string(buffer));
}
for(int i=0;i<values.size();i++)
{

if(values->c_str()[0] =='#')
continue;
else if(values->c_str()[0] == 'v' && values->c_str()[1] == ' ')
{

float tmpx, tmpy, tmpz;
sscanf(values->c_str(), "v %f %f %f", &tmpx, &tmpy, &tmpz);
vertex.push_back(new cordinate(tmpx, tmpy, tmpz));
}

else if(values->c_str()[0]=='v' && values->c_str()[1]=='n') //if normal vector
{
float tmpx,tmpy,tmpz; //do the same thing
sscanf(values->c_str(),"vn %f %f %f",&tmpx,&tmpy,&tmpz);
normals.push_back(new cordinate(tmpx,tmpy,tmpz));
}

else if(values->c_str()[0] == 'f')
{
int a, b, c, d, e;
if(count(values->begin(), values->end(),' ') == 3)
{

sscanf(values->c_str(),"f %d//%d %d//%d %d//%d",&a,&b,&c,&b,&d,&b);
faces.push_back(new face(b,a,c,d));


}
else
{
sscanf(values->c_str(),"f %d//%d %d//%d %d//%d %d//%d",&a,&b,&c,&b,&d,&b,&e,&b);
faces.push_back(new face(b,a,c,d,e));
}

}

}

int num; //the id for the list
num=glGenLists(1); //generate a uniqe
glNewList(num,GL_COMPILE); //and create it
for(int i=0;i<faces.size();i++)
{
if(faces->four) //if it's a quad draw a quad
{
glBegin(GL_QUADS);
//basically all I do here, is use the facenum (so the number of the face) as an index for the normal, so the 1st normal owe to the first face
//I subtract 1 because the index start from 0 in C++
glNormal3f(normals[faces->facenum-1]->x,normals[faces->facenum-1]->y,normals[faces->facenum-1]->z);
//draw the faces
glVertex3f(vertex[faces->faces[0]-1]->x,vertex[faces->faces[0]-1]->y,vertex[faces->faces[0]-1]->z);
glVertex3f(vertex[faces->faces[1]-1]->x,vertex[faces->faces[1]-1]->y,vertex[faces->faces[1]-1]->z);
glVertex3f(vertex[faces->faces[2]-1]->x,vertex[faces->faces[2]-1]->y,vertex[faces->faces[2]-1]->z);
glVertex3f(vertex[faces->faces[3]-1]->x,vertex[faces->faces[3]-1]->y,vertex[faces->faces[3]-1]->z);
glEnd();
}

else
{
glBegin(GL_TRIANGLES);
glColor3f(1, 0, 0);
glNormal3f(normals[faces->facenum-1]->x,normals[faces->facenum-1]->y,normals[faces->facenum-1]->z);
glColor3f(0, 0, 0);
glVertex3f(vertex[faces->faces[0]-1]->x,vertex[faces->faces[0]-1]->y,vertex[faces->faces[0]-1]->z);
glColor3f(0, 1, 1);
glVertex3f(vertex[faces->faces[1]-1]->x,vertex[faces->faces[1]-1]->y,vertex[faces->faces[1]-1]->z);
glColor3f(0, 1, 0);
glVertex3f(vertex[faces->faces[2]-1]->x,vertex[faces->faces[2]-1]->y,vertex[faces->faces[2]-1]->z);
glEnd();
}
}
glEndList();
//delete everything to avoid memory leaks
for(int i=0;i<values.size();i++)
delete values;
for(int i=0;i<faces.size();i++)
delete faces;
for(int i=0;i<normals.size();i++)
delete normals;
for(int i=0;i<vertex.size();i++)
delete vertex;
return num; //return with the id

}
Your function allocates a display list, builds it, and returns the handle to the newly created display list. What is it with it that doesn't work if you call it more than once?
When the function is called if there is already a model on the frustum it dissappears? I have checked thanks to gdebugger with the camera and I can't find the model anywhere. I looked at my code

This is the function call and this is called after win32 gets the filename


cube=ModelLoad(szFileName);


maybe when I call this again it deletes the contents of cube since cube is what holds the displaylist?
There is nothing in the function you posted that removes anything from anywhere. The content of previous display lists are not affected at all, since, as I said, your function allocates a new display list each time it's called; it doesn't overwrite or delete anything, not from the screen nor from any display lists. If you're having problems with your display lists being removed, then it's somewhere else.
I will look around and report what I find :)
Ah ha it looks like when ever the filename is changed it makes the model on the frustum "before" the next filename dissappear ? strange hmmm more exploring in this code is required.
The problem is in this code below what is happening is szFileName can only store one filename at a time so I need to know how to store more then one filename do you know how I could do that brother bob?
switch(LOWORD(wParam))
{
case ID_BOX:
{



ZeroMemory(&ofn, sizeof(ofn));
ofn.lStructSize = sizeof(ofn); // SEE NOTE BELOW
ofn.hwndOwner = hwnd;
ofn.lpstrFilter = ".OBJ (*.obj)\0*.obj\0All Files (*.*)\0*.*\0";
ofn.lpstrFile = szFileName;
ofn.nMaxFile = MAX_PATH;
ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY | OFN_LONGNAMES;
ofn.lpstrDefExt = "obj";


if(GetOpenFileName(&ofn))
{
cube=ModelLoad(szFileName);

}


}
break;

This topic is closed to new replies.

Advertisement