Dynamic texture array

Started by
6 comments, last by kulik 20 years ago
I have got problems with dymanic array of textures:

GLuint* textures;

int TextureAmount = 10;

textures = new GLuint[TextureAmount];
BuildTexture("something.jpg", textures[0]);
I am using Nehe IPicture code. all loading goes fine, but when I close my app it spits out assertion error. I think that it cannot forward the pointer. What should I do?? I dont want to have limited amount of textures.
Advertisement
post BuildTexture() code.
[size="2"]I like the Walrus best.
BuildTexture code:

bool BuildTexture(char *szPathName, GLuint &texid)					// Load Image And Convert To A Texture{	HDC			hdcTemp;												// The DC To Hold Our Bitmap	HBITMAP		hbmpTemp;												// Holds The Bitmap Temporarily	IPicture	*pPicture;												// IPicture Interface	OLECHAR		wszPath[MAX_PATH+1];									// Full Path To Picture (WCHAR)	char		szPath[MAX_PATH+1];										// Full Path To Picture	long		lWidth;													// Width In Logical Units	long		lHeight;												// Height In Logical Units	long		lWidthPixels;											// Width In Pixels	long		lHeightPixels;											// Height In Pixels	GLint		glMaxTexDim ;											// Holds Maximum Texture Size	if (strstr(szPathName, "http://"))									// If PathName Contains http:// Then...	{		strcpy(szPath, szPathName);										// Append The PathName To szPath	}	else																// Otherwise... We Are Loading From A File	{		GetCurrentDirectory(MAX_PATH, szPath);							// Get Our Working Directory		strcat(szPath, "\\");											// Append "\" After The Working Directory		strcat(szPath, szPathName);										// Append The PathName	}	MultiByteToWideChar(CP_ACP, 0, szPath, -1, wszPath, MAX_PATH);		// Convert From ASCII To Unicode	HRESULT hr = OleLoadPicturePath(wszPath, 0, 0, 0, IID_IPicture, (void**)&pPicture);	if(FAILED(hr))														// If Loading Failed		return FALSE;													// Return False	hdcTemp = CreateCompatibleDC(GetDC(0));								// Create The Windows Compatible Device Context	if(!hdcTemp)														// Did Creation Fail?	{		pPicture->Release();											// Decrements IPicture Reference Count		return FALSE;													// Return False (Failure)	}	glGetIntegerv(GL_MAX_TEXTURE_SIZE, &glMaxTexDim);					// Get Maximum Texture Size Supported		pPicture->get_Width(&lWidth);										// Get IPicture Width (Convert To Pixels)	lWidthPixels	= MulDiv(lWidth, GetDeviceCaps(hdcTemp, LOGPIXELSX), 2540);	pPicture->get_Height(&lHeight);										// Get IPicture Height (Convert To Pixels)	lHeightPixels	= MulDiv(lHeight, GetDeviceCaps(hdcTemp, LOGPIXELSY), 2540);	// Resize Image To Closest Power Of Two	if (lWidthPixels <= glMaxTexDim) // Is Image Width Less Than Or Equal To Cards Limit		lWidthPixels = 1 << (int)floor((log((double)lWidthPixels)/log(2.0f)) + 0.5f); 	else  // Otherwise  Set Width To "Max Power Of Two" That The Card Can Handle		lWidthPixels = glMaxTexDim; 	if (lHeightPixels <= glMaxTexDim) // Is Image Height Greater Than Cards Limit		lHeightPixels = 1 << (int)floor((log((double)lHeightPixels)/log(2.0f)) + 0.5f);	else  // Otherwise  Set Height To "Max Power Of Two" That The Card Can Handle		lHeightPixels = glMaxTexDim;		//	Create A Temporary Bitmap	BITMAPINFO	bi = {0};												// The Type Of Bitmap We Request	DWORD		*pBits = 0;												// Pointer To The Bitmap Bits	bi.bmiHeader.biSize			= sizeof(BITMAPINFOHEADER);				// Set Structure Size	bi.bmiHeader.biBitCount		= 32;									// 32 Bit	bi.bmiHeader.biWidth		= lWidthPixels;							// Power Of Two Width	bi.bmiHeader.biHeight		= lHeightPixels;						// Make Image Top Up (Positive Y-Axis)	bi.bmiHeader.biCompression	= BI_RGB;								// RGB Encoding	bi.bmiHeader.biPlanes		= 1;									// 1 Bitplane	//	Creating A Bitmap This Way Allows Us To Specify Color Depth And Gives Us Imediate Access To The Bits	hbmpTemp = CreateDIBSection(hdcTemp, &bi, DIB_RGB_COLORS, (void**)&pBits, 0, 0);		if(!hbmpTemp)														// Did Creation Fail?	{		DeleteDC(hdcTemp);												// Delete The Device Context		pPicture->Release();											// Decrements IPicture Reference Count		return FALSE;													// Return False (Failure)	}	SelectObject(hdcTemp, hbmpTemp);									// Select Handle To Our Temp DC And Our Temp Bitmap Object	// Render The IPicture On To The Bitmap	pPicture->Render(hdcTemp, 0, 0, lWidthPixels, lHeightPixels, 0, lHeight, lWidth, -lHeight, 0);	// Convert From BGR To RGB Format And Add An Alpha Value Of 255	for(long i = 0; i < lWidthPixels * lHeightPixels; i++)				// Loop Through All Of The Pixels	{		BYTE* pPixel	= (BYTE*)(&pBits[i]);							// Grab The Current Pixel		BYTE  temp		= pPixel[0];									// Store 1st Color In Temp Variable (Blue)		pPixel[0]		= pPixel[2];									// Move Red Value To Correct Position (1st)		pPixel[2]		= temp;											// Move Temp Value To Correct Blue Position (3rd)		// This Will Make Any Black Pixels, Completely Transparent		(You Can Hardcode The Value If You Wish)		if ((pPixel[0]==0) && (pPixel[1]==0) && (pPixel[2]==0))			// Is Pixel Completely Black			pPixel[3]	=   0;											// Set The Alpha Value To 0		else															// Otherwise			pPixel[3]	= 255;											// Set The Alpha Value To 255	}	glGenTextures(1, &texid);											// Create The Texture	// Typical Texture Generation Using Data From The Bitmap	glBindTexture(GL_TEXTURE_2D, texid);								// Bind To The Texture ID	glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);		// (Modify This For The Type Of Filtering You Want)	glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);     // (Modify This For The Type Of Filtering You Want)	glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, lWidthPixels, lHeightPixels, 0, GL_RGBA, GL_UNSIGNED_BYTE, pBits);	// (Modify This If You Want Mipmaps)	DeleteObject(hbmpTemp);												// Delete The Object	DeleteDC(hdcTemp);													// Delete The Device Context	pPicture->Release();												// Decrements IPicture Reference Count	return TRUE;}
oh, that''s a lot of code...
[size="2"]I like the Walrus best.
BuildTexture("something.jpg", &textures[0]);

?
Doesnt help :-(

Somebody there has a good load texture code?
I create my textures as TGA and then I load them with an utility I wrote (with NEHE soruce code) and save them in a custom format.

Then I load my custom format and generate the texture (also with NEHE source code).

A custom image file is useful, you could consider implementing one and maybe add encription to it later.

[edited by - owl on April 13, 2004 8:31:03 AM]
[size="2"]I like the Walrus best.
I solved it :-)

Somebody wants the code?

This topic is closed to new replies.

Advertisement