Jump to content
  • Advertisement

Archived

This topic is now archived and is closed to further replies.

aaron_ds

vanishing textures.

This topic is 5303 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

Hi, I just moved my geometry and texture data into a templated linkedlist. But in doing so, I screwed up some thing to do with texturing. The LoadBMP function is used from one of the NeHe texturing loading tutorials, Its only modified to display a messagebox if it returns false.
int DrawGLScene(GLvoid){
	firsttime=clock();
	
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
	glColor3f(1.0f, 1.0f,1.0f);

	glBindProgramARB(GL_VERTEX_PROGRAM_ARB,vShad);
	//glEnable(GL_VERTEX_PROGRAM_ARB);


	glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB,fShad);
	//glEnable(GL_FRAGMENT_PROGRAM_ARB);

	

	glLoadIdentity();

	/* DRAW cworld */
	glPushMatrix();
		gluLookAt(	camera.position.x,
				camera.position.y,
				camera.position.z,

				camera.target.x,
				camera.target.y,
				camera.target.z,

				camera.up.x,
				camera.up.y,
				camera.up.z
		);
		cworld->draw();
	glPopMatrix();
	
	lasttime=firsttime;
	firsttime=clock();
	diff_time=(firsttime-lasttime+diff_time)/2;


	glFlush();
	return TRUE;
}
class OBJECT{
	public:
	OBJECT();
	~OBJECT();

	void draw();
	void genLists(void);


	LINKED_LIST<NODE<POLYGON>, POLYGON >* polygon_list;
	LINKED_LIST<NODE<POLYGON>, POLYGON >* uvpoly_list;
	GLuint draw_list;

	GLuint* texture;
	

};

OBJECT::OBJECT(){
	polygon_list = new LINKED_LIST<NODE<POLYGON>, POLYGON >;
	uvpoly_list  = new LINKED_LIST<NODE<POLYGON>, POLYGON >;
	texture = new GLuint;
}
OBJECT::~OBJECT(){
	delete polygon_list;
	delete uvpoly_list;
	glDeleteTextures(1, texture);
	delete texture;
	
}
void OBJECT::genLists(){
	draw_list=glGenLists(1);

	glNewList(draw_list,GL_COMPILE);
		glBegin(GL_TRIANGLES);

		/*Loop for each polygon in the list*/
		NODE<POLYGON>* uv_cur=uvpoly_list->head;
		for(NODE<POLYGON>* poly_cur= polygon_list->head; poly_cur!=polygon_list->tail; poly_cur=poly_cur->next,uv_cur=uv_cur->next){
			/*Loop for each vertex*/
			POINT3f normal, a, b, c;
			a=poly_cur->data->points[0];
			b=poly_cur->data->points[2];
			c=poly_cur->data->points[1];
			a.x-=c.x;
			a.y-=c.y;
			a.z-=c.z;

			b.x-=c.x;
			b.y-=c.y;
			b.z-=c.z;

			normal.x=a.y*b.z-a.z*b.y;
			normal.y=a.z*b.x-a.x*b.z;
			normal.z=a.x*b.y-a.y*b.x;

			float length=sqrt(normal.x*normal.x+normal.y*normal.y+normal.z*normal.z);
			
			normal.x/=(length+0.001);
			normal.y/=(length+0.001);
			normal.z/=(length+0.001);

			/*generate mapping coords*/
			POINT3f i,j,k;
			i=uv_cur->data->points[0];
			j=uv_cur->data->points[1];
			k=uv_cur->data->points[2];

			//glActiveTextureARB(GL_TEXTURE0_ARB);

			glEnable(GL_TEXTURE_2D);
			glBindTexture(GL_TEXTURE_2D, *texture);
			//glEnable(GL_TEXTURE_2D);

			//glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_EXT);

			//glTexEnvf (GL_TEXTURE_ENV, GL_COMBINE_RGB_EXT, GL_REPLACE);


			glNormal3f(normal.x, normal.y, normal.z);
			glTexCoord2f(i.x, i.y);
			//glMultiTexCoord2f(GL_TEXTURE0_ARB, i.x, i.y);

			glVertex3f((poly_cur->data->points[0].x)/100 , (poly_cur->data->points[0].y)/100 ,(poly_cur->data->points[0].z)/100);
			glTexCoord2f(j.x, j.y);
			//glMultiTexCoord2f(GL_TEXTURE0_ARB, j.x, j.y);

			glVertex3f((poly_cur->data->points[1].x)/100 , (poly_cur->data->points[1].y)/100 ,(poly_cur->data->points[1].z)/100);
			glTexCoord2f(k.x, k.y);
			//glMultiTexCoord2f(GL_TEXTURE0_ARB, k.x, k.y);

			glVertex3f((poly_cur->data->points[2].x)/100 , (poly_cur->data->points[2].y)/100 ,(poly_cur->data->points[2].z)/100);
	
		}

	
		glEnd();
	glEndList();
}
void OBJECT::draw(){
	glCallList(this->draw_list);
}
/*Loop for each object in scene*/
	for(int object_i=0; object_i<*num_objects; object_i++){

		/*Add an object to object_list*/
		errlog<<"adding object"<<object_i<<"\n";
		errlog.flush();
		NODE<OBJECT>* cur_object = object_list->addNode();
		errlog<<"added object to world \n";
		errlog.flush();

		/*TEXTURE*/
		char* texture_file = new char[128];
		file.get(texture_file, sizeof(char)*128, ''\r'');
		errlog<<"read texture "<< texture_file << "\n";
		errlog.flush();

		AUX_RGBImageRec* textureimage = new AUX_RGBImageRec;
		textureimage = LoadBMP("Data\\Crate.bmp");
		if (textureimage){
			
			glGenTextures(1, cur_object->data->texture);
			//glActiveTextureARB(GL_TEXTURE0_ARB);

			glEnable(GL_TEXTURE_2D);
			glBindTexture(GL_TEXTURE_2D, *(cur_object->data->texture));
			glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
			glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR);
			glTexImage2D(GL_TEXTURE_2D, 0, 3, textureimage->sizeX, textureimage->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, textureimage->data);

		}
		if (textureimage){
			if (textureimage->data){
				delete textureimage->data;
			}
			delete textureimage;
		}

		file.read(texture_file, sizeof(char)*1);
		file.read(texture_file, sizeof(char)*1);
		delete texture_file;
