/* attempt to deal with prototype, bootstrap, jquery conflicts */ /* for dropdown menus */

\$10

### Image of the Day Submit

IOTD | Top Screenshots

## How to automatically create displaylists in opengl 3.0?

Old topic!

Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

11 replies to this topic

### #1DarkHorseKnight  Members

Posted 18 May 2012 - 07:11 AM

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++

### #2DarkHorseKnight  Members

Posted 18 May 2012 - 02:16 PM

Anyone ? I know its deprecated but for now it doesn't really matter

### #3Brother Bob  Moderators

Posted 18 May 2012 - 05:00 PM

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.

### #4DarkHorseKnight  Members

Posted 19 May 2012 - 07:25 AM

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?


{

vector<string*> values;

vector<cordinate*> vertex;

vector<face*> faces;

vector<cordinate*> normals;

ifstream file(filename);

if(!file.is_open())

{

cout << "Model Load Failed <img src='http://public.gamedev.net//public/style_emoticons/<#EMO_DIR#>/sad.png' class='bbc_emoticon' alt=':(' /> 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[i]->c_str()[0] =='#')

continue;

else if(values[i]->c_str()[0] == 'v' && values[i]->c_str()[1] == ' ')

{

float tmpx, tmpy, tmpz;

sscanf(values[i]->c_str(), "v %f %f %f",  &tmpx, &tmpy, &tmpz);

vertex.push_back(new cordinate(tmpx, tmpy, tmpz));

}

else if(values[i]->c_str()[0]=='v' && values[i]->c_str()[1]=='n')		//if normal vector

{

float tmpx,tmpy,tmpz;   //do the same thing

sscanf(values[i]->c_str(),"vn %f %f %f",&tmpx,&tmpy,&tmpz);

normals.push_back(new cordinate(tmpx,tmpy,tmpz));

}

else if(values[i]->c_str()[0] == 'f')

{

int a, b, c, d, e;

if(count(values[i]->begin(), values[i]->end(),' ') == 3)

{

sscanf(values[i]->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[i]->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++)

{

{

//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[i]->facenum-1]->x,normals[faces[i]->facenum-1]->y,normals[faces[i]->facenum-1]->z);

//draw the faces

glVertex3f(vertex[faces[i]->faces[0]-1]->x,vertex[faces[i]->faces[0]-1]->y,vertex[faces[i]->faces[0]-1]->z);

glVertex3f(vertex[faces[i]->faces[1]-1]->x,vertex[faces[i]->faces[1]-1]->y,vertex[faces[i]->faces[1]-1]->z);

glVertex3f(vertex[faces[i]->faces[2]-1]->x,vertex[faces[i]->faces[2]-1]->y,vertex[faces[i]->faces[2]-1]->z);

glVertex3f(vertex[faces[i]->faces[3]-1]->x,vertex[faces[i]->faces[3]-1]->y,vertex[faces[i]->faces[3]-1]->z);

glEnd();

}

else

{

glBegin(GL_TRIANGLES);

glColor3f(1, 0, 0);

glNormal3f(normals[faces[i]->facenum-1]->x,normals[faces[i]->facenum-1]->y,normals[faces[i]->facenum-1]->z);

glColor3f(0, 0, 0);

glVertex3f(vertex[faces[i]->faces[0]-1]->x,vertex[faces[i]->faces[0]-1]->y,vertex[faces[i]->faces[0]-1]->z);

glColor3f(0, 1, 1);

glVertex3f(vertex[faces[i]->faces[1]-1]->x,vertex[faces[i]->faces[1]-1]->y,vertex[faces[i]->faces[1]-1]->z);

glColor3f(0, 1, 0);

glVertex3f(vertex[faces[i]->faces[2]-1]->x,vertex[faces[i]->faces[2]-1]->y,vertex[faces[i]->faces[2]-1]->z);

glEnd();

}

}

glEndList();

//delete everything to avoid memory leaks

for(int i=0;i<values.size();i++)

delete values[i];

for(int i=0;i<faces.size();i++)

delete faces[i];

for(int i=0;i<normals.size();i++)

delete normals[i];

for(int i=0;i<vertex.size();i++)

delete vertex[i];

return num;	 //return with the id

}



Edited by DarkHorseKnight, 19 May 2012 - 07:28 AM.

### #5Brother Bob  Moderators

Posted 19 May 2012 - 12:27 PM

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?

### #6DarkHorseKnight  Members

Posted 19 May 2012 - 01:04 PM

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?

Edited by DarkHorseKnight, 19 May 2012 - 01:11 PM.

### #7Brother Bob  Moderators

Posted 19 May 2012 - 01:23 PM

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.

### #8DarkHorseKnight  Members

Posted 19 May 2012 - 01:38 PM

I will look around and report what I find

### #9DarkHorseKnight  Members

Posted 19 May 2012 - 01:57 PM

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.

Edited by DarkHorseKnight, 19 May 2012 - 02:00 PM.

### #10DarkHorseKnight  Members

Posted 19 May 2012 - 02:21 PM

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))

{

}

}

break;



Edited by DarkHorseKnight, 19 May 2012 - 02:21 PM.

### #11Brother Bob  Moderators

Posted 19 May 2012 - 02:55 PM

So you are just keeping one display list and overwriting the previous display list handle when you load a new? If you want multiple objects, then you also need to store multiple handles. How you should solve that depends on what you want to do.

For example, make cube a list of handles instead of just one handle.

std::vector<GLuint> cube;



Append the new object to the list of objects.




And then loop over all objects and draw them instead of just drawing one object.

for(std::vector<GLuint>::iterator I = cube.begin(); I != cube.end(); ++I) {

glDrawList(*I);

}



### #12DarkHorseKnight  Members

Posted 19 May 2012 - 03:47 PM

That worked perfectly thank you : )

Old topic!

Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.