Not as far as I know, I'm using glLists for my SkyBox, and standard OpenGL stuff for the rest, see code below. The only strange thing I'm doing is using SDL_ttf which uses SDL_Surface to blit text which I convert to an OpenGL texture. Irregardless, I don't think any of this should be an issue if it works perfectly fine from Visual Studio 2008, right?
Edit: Furthermore, there are no problems on Windows XP when running from either VS2008 or EXE. So why is it such a problem on Windows 7? I'm using platform independent libraries (ie. no STL), so I'm still completely baffled.
SkyBox Load:
bool SkyBox::load() {
if(m_loaded) { return true; }
for(int i=0;i<6;i++) {
m_textures[i] = Game::resources->getTexture(m_textureNames[i]);
if(m_textures[i] == NULL) { return false; }
if(!m_textures[i]->load()) { return false; }
}
m_skyBoxList = glGenLists(6);
float width = (float) (m_textures[0]->getWidth() - 1) / (float) m_textures[0]->getWidth();
// left side
glNewList(m_skyBoxList, GL_COMPILE);
glBegin(GL_POLYGON);
glTexCoord2d(1 - width, width);
glVertex3d(-0.5, 0.5, 0.5);
glTexCoord2d(1 - width, 1 - width);
glVertex3d(-0.5, -0.5, 0.5);
glTexCoord2d(width, 1 - width);
glVertex3d(-0.5, -0.5, -0.5);
glTexCoord2d(width, width);
glVertex3d(-0.5, 0.5, -0.5);
glEnd();
glEndList();
// right side
glNewList(m_skyBoxList + 1, GL_COMPILE);
glBegin(GL_POLYGON);
glTexCoord2d(1 - width, width);
glVertex3d(0.5, 0.5, -0.5);
glTexCoord2d(1 - width, 1 - width);
glVertex3d(0.5, -0.5, -0.5);
glTexCoord2d(width, 1 - width);
glVertex3d(0.5, -0.5, 0.5);
glTexCoord2d(width, width);
glVertex3d(0.5, 0.5, 0.5);
glEnd();
glEndList();
// front side
glNewList(m_skyBoxList + 2, GL_COMPILE);
glBegin(GL_POLYGON);
glTexCoord2d(1 - width, width);
glVertex3d(-0.5, 0.5, -0.5);
glTexCoord2d(1 - width, 1 - width);
glVertex3d(-0.5, -0.5, -0.5);
glTexCoord2d(width, 1 - width);
glVertex3d(0.5, -0.5, -0.5);
glTexCoord2d(width, width);
glVertex3d(0.5, 0.5, -0.5);
glEnd();
glEndList();
// back side
glNewList(m_skyBoxList + 3, GL_COMPILE);
glBegin(GL_POLYGON);
glTexCoord2d(1 - width, width);
glVertex3d(0.5, 0.5, 0.5);
glTexCoord2d(1 - width, 1 - width);
glVertex3d(0.5, -0.5, 0.5);
glTexCoord2d(width, 1 - width);
glVertex3d(-0.5, -0.5, 0.5);
glTexCoord2d(width, width);
glVertex3d(-0.5, 0.5, 0.5);
glEnd();
glEndList();
// top side
glNewList(m_skyBoxList + 4, GL_COMPILE);
glBegin(GL_POLYGON);
glTexCoord2d(width, 1 - width);
glVertex3d(-0.5, 0.5, 0.5);
glTexCoord2d(width, width);
glVertex3d(-0.5, 0.5, -0.5);
glTexCoord2d(1 - width, width);
glVertex3d(0.5, 0.5, -0.5);
glTexCoord2d(1 - width, 1 - width);
glVertex3d(0.5, 0.5, 0.5);
glEnd();
glEndList();
// bottom side
glNewList(m_skyBoxList + 5, GL_COMPILE);
glBegin(GL_POLYGON);
glTexCoord2d(width, 1 - width);
glVertex3d(-0.5, -0.5, -0.5);
glTexCoord2d(width, width);
glVertex3d(-0.5, -0.5, 0.5);
glTexCoord2d(1 - width, width);
glVertex3d(0.5, -0.5, 0.5);
glTexCoord2d(1 - width, 1 - width);
glVertex3d(0.5, -0.5, -0.5);
glEnd();
glEndList();
m_loaded = true;
return true;
}
SkyBox Draw:
void SkyBox::draw() {
if(!m_loaded) { return; }
glDisable(GL_DEPTH_TEST);
glLoadIdentity();
glRotated(Game::camera->getRotation().x, 1, 0, 0);
glRotated(Game::camera->getRotation().y, 0, 1, 0);
for(int i=0;i<6;i++) {
m_textures[i]->activate();
glCallList(m_skyBoxList + i);
}
glEnable(GL_DEPTH_TEST);
}
Game Draw:
void Game::draw() {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// set up 3d rendering
glEnable(GL_TEXTURE_2D);
glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(70.0f, (GLfloat) settings->windowWidth / (GLfloat) settings->windowHeight, 0.1f, 10000.0f);
glMatrixMode(GL_MODELVIEW);
// render skybox
if(skyBox != NULL) {
skyBox->draw();
}
// render world
if(mainShader != NULL) { mainShader->activate(); }
glPushMatrix();
camera->setup();
glScalef(100, 100, 100);
glBegin(GL_POLYGON);
// left
glVertex3f(-1.0f, 0.0f, 0.0f);
glVertex3f(-1.0f, 0.0f, -1.0f);
glVertex3f(-1.0f, -1.0f, -1.0f);
glVertex3f(-1.0f, -1.0f, 0.0f);
// right
glVertex3f(0.0f, 0.0f, 0.0f);
glVertex3f(0.0f, -1.0f, 0.0f);
glVertex3f(0.0f, -1.0f, -1.0f);
glVertex3f(0.0f, 0.0f, -1.0f);
// front
glVertex3f(0.0f, 0.0f, 0.0f);
glVertex3f(-1.0f, 0.0f, 0.0f);
glVertex3f(-1.0f, -1.0f, 0.0f);
glVertex3f(0.0f, -1.0f, 0.0f);
// back
glVertex3f(0.0f, 0.0f, 0.0f);
glVertex3f(-1.0f, 0.0f, -1.0f);
glVertex3f(-1.0f, -1.0f, -1.0f);
glVertex3f(0.0f, -1.0f, -1.0f);
// top
glVertex3f(0.0f, 0.0f, 0.0f);
glVertex3f(0.0f, 0.0f, -1.0f);
glVertex3f(-1.0f, 0.0f, -1.0f);
glVertex3f(-1.0f, 0.0f, 0.0f);
// bottom
glVertex3f(0.0f, 0.0f, 0.0f);
glVertex3f(0.0f, -1.0f, -1.0f);
glVertex3f(-1.0f, -1.0f, -1.0f);
glVertex3f(-1.0f, -1.0f, 0.0f);
glEnd();
glPopMatrix();
if(mainShader != NULL) { mainShader->deactivate(); }
// set up 2d rendering
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0, settings->windowWidth, settings->windowHeight, 0);
// render hud / gui elements
displayFPS();
menu->draw();
console->draw();
SDL_GL_SwapBuffers();
}
Font Draw / Load:
void Font::drawTextHelper(int x, int y, const char * text) const {
if(!m_loaded) { return; }
glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE);
glBindTexture(GL_TEXTURE_2D, m_texture);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
glTranslated(x, y, 0);
glListBase(m_font - 32);
glCallLists(strlen(text), GL_BYTE, text);
glPopMatrix();
}
bool Font::load() {
if(m_loaded) { return true; }
QString fontPath = QString("%1/Fonts/%2").arg(Game::settings->dataDirectoryName).arg(m_fileName);
QFileInfo fontFile(fontPath);
if(!fontFile.exists()) { return false; }
QByteArray bytes = fontPath.toLocal8Bit();
TTF_Font * fontData;
if(!(fontData = TTF_OpenFont(bytes.data(), m_size))) {
return false;
}
SDL_Color colour = {255, 255, 255, 255};
SDL_Surface * character;
QVector characters;
int maxWidth = -1;
int maxHeight = -1;
char data[2];
data[1] = '\0';
for(int i=0;i<128;i++ ) {
data[0] = (char) (i + 32);
character = TTF_RenderText_Blended(fontData, data, colour);
characters.push_back(character);
if(maxWidth < 0 || maxWidth < character->w) { maxWidth = character->w; }
if(maxHeight < 0 || maxHeight < character->h) { maxHeight = character->h; }
}
m_horizontalSpacing = maxWidth;
m_verticalSpacing = maxHeight;
int width = 1, tempWidth = maxWidth * 16;
int height = 1, tempHeight = maxHeight * 8;
while(width < tempWidth) { width *= 2; }
while(height < tempHeight) { height *= 2; }
SDL_Surface * temp = SDL_CreateRGBSurface(0, width, height, 32,
#if SDL_BYTEORDER == SDL_BIG_ENDIAN
0xff000000, 0x00ff0000, 0x0000ff00, 0x000000ff
#else
0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000
#endif
);
SDL_Rect sourceArea, destArea;
int x = 0;
int y = 0;
for(int i=0;i<128;i++) {
sourceArea.x = 0;
sourceArea.y = 0;
sourceArea.w = characters[i]->w;
sourceArea.h = characters[i]->h;
destArea.x = maxWidth * x;
destArea.y = maxHeight * y;
destArea.w = characters[i]->w;
destArea.h = characters[i]->h;
SDL_SetAlpha(characters[i], 0, 0);
SDL_BlitSurface(characters[i], &sourceArea, temp, &destArea);
x++;
if(x == 16) {
x = 0;
y++;
}
}
glGenTextures(1, &m_texture);
glBindTexture(GL_TEXTURE_2D, m_texture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, temp->w, temp->h, 0, GL_RGBA, GL_UNSIGNED_BYTE, temp->pixels);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE);
m_font = glGenLists(128);
x = 0;
y = 0;
float w = (float) maxWidth / (float) (temp->w);
float h = (float) maxHeight / (float) (temp->h);
for(int i=0;i<128;i++) {
glNewList(m_font + i, GL_COMPILE);
glBegin(GL_QUADS);
glTexCoord2f((w * x), ((h * y))); glVertex2i(0, 0);
glTexCoord2f((w * x) + w, ((h * y))); glVertex2i(maxWidth, 0);
glTexCoord2f((w * x) + w, ((h * y) + h)); glVertex2i(maxWidth, maxHeight);
glTexCoord2f((w * x), ((h * y) + h)); glVertex2i(0, maxHeight);
glEnd();
glTranslated(maxWidth, 0, 0);
glEndList();
x++;
if(x == 16) {
x = 0;
y++;
}
}
for(int i=0;i<128;i++) {
SDL_FreeSurface(characters[i]);
}
SDL_FreeSurface(temp);
m_loaded = true;
return true;
}