Skip to main content
GameDev.net gamedev.net
🔒 Locked

Gluax Replacement Code

Started by Mooncabbage Oct 9, 2004 at 9:19 AM 18 replies 84.6k views
Original Post
Mooncabbage
Mooncabbage
Please bear with me here, my computer is doing some funky cookie crap and I keep logging out, so I can't be bothered writing a long explanation of why I am asking this, only to have it all disappear again. Can someone please tell me how to use the Gluax Replacement Code?
Mooncabbage
Mooncabbage
Someone reply, please? I can't be bothered looking for gluax.dll after all the effort it took to find the other depreciated libraries, and once you get to tutorial no. 6 that becomes a real problem.
_DarkWIng_
_DarkWIng_
a) you might wat to wait a bit longer than half an hour before posting again.. this is forum.. it takes time..
b) look at later tutorials that use TGA loading code. It's far from perfect, but it willget you started. Of you could use one of many image loading libs.
You should never let your fears become the boundaries of your dreams.
lc_overlord
lc_overlord
I really wish nehe would rewrite that tuturial, all those "the tururial doesn't work?", "where can i get the glaux thingy?" and "could somebody send me the glaux replacementcode?" posts are really starting to bug me.

NeHe, if i write a bmp loader for you, will you include it in your Tuturials.


either way, i think these are the files.
bmp.cpp

//--------------------------------------------------------------
#include <windows.h> // Header File For Windows - has structures for BMP format
#include <stdio.h> // Header File For Standard Input/Output
#include <stdlib.h>
#include "BMP.h"

/*------------------------------------------------------------------
BMP Loader - a quick and dirty substitute for GLaux
if you only use GLaux to load BMP files will load any format of a
windows DIB BMP format graphics file Only works on a windows box
Caution! memory for the data is allocated using 'new'.
In the NeHe tutorials the memory is reclaimed using 'free'.
For the small tutorials its not a big deal but not a good practice in
larger projects (heap trashing not good). J.M. Doyle : 12 Jan 2003
------------------------------------------------------------------*/

AUX_RGBImageRec *auxDIBImageLoad(const char *FileName)
{
return new AUX_RGBImageRec(FileName);
}


void AUX_RGBImageRec::convertBGRtoRGB()
{
const DWORD BitmapLength = sizeX * sizeY * 3;
byte Temp; // not quick but it works
for(DWORD i=0; i< BitmapLength; i += 3)
{
Temp = data;
data = data[i+2];
data[i+2] = Temp;
}
}

AUX_RGBImageRec::AUX_RGBImageRec(const char *FileName): data(NULL), NoErrors(false)
{
loadFile(FileName);
}

AUX_RGBImageRec::~AUX_RGBImageRec()
{
if (data != NULL) delete data;
data = NULL;
}

bool AUX_RGBImageRec::loadFile(const char* Filename)
{
BITMAPINFO BMInfo; // need the current OpenGL device contexts in order to make use of windows DIB utilities
const HDC gldc = wglGetCurrentDC(); // a handle for the current OpenGL Device Contexts
// assume there are errors until file is loaded successfully into memory
NoErrors = false; // release old data since this object could be used to load multiple Textures
if(data != NULL) delete data; // windows needs this info to determine what header info we are looking for
BMInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); // Get windows to determine color bit depth in the file for us
BMInfo.bmiHeader.biBitCount = 0; // Get windows to open and load the BMP file and handle the messy decompression if the file is compressed
// assume perfect world and no errors in reading file, Ha Ha
HANDLE DIBHandle = LoadImage(0,Filename, IMAGE_BITMAP, 0, 0,LR_DEFAULTCOLOR | LR_CREATEDIBSECTION | LR_LOADFROMFILE); // use windows to get header info of bitmap - assume no errors in header format

GetDIBits(gldc, (HBITMAP)DIBHandle, 0,0, NULL, &BMInfo, DIB_RGB_COLORS);
sizeX = BMInfo.bmiHeader.biWidth;
sizeY = BMInfo.bmiHeader.biHeight; // change color depth to 24 bits (3 bytes (BGR) / pixel)
BMInfo.bmiHeader.biBitCount = 24; // don't want the data compressed
BMInfo.bmiHeader.biCompression = BI_RGB;
const DWORD BitmapLength = sizeX * sizeY * 3; // 3 bytes (BGR) per pixel (24bp)
// allocate enough memory to hold the pixel data in client memory
data = new byte[BitmapLength]; // Get windows to do the dirty work of converting the BMP into the format needed by OpenGL
// if file is already 24 bit color then this is a waste of time but makes for short code
// Get the actual Texel data from the BMP object

if (GetDIBits(gldc, (HBITMAP)DIBHandle, 0, sizeY, data, &BMInfo, DIB_RGB_COLORS))
{
NoErrors = true;
convertBGRtoRGB(); // NOTE: BMP is in BGR format but OpenGL needs RGB unless you use GL_BGR_EXT
}

DeleteObject(DIBHandle); // don't need the BMP Object anymore
return NoErrors;
}


bmp.h

