} // namespace
GLTexture::GLTexture(unsigned int width, unsigned int height) :
- handle(),
- texture_width(),
- texture_height(),
- image_width(),
- image_height()
+ m_handle(),
+ m_texture_width(),
+ m_texture_height(),
+ m_image_width(),
+ m_image_height()
{
+#ifdef GL_VERSION_ES_CM_1_0
assert(is_power_of_2(width));
assert(is_power_of_2(height));
- texture_width = width;
- texture_height = height;
- image_width = width;
- image_height = height;
+#endif
+ m_texture_width = width;
+ m_texture_height = height;
+ m_image_width = width;
+ m_image_height = height;
assert_gl("before creating texture");
- glGenTextures(1, &handle);
+ glGenTextures(1, &m_handle);
try {
- glBindTexture(GL_TEXTURE_2D, handle);
+ glBindTexture(GL_TEXTURE_2D, m_handle);
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texture_width,
- texture_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
+ m_texture_width, m_texture_height,
+ 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
set_texture_params();
} catch(...) {
- glDeleteTextures(1, &handle);
+ glDeleteTextures(1, &m_handle);
throw;
}
}
GLTexture::GLTexture(SDL_Surface* image) :
- handle(),
- texture_width(),
- texture_height(),
- image_width(),
- image_height()
+ m_handle(),
+ m_texture_width(),
+ m_texture_height(),
+ m_image_width(),
+ m_image_height()
{
- texture_width = next_power_of_two(image->w);
- texture_height = next_power_of_two(image->h);
- image_width = image->w;
- image_height = image->h;
+#ifdef GL_VERSION_ES_CM_1_0
+ m_texture_width = next_power_of_two(image->w);
+ m_texture_height = next_power_of_two(image->h);
+#else
+ if (GLEW_ARB_texture_non_power_of_two)
+ {
+ m_texture_width = image->w;
+ m_texture_height = image->h;
+ }
+ else
+ {
+ m_texture_width = next_power_of_two(image->w);
+ m_texture_height = next_power_of_two(image->h);
+ }
+#endif
+
+ m_image_width = image->w;
+ m_image_height = image->h;
#if SDL_BYTEORDER == SDL_BIG_ENDIAN
- SDL_Surface* convert = SDL_CreateRGBSurface(SDL_SWSURFACE,
- texture_width, texture_height, 32,
+ SDL_Surface* convert = SDL_CreateRGBSurface(0,
+ m_texture_width, m_texture_height, 32,
0xff000000, 0x00ff0000, 0x0000ff00, 0x000000ff);
#else
- SDL_Surface* convert = SDL_CreateRGBSurface(SDL_SWSURFACE,
- texture_width, texture_height, 32,
+ SDL_Surface* convert = SDL_CreateRGBSurface(0,
+ m_texture_width, m_texture_height, 32,
0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000);
#endif
throw std::runtime_error("Couldn't create texture: out of memory");
}
- SDL_SetAlpha(image, 0, 0);
+ SDL_SetSurfaceBlendMode(image, SDL_BLENDMODE_NONE);
SDL_BlitSurface(image, 0, convert, 0);
assert_gl("before creating texture");
- glGenTextures(1, &handle);
+ glGenTextures(1, &m_handle);
try {
GLenum sdl_format;
sdl_format = GL_RGB;
else if(convert->format->BytesPerPixel == 4)
sdl_format = GL_RGBA;
- else
+ else {
+ sdl_format = GL_RGBA;
assert(false);
+ }
- glBindTexture(GL_TEXTURE_2D, handle);
+ glBindTexture(GL_TEXTURE_2D, m_handle);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
#ifdef GL_UNPACK_ROW_LENGTH
glPixelStorei(GL_UNPACK_ROW_LENGTH, convert->pitch/convert->format->BytesPerPixel);
{
SDL_LockSurface(convert);
}
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texture_width,
- texture_height, 0, sdl_format,
+
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
+ m_texture_width, m_texture_height, 0, sdl_format,
GL_UNSIGNED_BYTE, convert->pixels);
+
+ // no not use mipmaps
+ if(false)
+ {
+ glGenerateMipmap(GL_TEXTURE_2D);
+ }
+
if(SDL_MUSTLOCK(convert))
{
SDL_UnlockSurface(convert);
set_texture_params();
} catch(...) {
- glDeleteTextures(1, &handle);
+ glDeleteTextures(1, &m_handle);
SDL_FreeSurface(convert);
throw;
}
GLTexture::~GLTexture()
{
- glDeleteTextures(1, &handle);
+ glDeleteTextures(1, &m_handle);
}
void
{
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-#ifdef GL_CLAMP
- /* OpenGL ES doesn't support it */
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
-#endif
+
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
assert_gl("set texture params");
}