......................
}
Ive checked previous works and tutorials to see if im calling the gl functions in the right order. I havnt rewritten this from scratch, its been modified from code that already did display textures fine. Thankyou

Share this post


Link to post
Share on other sites
Advertisement
well firstly dont use glaux. NeHe has a Glaux Replacement up.


Glaux has 16+ known memory leaks.
Glaux was only used for demonstations.
SGI who created glaux says never to use it.
Glaux was nexer a part of OpenGL, it was more like a mod.


Share this post


Link to post
Share on other sites
DerAnged: Thankyou. I''m free from glaux now, but that wasn''t the problem.
I''ve modified the loading code to this, due to my wanting to explicity state glTexParameteri and glTexImage2D arguments in the loadworld method rather than in yet another file.
/*Loop for each object in scene*/
for(int object_i=0; object_i<*num_objects; object_i++){

/*Add an object to object_list*/
errlog<<"adding object"<<object_i<<"\n";
errlog.flush();
NODE<OBJECT>* cur_object = object_list->addNode();
errlog<<"added object to world \n";
errlog.flush();

/*TEXTURE*/
char* texture_file = new char[128];
file.get(texture_file, sizeof(char)*128, ''\r'');
errlog<<"read texture "<< texture_file << "\n";
errlog.flush();

//BITMAP* textureimage = new BITMAP;

//textureimage = LoadBMP("Data\\Crate.bmp");

HBITMAP hBMP;
BITMAP BMP;


glGenTextures(1, cur_object->data->texture);
hBMP=(HBITMAP)LoadImage(GetModuleHandle(NULL), texture_file, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_LOADFROMFILE );
if (!hBMP)
MessageBox(NULL, "Error loading texture","ERROR", MB_OK | MB_ICONINFORMATION);
GetObject(hBMP, sizeof(BMP), &BMP);
glPixelStorei(GL_UNPACK_ALIGNMENT, 4);

//glActiveTextureARB(GL_TEXTURE0_ARB);

glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, *(cur_object->data->texture));
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, 3, BMP.bmWidth, BMP.bmHeight, 0, GL_BGR_EXT, GL_UNSIGNED_BYTE, BMP.bmBits);

