Jump to content

  • Log In with Google      Sign In   
  • Create Account

We're offering banner ads on our site from just $5!

1. Details HERE. 2. GDNet+ Subscriptions HERE. 3. Ad upload HERE.


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.

  • You cannot reply to this topic
11 replies to this topic

#1 DarkHorseKnight   Members   -  Reputation: 143

Like
0Likes
Like

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

Sponsor:

#2 DarkHorseKnight   Members   -  Reputation: 143

Like
0Likes
Like

Posted 18 May 2012 - 02:16 PM

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

#3 Brother Bob   Moderators   -  Reputation: 8570

Like
1Likes
Like

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.

#4 DarkHorseKnight   Members   -  Reputation: 143

Like
0Likes
Like

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?

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

		{

				if(faces[i]->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[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.


#5 Brother Bob   Moderators   -  Reputation: 8570

Like
1Likes
Like

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?

#6 DarkHorseKnight   Members   -  Reputation: 143

Like
0Likes
Like

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.


#7 Brother Bob   Moderators   -  Reputation: 8570

Like
1Likes
Like

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.

#8 DarkHorseKnight   Members   -  Reputation: 143

Like
0Likes
Like

Posted 19 May 2012 - 01:38 PM

I will look around and report what I find :)

#9 DarkHorseKnight   Members   -  Reputation: 143

Like
0Likes
Like

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.


#10 DarkHorseKnight   Members   -  Reputation: 143

Like
0Likes
Like

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

	{

		cube=ModelLoad(szFileName);

  

	   }  



	

  }

break;


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


#11 Brother Bob   Moderators   -  Reputation: 8570

Like
1Likes
Like

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.

cube.push_back(ModelLoad(szFileName));


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

}



#12 DarkHorseKnight   Members   -  Reputation: 143

Like
0Likes
Like

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.



PARTNERS