summaryrefslogtreecommitdiffstats
path: root/src/graphics/opengl
diff options
context:
space:
mode:
authorPiotr Dziwinski <piotrdz@gmail.com>2012-09-19 22:53:06 +0200
committerPiotr Dziwinski <piotrdz@gmail.com>2012-09-19 22:53:06 +0200
commit7479f486b671acb2a6aea2c84a56b383aaba00ca (patch)
tree4043545a14234dfaa2d7d08d59c7ee9ee97f0de9 /src/graphics/opengl
parent901f10b2bac18a2063cd21798f22b3917e8519b5 (diff)
parent57d33d79ea570773d84ad81d4a61f50e079979ef (diff)
downloadcolobot-7479f486b671acb2a6aea2c84a56b383aaba00ca.tar.gz
colobot-7479f486b671acb2a6aea2c84a56b383aaba00ca.tar.bz2
colobot-7479f486b671acb2a6aea2c84a56b383aaba00ca.zip
Forgotten fix in dev-graphics
Diffstat (limited to 'src/graphics/opengl')
-rw-r--r--src/graphics/opengl/gldevice.cpp65
1 files changed, 48 insertions, 17 deletions
diff --git a/src/graphics/opengl/gldevice.cpp b/src/graphics/opengl/gldevice.cpp
index a779a5f..416b506 100644
--- a/src/graphics/opengl/gldevice.cpp
+++ b/src/graphics/opengl/gldevice.cpp
@@ -129,9 +129,11 @@ bool Gfx::CGLDevice::Create()
glViewport(0, 0, m_config.size.x, m_config.size.y);
+ int numLights = 0;
+ glGetIntegerv(GL_MAX_LIGHTS, &numLights);
- m_lights = std::vector<Gfx::Light>(GL_MAX_LIGHTS, Gfx::Light());
- m_lightsEnabled = std::vector<bool> (GL_MAX_LIGHTS, false);
+ m_lights = std::vector<Gfx::Light>(numLights, Gfx::Light());
+ m_lightsEnabled = std::vector<bool> (numLights, false);
int maxTextures = 0;
glGetIntegerv(GL_MAX_TEXTURE_UNITS, &maxTextures);
@@ -182,7 +184,6 @@ void Gfx::CGLDevice::BeginScene()
void Gfx::CGLDevice::EndScene()
{
- glFlush();
}
void Gfx::CGLDevice::Clear()
@@ -434,7 +435,10 @@ Gfx::Texture Gfx::CGLDevice::CreateTexture(ImageData *data, const Gfx::TextureCr
else
glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_FALSE);
+
+ bool convert = false;
GLenum sourceFormat = 0;
+
if (params.format == Gfx::TEX_IMG_RGB)
{
sourceFormat = GL_RGB;
@@ -459,26 +463,26 @@ Gfx::Texture Gfx::CGLDevice::CreateTexture(ImageData *data, const Gfx::TextureCr
{
if (data->surface->format->Amask != 0)
{
- if ((data->surface->format->Rmask == 0xFF000000) &&
- (data->surface->format->Gmask == 0x00FF0000) &&
- (data->surface->format->Bmask == 0x0000FF00) &&
- (data->surface->format->Amask == 0x000000FF))
+ if ((data->surface->format->Amask == 0xFF000000) &&
+ (data->surface->format->Rmask == 0x00FF0000) &&
+ (data->surface->format->Gmask == 0x0000FF00) &&
+ (data->surface->format->Bmask == 0x000000FF))
{
sourceFormat = GL_BGRA;
result.alpha = true;
}
- else if ((data->surface->format->Bmask == 0xFF000000) &&
- (data->surface->format->Gmask == 0x00FF0000) &&
- (data->surface->format->Rmask == 0x0000FF00) &&
- (data->surface->format->Amask == 0x000000FF))
+ else if ((data->surface->format->Amask == 0xFF000000) &&
+ (data->surface->format->Bmask == 0x00FF0000) &&
+ (data->surface->format->Gmask == 0x0000FF00) &&
+ (data->surface->format->Rmask == 0x000000FF))
{
sourceFormat = GL_RGBA;
result.alpha = true;
}
else
{
- GetLogger()->Error("Auto texture format failed\n");
- return Gfx::Texture(); // other format?
+ sourceFormat = GL_RGBA;
+ convert = true;
}
}
else
@@ -499,16 +503,43 @@ Gfx::Texture Gfx::CGLDevice::CreateTexture(ImageData *data, const Gfx::TextureCr
}
else
{
- GetLogger()->Error("Auto texture format failed\n");
- return Gfx::Texture(); // other format?
+ sourceFormat = GL_RGBA;
+ convert = true;
}
}
}
else
assert(false);
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, data->surface->w, data->surface->h,
- 0, sourceFormat, GL_UNSIGNED_BYTE, data->surface->pixels);
+ SDL_Surface* actualSurface = data->surface;
+ SDL_Surface* convertedSurface = nullptr;
+
+ if (convert)
+ {
+ SDL_PixelFormat format;
+ format.BytesPerPixel = 4;
+ format.BitsPerPixel = 32;
+ format.alpha = 0;
+ format.colorkey = 0;
+ format.Aloss = format.Bloss = format.Gloss = format.Rloss = 0;
+ format.Amask = 0xFF000000;
+ format.Ashift = 24;
+ format.Bmask = 0x00FF0000;
+ format.Bshift = 16;
+ format.Gmask = 0x0000FF00;
+ format.Gshift = 8;
+ format.Rmask = 0x000000FF;
+ format.Rshift = 0;
+ format.palette = nullptr;
+ convertedSurface = SDL_ConvertSurface(data->surface, &format, SDL_SWSURFACE);
+ if (convertedSurface != nullptr)
+ actualSurface = convertedSurface;
+ }
+
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, actualSurface->w, actualSurface->h,
+ 0, sourceFormat, GL_UNSIGNED_BYTE, actualSurface->pixels);
+
+ SDL_FreeSurface(convertedSurface);
// Restore the previous state of 1st stage