class AUX_RGBImageRec {
void convertBGRtoRGB();
public:
byte *data;
DWORD sizeX;
DWORD sizeY;
bool NoErrors;
AUX_RGBImageRec(): NoErrors(false), data(NULL) {};
AUX_RGBImageRec(const char *FileName);
~AUX_RGBImageRec();
bool loadFile(const char *FileName);
friend AUX_RGBImageRec *auxDIBImageLoad(const char *FileName);
};
Mooncabbage
Mooncabbage
Thanks for the help. The impatience was due to the time i posted... waaaaaaaaaaaay too early in the morning (or late at night). Neways, it's not finding the replacement code that is a problem, it is using it. Perhaps the original/early tutorials just need a facelift or something? Someone to go thru and get rid of gluax and update it a bit.
lc_overlord
lc_overlord
1. you have to include the bmp.cpp file in your project so it will be compiled and linked into your exe.
2. it's #include "bmp.h" not #include "bmp.cpp"

there are no guaranties that this code will work, but i think it will.

Regarding "glAux Replacement.cpp", i think not,
this code replaces AUX_RGBImageRec class(witch is the only real reason to use glAux), it works for me most of the times (allthough only if the imagefile is in the same dir as the .exe, odd).
Mooncabbage
Mooncabbage
OK, I finally got around to trying to use the code. I copied the bmp.h file into a bmp.h file, and included it in lesson 7, but upon compiling i get an error. Duh, i think, the two classes have different names. So first i try to change the class name in bmp.h to auxDIBImageLoad and compile, and get the same error. So i change it back, and replace all the auxDIBImageLoad words with the one in bmp.h and get:

...\OpenGL7.cpp In function AUX_RGBImageRec* LoadBMP(char*)':
58 ...\OpenGL7.cpp cannot convert
AUX_RGBImageRec' to AUX_RGBImageRec*' in return
Linker error] undefined reference to
auxDIBImageLoad(char const*)'

What is my problem?
lc_overlord
lc_overlord
Strange, when i did it it worked fine, no bugs no warnings, no nothing.

maybe you need step by step instructions.

1. take the bmp.cpp and bmp.h files and copy them to the same directory as lesson7.cpp(in your case it's probobly OpenGL7.cpp instead of lesson7.cpp).

2. open up the project in vc++ 6.0 (other versions should work to)

3. under file view find the "source files" folder, right click on it an select add files to folder, choose "bmp.cpp".

4. do the same for the "header files" folder but choose "bmp.h".

5. in "lesson7.cpp" change the folowing line
#include // Header File For The Glaux Library
to
#include "bmp.h" // Header File For The Glaux replacement Library

6. compile, run and be happy.
Mooncabbage
Mooncabbage
I use dev cpp, but that shouldn't be a problem, i probably forgot to tell the compiler to link it properly or something... However i didn't even touch the .cpp... figured it was an example file, doh ><. Thanks for the help, i'll try and figure out the source file bit in dev cpp, i think i've seen it somewhere before, however, i'm fairly new to actual c++, so things like source files and having to link included things as well as include them are new and strange to me.
adam17
adam17
personally i just use nehe's ipicture code. it works great for me.

probably off topic but o well
Mooncabbage
Mooncabbage
What ipicture code? where? tell meeeeeeeeeeeeeeeeeeeeeeeeee!

NB: Yes i just looked for it, so don't yell at me.
Mooncabbage
Mooncabbage
nm, i found it. I don't really understand it, but i found it. that r so far down the track it r not funny.
ulair
ulair
There is a little error in the bmp.h of yours. You need to add the line AUX_RGBImageRec *auxDIBImageLoad(const char *FileName); The function is only defined in the .cpp. That's probably why it didn't work for Mooncabbage Well it works for me now. Thank you! Now on to limit that hyperfast framerate a bit O_o ...
CLOUGHAX
CLOUGHAX
[font="helvetica, arial, verdana, tahoma, sans-serif"][color="#5a5a5a"]@[/font]lc_overlord[font="helvetica, arial, verdana, tahoma, sans-serif"][color="#5a5a5a"] Run-time error when deallocating the [font=courier new,courier,monospace]data[/font] pointer[/font]

[color=#5A5A5A][font=helvetica, arial, verdana, tahoma, sans-serif]I have tested your AUX_RGBImage class and for the most part it works until when the program reaches the point of deallocating the byte [font=courier new,courier,monospace]data[/font] variable through either the destructor or when [font=courier new,courier,monospace]data!=NULL[/font]. I have been trying to solve the problem ever since but it keeps crashing when i reach that point and the only conclusion is can come to is that i overlooked something concerning classes and dynamic allocation or the microsoft visual 2010 compiler is not working cause i even realize that from the code you allocated an byte array so to actually deallocate it wold be [font=courier new,courier,monospace]delete[] data,[/font] but thats not working either. I may be wrong in hypothesis and thats the reason for me making this request for your help.[/font]
lc_overlord
lc_overlord
This pice of code is pretty ancient and im unsure if it even works with the latest Visual studio or how easy it is to fix it as i havn't run this code in a few years, i know it works for MSVC++ 6.0 but that version didn't even have namespace implemented.

It would probably be better today to just go for the TGA tutorials and drop this whole glAUX nonsence.
CLOUGHAX
CLOUGHAX
Well thanks for the advice ill try and give it another shot although the last tutorial i did on bitmap was a total garbage and it seemed as if the writer got fed up at the end and just pasted the rest of the code which was in fact incomplete and had me stuck for a couple hours trying to figure out his gibberish. But i got fed up and just download an incredible library named free freeImage that works but i dont feel satisfied knowing that it wasnt me who wrote the code. So ill give it a next shot

Topic Locked

This topic has been locked by a moderator. New replies are not allowed.

Sign in to reply to this topic.