support for non power of two textures
This commit is contained in:
parent
f14706206a
commit
d006e52c78
|
@ -24,19 +24,19 @@
|
||||||
#ifndef GLUTIL_H
|
#ifndef GLUTIL_H
|
||||||
#define GLUTIL_H
|
#define GLUTIL_H
|
||||||
|
|
||||||
#include <GLES2/gl2.h>
|
|
||||||
#if OPENGL_ES==2
|
#if OPENGL_ES==2
|
||||||
#include <GLES2/gl2.h>
|
#include <GLES2/gl2.h>
|
||||||
#elif OPENGL_ES==1
|
#elif OPENGL_ES==1
|
||||||
|
#include <GLES2/gl2.h>
|
||||||
#include <GLES/gl.h>
|
#include <GLES/gl.h>
|
||||||
|
|
||||||
// define OpenGL 2.0 API just to make compile, it wont actually be used
|
// define OpenGL ES 2.0 API just to make compile, it wont actually be used
|
||||||
inline void glBindFramebuffer (GLenum target, GLuint framebuffer) { }
|
inline void glBindFramebuffer (GLenum target, GLuint framebuffer) { }
|
||||||
inline void glDeleteFramebuffers (GLsizei n, const GLuint* framebuffers) { }
|
inline void glDeleteFramebuffers (GLsizei n, const GLuint* framebuffers) { }
|
||||||
inline void glFramebufferTexture2D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level) { }
|
inline void glFramebufferTexture2D (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level) { }
|
||||||
inline void glGenFramebuffers (GLsizei n, GLuint* framebuffers) { }
|
inline void glGenFramebuffers (GLsizei n, GLuint* framebuffers) { }
|
||||||
inline void glGenerateMipmap (GLenum target) { }
|
inline void glGenerateMipmap (GLenum target) { }
|
||||||
inline GLenum GL_APIENTRY glCheckFramebufferStatus (GLenum target) { return GL_NONE; }
|
inline GLenum GL_APIENTRY glCheckFramebufferStatus (GLenum target) { return 0; }
|
||||||
inline GLuint glCreateShader (GLenum type) { return 0; }
|
inline GLuint glCreateShader (GLenum type) { return 0; }
|
||||||
inline void glDeleteShader (GLuint shader) { }
|
inline void glDeleteShader (GLuint shader) { }
|
||||||
inline void glCompileShader (GLuint shader) { }
|
inline void glCompileShader (GLuint shader) { }
|
||||||
|
@ -85,6 +85,8 @@ inline void glVertexAttrib3fv (GLuint indx, const GLfloat* values) { }
|
||||||
inline void glVertexAttrib4f (GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w) { }
|
inline void glVertexAttrib4f (GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w) { }
|
||||||
inline void glVertexAttrib4fv (GLuint indx, const GLfloat* values) { }
|
inline void glVertexAttrib4fv (GLuint indx, const GLfloat* values) { }
|
||||||
inline void glVertexAttribPointer (GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr) { }
|
inline void glVertexAttribPointer (GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const GLvoid* ptr) { }
|
||||||
|
inline void glEnableVertexAttribArray (GLuint index) { }
|
||||||
|
inline void glDisableVertexAttribArray (GLuint index) { }
|
||||||
|
|
||||||
#else
|
#else
|
||||||
#define GLEW_STATIC
|
#define GLEW_STATIC
|
||||||
|
|
|
@ -270,7 +270,12 @@ bool Graphics::canUseBilinearFiltering()
|
||||||
|
|
||||||
bool Graphics::canUseHardwareBuffers()
|
bool Graphics::canUseHardwareBuffers()
|
||||||
{
|
{
|
||||||
#ifndef OPENGL_ES
|
#if OPENGL_ES==2
|
||||||
|
return true;
|
||||||
|
#elif OPENGL_ES==1
|
||||||
|
// OpenGL ES 1.1 supports it but OpenGL ES 1.0 not
|
||||||
|
return false;
|
||||||
|
#else
|
||||||
// vertex buffer objects is supported by OpenGL 1.5
|
// vertex buffer objects is supported by OpenGL 1.5
|
||||||
if(!GLEW_ARB_vertex_buffer_object)
|
if(!GLEW_ARB_vertex_buffer_object)
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -28,7 +28,7 @@
|
||||||
#include "painter.h"
|
#include "painter.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Painter using OpenGL 1.0 fixed-function rendering pipeline,
|
* Painter using OpenGL 1.1 fixed-function rendering pipeline,
|
||||||
* compatible with OpenGL ES 1.0 and intended to be used on
|
* compatible with OpenGL ES 1.0 and intended to be used on
|
||||||
* older graphics cards. Shaders are not available
|
* older graphics cards. Shaders are not available
|
||||||
* for this painter engine.
|
* for this painter engine.
|
||||||
|
|
|
@ -45,18 +45,39 @@ Texture::~Texture()
|
||||||
uint Texture::internalLoadGLTexture(uchar *pixels, int channels, int width, int height)
|
uint Texture::internalLoadGLTexture(uchar *pixels, int channels, int width, int height)
|
||||||
{
|
{
|
||||||
m_size.resize(width, height);
|
m_size.resize(width, height);
|
||||||
m_transformMatrix = { 1.0f/width, 0.0f,
|
|
||||||
0.0f, 1.0f/height };
|
|
||||||
|
|
||||||
// gets max texture size supported by the driver
|
// convert texture pixel data to power of two size, only required for OpenGL 1.5 or older
|
||||||
static GLint maxTexSize = -1;
|
Size glSize;
|
||||||
if(maxTexSize == -1)
|
std::vector<uint8> tmp;
|
||||||
glGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxTexSize);
|
if(!g_graphics.canUseNonPowerOfTwoTextures()) {
|
||||||
|
int glWidth = 1;
|
||||||
|
while(glWidth < width)
|
||||||
|
glWidth = glWidth << 1;
|
||||||
|
|
||||||
|
int glHeight = 1;
|
||||||
|
while(glHeight < height)
|
||||||
|
glHeight = glHeight << 1;
|
||||||
|
|
||||||
|
if(m_size != glSize && pixels) {
|
||||||
|
tmp.resize(glHeight*glWidth*channels, 0);
|
||||||
|
for(int y=0; y<height; ++y)
|
||||||
|
for(int x=0; x<width; ++x)
|
||||||
|
for(int i=0; i<channels; ++i)
|
||||||
|
tmp[y*glWidth*channels+x*channels+i] = pixels[y*width*channels+x*channels+i];
|
||||||
|
pixels = &tmp[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
glSize.resize(glWidth, glHeight);
|
||||||
|
} else
|
||||||
|
glSize = m_size;
|
||||||
|
|
||||||
|
m_transformMatrix = { 1.0f/glSize.width(), 0.0f,
|
||||||
|
0.0f, 1.0f/glSize.height() };
|
||||||
|
|
||||||
// checks texture max size
|
// checks texture max size
|
||||||
if(width > maxTexSize || height > maxTexSize) {
|
if(std::max(glSize.width(), glSize.height()) > g_graphics.getMaxTextureSize()) {
|
||||||
logError("loading texture with size ", width, "x", height, " failed, "
|
logError("loading texture with size ", width, "x", height, " failed, "
|
||||||
"the maximum size allowed by the graphics card is ", maxTexSize, "x", maxTexSize, ",",
|
"the maximum size allowed by the graphics card is ", g_graphics.getMaxTextureSize(), "x", g_graphics.getMaxTextureSize(), ",",
|
||||||
"to prevent crashes the texture will be displayed as a blank texture");
|
"to prevent crashes the texture will be displayed as a blank texture");
|
||||||
//TODO: make a workaround, could be bilinear scaling the texture
|
//TODO: make a workaround, could be bilinear scaling the texture
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -87,7 +108,7 @@ uint Texture::internalLoadGLTexture(uchar *pixels, int channels, int width, int
|
||||||
}
|
}
|
||||||
|
|
||||||
// load pixels into gl memory
|
// load pixels into gl memory
|
||||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, m_size.width(), m_size.height(), 0, format, GL_UNSIGNED_BYTE, pixels);
|
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, glSize.width(), glSize.height(), 0, format, GL_UNSIGNED_BYTE, pixels);
|
||||||
|
|
||||||
GLint texParam = GL_REPEAT;
|
GLint texParam = GL_REPEAT;
|
||||||
if(g_graphics.canUseClampToEdge())
|
if(g_graphics.canUseClampToEdge())
|
||||||
|
@ -104,7 +125,7 @@ uint Texture::internalLoadGLTexture(uchar *pixels, int channels, int width, int
|
||||||
void Texture::bind()
|
void Texture::bind()
|
||||||
{
|
{
|
||||||
// must reset painter texture state
|
// must reset painter texture state
|
||||||
//g_painter->setTexture(this);
|
g_painter->setTexture(this);
|
||||||
glBindTexture(GL_TEXTURE_2D, m_textureId);
|
glBindTexture(GL_TEXTURE_2D, m_textureId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue