From a3a57df0be5c9d1d4ebbd153cabadbca48d16e79 Mon Sep 17 00:00:00 2001 From: Evan Goers Date: Mon, 26 Nov 2012 06:29:34 +0000 Subject: Abstracted many more GL functions. Added in useful texture unit info to State::init(). Cleaned up many non-abstracted GL functions used in draw.cc and state.cc. --- src/render/draw.cc | 50 ++++++++++---------- src/render/gl.cc | 134 +++++++++++++++++++++++++++++++++++++++++++++++++++- src/render/gl.h | 56 ++++++++++++++++++++-- src/render/state.cc | 27 ++++++----- src/render/state.h | 4 ++ 5 files changed, 230 insertions(+), 41 deletions(-) (limited to 'src/render') diff --git a/src/render/draw.cc b/src/render/draw.cc index dea0c6b..59f4a59 100644 --- a/src/render/draw.cc +++ b/src/render/draw.cc @@ -91,7 +91,7 @@ void pass_prepare(float seconds) zone_ambient[i] = core::localplayer()->zone()->ambient_color()[i]; } zone_ambient[3] = 1.0f; - glLightModelfv(GL_LIGHT_MODEL_AMBIENT, zone_ambient); + gl::lightmodel(GL_LIGHT_MODEL_AMBIENT, zone_ambient); // zone light sources for (core::Zone::Content::iterator it = zone->content().begin(); it != zone->content().end(); it++) { @@ -249,13 +249,13 @@ void draw_globe_corona(const math::Vector3f location, const math::Color & color, gl::color(drawcolor); gl::begin(gl::Quads); - glTexCoord2f(0, 1); + gl::texcoord(0, 1); gl::vertex((Camera::axis().up() - Camera::axis().left()) * radius * 4.0f); - glTexCoord2f(0, 0); + gl::texcoord(0, 0); gl::vertex((Camera::axis().up() + Camera::axis().left()) * radius * 4.0f); - glTexCoord2f(1, 0); + gl::texcoord(1, 0); gl::vertex((Camera::axis().up() * -1 + Camera::axis().left()) * radius * 4.0f); - glTexCoord2f(1, 1); + gl::texcoord(1, 1); gl::vertex((Camera::axis().up() * -1 - Camera::axis().left()) * radius * 4.0f); gl::end(); @@ -272,7 +272,7 @@ void draw_pass_globes() { // FIXME is this ever reset ? GLfloat globe_specular[] = { 0.25f, 0.25f, 0.25f, 1.0f }; - glMaterialfv(GL_FRONT, GL_SPECULAR, globe_specular); + gl::material(GL_FRONT, GL_SPECULAR, globe_specular); // Globes have to be rendered distance sorted, closest last. // Globes behind farplane are rescaled and repositioned. @@ -852,13 +852,13 @@ void draw_model_lights(model::Model *model, const float scale, // draw the quad gl::color(color); - glTexCoord2f(1, 0); + gl::texcoord(1, 0); gl::vertex(location + (Camera::axis().up() - Camera::axis().left()) * light_size); - glTexCoord2f(0, 0); + gl::texcoord(0, 0); gl::vertex(location + (Camera::axis().up() + Camera::axis().left()) * light_size); - glTexCoord2f(0, 1); + gl::texcoord(0, 1); gl::vertex(location + (Camera::axis().up() * -1 + Camera::axis().left()) * light_size); - glTexCoord2f(1, 1); + gl::texcoord(1, 1); gl::vertex(location + (Camera::axis().up() * -1 - Camera::axis().left()) * light_size); Stats::quads++; @@ -946,13 +946,13 @@ void draw_model_lights(model::Model *model, const float scale, // draw the quad gl::color(color); - glTexCoord2f(1, 0); + gl::texcoord(1, 0); gl::vertex(location + (flare_axis.up() + flare_axis.left()) * light_size); - glTexCoord2f(0, 0); + gl::texcoord(0, 0); gl::vertex(location + (flare_axis.up() - flare_axis.left()) * light_size); - glTexCoord2f(0, 1); + gl::texcoord(0, 1); gl::vertex(location + (flare_axis.up() * -1 - flare_axis.left()) * light_size); - glTexCoord2f(1, 1); + gl::texcoord(1, 1); gl::vertex(location + (flare_axis.up() * -1 + flare_axis.left()) * light_size); Stats::quads++; @@ -1096,7 +1096,7 @@ void draw(float seconds) gl::disable(GL_DEPTH_TEST); // disable depth testing gl::depthmask(GL_FALSE); // disable depth buffer writing - glPolygonMode(GL_FRONT, GL_FILL); + gl::polygonmode(GL_FRONT, GL_FILL); draw_pass_sky(); // draw the skybox @@ -1124,20 +1124,20 @@ void draw(float seconds) // Interleaved format is GL_T2F_N3F_V3F // void glTexCoordPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr ) - glTexCoordPointer(2, GL_FLOAT, 8 * sizeof(GLfloat), 0); + gl::texcoordpointer(2, GL_FLOAT, 8 * sizeof(GLfloat), 0); // void glNormalPointer(GLenum type, GLsizei stride, const GLvoid *ptr) - glNormalPointer(GL_FLOAT, 8 * sizeof(GLfloat), (void*) (2 * sizeof(GLfloat))); + gl::normalpointer(GL_FLOAT, 8 * sizeof(GLfloat), (void*) (2 * sizeof(GLfloat))); // void glVertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr) - glVertexPointer(3, GL_FLOAT, 8 * sizeof(GLfloat), (void*) (5 * sizeof(GLfloat))); + gl::vertexpointer(3, GL_FLOAT, 8 * sizeof(GLfloat), (void*) (5 * sizeof(GLfloat))); } else { - glInterleavedArrays(GL_T2F_N3F_V3F, 0, core::game()->vertexarray()->ptr()); + gl::interleavedarrays(GL_T2F_N3F_V3F, 0, core::game()->vertexarray()->ptr()); } // enable vertex arrays - glEnableClientState(GL_TEXTURE_COORD_ARRAY); - glEnableClientState(GL_NORMAL_ARRAY); - glEnableClientState(GL_VERTEX_ARRAY); + gl::enableclientstate(GL_TEXTURE_COORD_ARRAY); + gl::enableclientstate(GL_NORMAL_ARRAY); + gl::enableclientstate(GL_VERTEX_ARRAY); State::set_normalize(true); @@ -1198,9 +1198,9 @@ void draw(float seconds) } } - glDisableClientState(GL_VERTEX_ARRAY); - glDisableClientState(GL_NORMAL_ARRAY); - glDisableClientState(GL_TEXTURE_COORD_ARRAY); + gl::disableclientstate(GL_VERTEX_ARRAY); + gl::disableclientstate(GL_NORMAL_ARRAY); + gl::disableclientstate(GL_TEXTURE_COORD_ARRAY); // draw physics if (r_physics && r_physics->value()) { diff --git a/src/render/gl.cc b/src/render/gl.cc index 48b9b52..8debb8e 100644 --- a/src/render/gl.cc +++ b/src/render/gl.cc @@ -104,6 +104,16 @@ void disable(GLenum cap) ::glDisable(cap); } +void enableclientstate(GLenum cap) +{ + glEnableClientState(cap); +} + +void disableclientstate(GLenum cap) +{ + glDisableClientState(cap); +} + void clear(GLbitfield mask) { glClear(mask); @@ -193,6 +203,26 @@ void texcoord(const float x, const float y, const float z) glTexCoord3f(x, y, z); } +void texcoordpointer(GLint size, GLenum type, GLsizei stride, const GLvoid* pointer) +{ + glTexCoordPointer(size, type, stride, pointer); +} + +void normalpointer(GLenum type, GLsizei stride, const GLvoid* pointer) +{ + glNormalPointer(type, stride, pointer); +} + +void vertexpointer(GLint size, GLenum type, GLsizei stride, const GLvoid* pointer) +{ + glVertexPointer(size, type, stride, pointer); +} + +void interleavedarrays(GLenum format, GLsizei stride, const GLvoid* pointer) +{ + glInterleavedArrays(format, stride, pointer); +} + void push() { glPushMatrix(); @@ -243,15 +273,115 @@ void frustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdou glFrustum(left, right, bottom, top, znear, zfar); } -void texgeni(GLenum coord, GLenum param, GLenum value) +void lightmodel(GLenum pname, GLfloat param) +{ + glLightModelf(pname, param); +} + +void lightmodel(GLenum pname, GLint param) +{ + glLightModeli(pname, param); +} + +void lightmodel(GLenum pname, const GLfloat* param) +{ + glLightModelfv(pname, param); +} + +void lightmodel(GLenum pname, const GLint* param) +{ + glLightModeliv(pname, param); +} + +void polygonmode(GLenum face, GLenum mode) +{ + glPolygonMode(face, mode); +} + +void colormaterial(GLenum face, GLenum mode) +{ + glColorMaterial(face, mode); +} + +void material(GLenum face, GLenum pname, GLfloat param) +{ + glMaterialf(face, pname, param); +} + +void material(GLenum face, GLenum pname, GLint param) +{ + glMateriali(face, pname, param); +} + +void material(GLenum face, GLenum pname, const GLfloat* param) +{ + glMaterialfv(face, pname, param); +} + +void material(GLenum face, GLenum pname, const GLint* param) +{ + glMaterialiv(face, pname, param); +} + +void texenv(GLenum target, GLenum pname, GLfloat param) +{ + glTexEnvf(target, pname, param); +} + +void texenv(GLenum target, GLenum pname, GLint param) +{ + glTexEnvi(target, pname, param); +} + +void texenv(GLenum target, GLenum pname, const GLfloat* param) +{ + glTexEnvfv(target, pname, param); +} + +void texenv(GLenum target, GLenum pname, const GLint* param) +{ + glTexEnviv(target, pname, param); +} + +void texgen(GLenum coord, GLenum param, GLint value) { glTexGeni(coord, param, value); } -void texgenfv(GLenum coord, GLenum param, const GLfloat* value) +void texgen(GLenum coord, GLenum param, GLfloat value) +{ + glTexGenf(coord, param, value); +} + +void texgen(GLenum coord, GLenum param, GLdouble value) +{ + glTexGend(coord, param, value); +} + +void texgen(GLenum coord, GLenum param, const GLint* value) +{ + glTexGeniv(coord, param, value); +} + +void texgen(GLenum coord, GLenum param, const GLfloat* value) { glTexGenfv(coord, param, value); } +void texgen(GLenum coord, GLenum param, const GLdouble* value) +{ + glTexGendv(coord, param, value); +} + +void activetexture(GLenum texture) +{ + glActiveTexture(texture); +} + +void clientactivetexture(GLenum texture) +{ + glClientActiveTexture(texture); +} + } // namespace gl diff --git a/src/render/gl.h b/src/render/gl.h index 4dea544..8d8e48e 100644 --- a/src/render/gl.h +++ b/src/render/gl.h @@ -116,6 +116,12 @@ void enable(GLenum cap); /// glDisable void disable(GLenum cap); +/// glEnableClientState +void enableclientstate(GLenum cap); + +/// glDisableClientState +void disableclientstate(GLenum cap); + /// glShadeModel void shademodel(GLenum mode); @@ -174,6 +180,18 @@ void texcoord(const math::Vector2f& vector); /// glTexCoord void texcoord(const float x, const float y, const float z); +/// glTexCoordPointer +void texcoordpointer(GLint size, GLenum type, GLsizei stride, const GLvoid* pointer); + +/// glNormalPointer +void normalpointer(GLenum type, GLsizei stride, const GLvoid* pointer); + +/// glVertexPointer +void vertexpointer(GLint size, GLenum type, GLsizei stride, const GLvoid* pointer); + +/// glInterleavedArrays +void interleavedarrays(GLenum format, GLsizei stride, const GLvoid* pointer); + /// glNormal void normal(const math::Vector3f & vector); @@ -250,10 +268,42 @@ void loadidentity(); /// Perspective matrix void frustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble znear, GLdouble zfar); -/// Texture coordinate generation -void texgeni(GLenum coord, GLenum param, GLenum value); +/// Light model +void lightmodel(GLenum pname, GLfloat param); +void lightmodel(GLenum pname, GLint param); +void lightmodel(GLenum pname, const GLfloat* param); +void lightmodel(GLenum pname, const GLint* param); + +/// Polygon mode +void polygonmode(GLenum face, GLenum mode); + +/// Color material parameters +void colormaterial(GLenum face, GLenum mode); -void texgenfv(GLenum coord, GLenum param, const GLfloat* value); +/// Material parameters +void material(GLenum face, GLenum pname, GLfloat param); +void material(GLenum face, GLenum pname, GLint param); +void material(GLenum face, GLenum pname, const GLfloat* param); +void material(GLenum face, GLenum pname, const GLint* param); + +/// Texture environment parameters +void texenv(GLenum target, GLenum pname, GLfloat param); +void texenv(GLenum target, GLenum pname, GLint param); +void texenv(GLenum target, GLenum pname, const GLfloat* param); +void texenv(GLenum target, GLenum pname, const GLint* param); + +/// Texture coordinate generation +void texgen(GLenum coord, GLenum param, GLint value); +void texgen(GLenum coord, GLenum param, GLfloat value); +void texgen(GLenum coord, GLenum param, GLdouble value); +void texgen(GLenum coord, GLenum param, const GLint* value); +void texgen(GLenum coord, GLenum param, const GLfloat* value); +void texgen(GLenum coord, GLenum param, const GLdouble* value); + +/// Active server-side texture +void activetexture(GLenum texture); +/// Active client-side texture +void clientactivetexture(GLenum texture); typedef void (* APIENTRY genbuffers_func)(GLuint count, GLuint *id); typedef void (* APIENTRY deletebuffers_func)(GLuint count, GLuint *id); diff --git a/src/render/state.cc b/src/render/state.cc index ce3a0ab..83f2704 100644 --- a/src/render/state.cc +++ b/src/render/state.cc @@ -23,6 +23,7 @@ bool State::state_has_generate_mipmaps = false; bool State::state_has_vbo = false; GLuint State::state_vbo = 0; int State::state_maxlights; +int State::state_maxtextureunits; math::Color State::state_color_primary; @@ -90,7 +91,7 @@ void State::init(int width, int height) state_has_vbo = false; } - con_print << " vertex bufer objects "; + con_print << " vertex buffer objects "; if (state_has_vbo) con_print << "enabled" << std::endl; else @@ -99,6 +100,10 @@ void State::init(int width, int height) // probe maximal number of lights glGetIntegerv(GL_MAX_LIGHTS, &state_maxlights); con_debug << " maximum number of OpenGL lights is " << state_maxlights << std::endl; + + // probe maximal number of texture units + glGetIntegerv(GL_MAX_TEXTURE_UNITS, &state_maxtextureunits); + con_debug << " maximum number of OpenGL texture units is " << state_maxtextureunits << std::endl; // Generate VBO if (state_has_vbo) @@ -142,11 +147,11 @@ void State::clear() //gl::shademodel(GL_FLAT); // lighting model - glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE); - glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL, GL_SEPARATE_SPECULAR_COLOR); + gl::lightmodel(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE); + gl::lightmodel(GL_LIGHT_MODEL_COLOR_CONTROL, GL_SEPARATE_SPECULAR_COLOR); // color tracking - glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE); + gl::colormaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE); // alpha blending function gl::blendfunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); @@ -217,7 +222,7 @@ void State::use_material(const model::Material * material) { reset(); // default specular shininess setting - glMateriali(GL_FRONT, GL_SHININESS, 8); + gl::material(GL_FRONT, GL_SHININESS, 8); if (!material) { color.assign(1.0f, 0.0f, 1.0f); @@ -291,8 +296,8 @@ void State::use_material(const model::Material * material) { gl::enable(GL_TEXTURE_2D); if (material->flags() & model::Material::Environment) { - gl::texgeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP); - gl::texgeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP); + gl::texgen(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP); + gl::texgen(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP); gl::enable(GL_TEXTURE_GEN_S); gl::enable(GL_TEXTURE_GEN_T); @@ -304,9 +309,9 @@ void State::use_material(const model::Material * material) { if (core::localplayer()->zone()->sky().size()) { gl::enable(GL_TEXTURE_CUBE_MAP); - glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP); - glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP); - glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP); + gl::texgen(GL_S, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP); + gl::texgen(GL_T, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP); + gl::texgen(GL_R, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP); gl::enable(GL_TEXTURE_GEN_S); gl::enable(GL_TEXTURE_GEN_T); @@ -314,7 +319,7 @@ void State::use_material(const model::Material * material) { } else { color.assign(0.0f, 0.0f, 0.0f); } - glMateriali(GL_FRONT, GL_SHININESS, 4); + gl::material(GL_FRONT, GL_SHININESS, 4); } } diff --git a/src/render/state.h b/src/render/state.h index cda64d5..ea55602 100644 --- a/src/render/state.h +++ b/src/render/state.h @@ -104,6 +104,9 @@ public: inline static int max_lights() { return state_maxlights; } + inline static int max_textureunits() { + return state_maxtextureunits; + } static void set_normalize(const bool enable=true); @@ -116,6 +119,7 @@ private: static bool state_has_vbo; static GLuint state_vbo; static int state_maxlights; + static int state_maxtextureunits; static math::Color state_color_primary; // current primary color static math::Color state_color_secondary; // current secondary color -- cgit v1.2.3