DeleteObject(hBMP);


file.read(texture_file, sizeof(char)*1);
file.read(texture_file, sizeof(char)*1);
delete texture_file;

Share this post


Link to post
Share on other sites
quote:
Original post by aaron_ds
DerAnged: Thankyou. I''m free from glaux now, but that wasn''t the problem.
I''ve modified the loading code to this, due to my wanting to explicity state glTexParameteri and glTexImage2D arguments in the loadworld method rather than in yet another file.
/*Loop for each object in scene*/
for(int object_i=0; object_i<*num_objects; object_i++){

/*Add an object to object_list*/
errlog<<"adding object"<<object_i<<"\n";
errlog.flush();
NODE<OBJECT>* cur_object = object_list->addNode();
errlog<<"added object to world \n";
errlog.flush();

/*TEXTURE*/
char* texture_file = new char[128];
file.get(texture_file, sizeof(char)*128, ''\r'');
errlog<<"read texture "<< texture_file << "\n";
errlog.flush();

//BITMAP* textureimage = new BITMAP;

//textureimage = LoadBMP("Data\\Crate.bmp");

HBITMAP hBMP;
BITMAP BMP;


glGenTextures(1, cur_object->data->texture);
hBMP=(HBITMAP)LoadImage(GetModuleHandle(NULL), texture_file, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_LOADFROMFILE );
if (!hBMP)
MessageBox(NULL, "Error loading texture","ERROR", MB_OK | MB_ICONINFORMATION);
GetObject(hBMP, sizeof(BMP), &BMP);
glPixelStorei(GL_UNPACK_ALIGNMENT, 4);

//glActiveTextureARB(GL_TEXTURE0_ARB);

glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, *(cur_object->data->texture));
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, 3, BMP.bmWidth, BMP.bmHeight, 0, GL_BGR_EXT, GL_UNSIGNED_BYTE, BMP.bmBits);

DeleteObject(hBMP);


file.read(texture_file, sizeof(char)*1);
file.read(texture_file, sizeof(char)*1);
delete texture_file;



have you tried changing
glTexImage2D(GL_TEXTURE_2D, 0, 3, BMP.bmWidth, BMP.bmHeight, 0, GL_BGR_EXT, GL_UNSIGNED_BYTE, BMP.bmBits); 
to
gluBuild2DMipmaps(GL_TEXTURE_2D, 3, BMP.bmWidth, BMP.bmHeight, GL_BGR_EXT, GL_UNSIGNED_BYTE, BMP.bmBits); 



Share this post


Link to post
Share on other sites
Enigma: yes. The function CreateGLWindow creates the context and calls InitGL() immediatly before CreateGLWindow returns.
It is inside InitGL() that I load the textures.

Share this post


Link to post
Share on other sites
if glubuild2dmipmaps doesnt work(see my last post) than make sure that you are using 24bit bitmaps that are a power of two(thats what the glaux replacement needs)(the power of two thing is something almost all loaders need)


Share this post


Link to post
Share on other sites
DerAnged: Thankyou, that was the problem. I was using glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR);
when I wasn't using mipmaps. Doh!
Sometimes its the simplest mistakes that I pass over.
Thankyou again!
EDIT: yes, I am using 24bit 2^x bitmaps

[edited by - aaron_ds on February 8, 2004 5:13:54 PM]

Share this post


Link to post
Share on other sites
quote:
Original post by aaron_ds
DerAnged: Thankyou, that was the problem. I was using glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR);
when I wasn''t using mipmaps. Doh!
Sometimes its the simplest mistakes that I pass over.
Thankyou again!
EDIT: yes, I am using 24bit 2^x bitmaps

[edited by - aaron_ds on February 8, 2004 5:13:54 PM]


glad i could help. good luck on your game/engine.


Share this post


Link to post
Share on other sites

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!