]> git.tdb.fi Git - libs/gl.git/commitdiff
Use RAII checks for extensions and versions
authorMikko Rasa <tdb@tdb.fi>
Mon, 8 Sep 2008 19:39:39 +0000 (19:39 +0000)
committerMikko Rasa <tdb@tdb.fi>
Mon, 8 Sep 2008 19:39:39 +0000 (19:39 +0000)
Add functions for drawing vertex array elements

18 files changed:
source/batch.cpp
source/blend.cpp
source/extension.h
source/framebuffer.cpp
source/immediate.cpp
source/mesh.cpp
source/mesh.h
source/program.cpp
source/program.h
source/programdata.cpp
source/renderbuffer.cpp
source/shader.cpp
source/shader.h
source/texture3d.cpp
source/texunit.cpp
source/vertexarray.cpp
source/vertexarray.h
source/vertexbuffer.cpp

index 385b4697085f6215e075344ac9a980007212e193..f2a57bcf2fa2ad4f1ea1f4f6c90a17ab85d8cf3f 100644 (file)
@@ -7,7 +7,7 @@ Distributed under the LGPL
 
 #include "batch.h"
 #include "extension.h"
-#include "version_1_2.h"
+#include "vertexarray.h"
 
 using namespace std;
 
@@ -18,9 +18,7 @@ Batch::Batch(PrimitiveType t):
        type(t),
        min_index(0),
        max_index(0)
-{
-       require_version(1, 2);
-}
+{ }
 
 Batch &Batch::append(uint i)
 {
@@ -45,7 +43,7 @@ void Batch::append(const vector<uint> &ind)
 
 void Batch::draw() const
 {
-       glDrawRangeElements(type, min_index, max_index, indices.size(), GL_UNSIGNED_INT, &indices[0]);
+       draw_range_elements(type, min_index, max_index, indices.size(), &indices[0]);
 }
 
 
index 841d88b86e1f7e8070edf60c6c390f010f8c33dc..854b2032d4e26ea31168beaf141790d6ffdb536f 100644 (file)
@@ -14,7 +14,7 @@ namespace GL {
 
 void blend_equation(BlendEquation eq)
 {
-       require_version(1, 2);
+       static RequireVersion _ver(1, 2);
        glBlendEquation(eq);
 }
 
index aec516e2766a3bce033f3bbd0e7942e04417c587..4410cc3c316e244ec7ecd934e4668befffb6126d 100644 (file)
@@ -38,11 +38,27 @@ Checks that an extension is supported and throws if it isn't.
 */
 void require_extension(const std::string &);
 
+/**
+RAII version of require_extension.  Useful as a static local variable.
+*/
+struct RequireExtension
+{
+       RequireExtension(const std::string &e) { require_extension(e); }
+};
+
 /**
 Checks that the OpenGL version is at least a.b and throws if it isn't.
 */
 void require_version(unsigned a, unsigned b);
 
+/**
+RAII version of require_version.  Useful as a static local variable.
+*/
+struct RequireVersion
+{
+       RequireVersion(unsigned a, unsigned b) { require_version(a, b); }
+};
+
 /**
 Returns the address of an extension function.
 */
index d9d873bb7aa855de4491057a412178b964444f0e..97a0147d4d3e2966777f715cd537022976a44a1c 100644 (file)
@@ -16,7 +16,7 @@ namespace GL {
 
 Framebuffer::Framebuffer()
 {
-       require_extension("GL_EXT_framebuffer_object");
+       static RequireExtension _ext("GL_EXT_framebuffer_object");
 
        glGenFramebuffersEXT(1, &id);
        bind();
index 8b62d2c4cc9cb6c3cee1d8b6f42a23d719490f95..e12ac9b53ca01ec2b3d9b73a86898605d60c724d 100644 (file)
@@ -18,7 +18,7 @@ Immediate::Immediate(VertexFormat f):
 void Immediate::end_()
 {
        array.apply();
-       glDrawElements(type, indices.size(), UNSIGNED_INT, &indices[0]);
+       draw_elements(type, indices.size(), &indices[0]);
 
        array.clear();
        indices.clear();
index 3a275e5b0731a3332e08fdbfb5e9e76f14be0339..fec753d0d3938d157b93403cd47716539f30551c 100644 (file)
@@ -33,6 +33,12 @@ void Mesh::add_batch(const Batch &b)
        batches.push_back(b);
 }
 
+void Mesh::clear()
+{
+       vertices.clear();
+       batches.clear();
+}
+
 void Mesh::draw() const
 {
        vertices.apply();
index e3753f8b867ce1516f66b680d5cc488142430209..633cf3ab377651a95bd8835cd6922c2b2a759656 100644 (file)
@@ -43,6 +43,7 @@ public:
        const VertexArray &get_vertices() const { return vertices; }
        void add_batch(const Batch &b);
        const std::list<Batch> &get_batches() { return batches; }
+       void clear();
        void draw() const;
 };
 
index eed8b87a469a1ccf3f58cdb9f43a5fba1c10764d..1b8ffe4dfe3b4fff4e20be818014fb91d083f6c4 100644 (file)
@@ -19,28 +19,29 @@ namespace Msp {
 namespace GL {
 
 Program::Program():
-       del_shaders(false),
-       linked(false)
+       del_shaders(false)
 {
-       require_extension("GL_ARB_shader_objects");
-       require_extension("GL_ARB_vertex_shader");
-
-       id=glCreateProgramObjectARB();
+       init();
 }
 
 Program::Program(const string &vert, const string &frag):
-       del_shaders(true),
-       linked(false)
+       del_shaders(true)
 {
-       require_extension("GL_ARB_shader_objects");
-       require_extension("GL_ARB_vertex_shader");
+       init();
 
-       id=glCreateProgramObjectARB();
        attach_shader(*new Shader(VERTEX_SHADER, vert));
        attach_shader(*new Shader(FRAGMENT_SHADER, frag));
        link();
 }
 
+void Program::init()
+{
+       static RequireExtension _ext("GL_ARB_shader_objects");
+
+       linked=false;
+       id=glCreateProgramObjectARB();
+}
+
 Program::~Program()
 {
        if(del_shaders)
@@ -77,6 +78,7 @@ void Program::set_del_shaders(bool ds)
 
 void Program::bind_attribute(uint index, const string &name)
 {
+       static RequireExtension _ext("GL_ARB_vertex_shader");
        glBindAttribLocationARB(id, index, name.c_str());
 }
 
@@ -120,41 +122,6 @@ int Program::get_uniform_location(const string &n) const
        return glGetUniformLocationARB(id, n.c_str());
 }
 
-/*void Program::uniform(int i, int v)
-{
-       glUniform1iARB(i, v);
-}
-
-void Program::uniform(int i, float x)
-{
-       glUniform1fARB(i, x);
-}
-
-void Program::uniform(int i, float x, float y)
-{
-       glUniform2fARB(i, x, y);
-}
-
-void Program::uniform(int i, float x, float y, float z)
-{
-       glUniform3fARB(i, x, y, z);
-}
-
-void Program::uniform(int i, float x, float y, float z, float w)
-{
-       glUniform4fARB(i, x, y, z, w);
-}
-
-void Program::uniform4(int i, const float *v)
-{
-       glUniform4fvARB(i, 1, v);
-}
-
-void Program::uniform_matrix4(int i, const float *v)
-{
-       glUniformMatrix4fvARB(i, 1, false, v);
-}*/
-
 void Program::unbind()
 {
        if(cur_prog)
index 82d06a109a9dde15927409b6cdf8a3e1e7272ebd..fde4d85439a2cfe9e7cb82a62aebd965f111d082 100644 (file)
@@ -47,6 +47,9 @@ public:
 
        Program();
        Program(const std::string &, const std::string &);
+private:
+       void init();
+public:
        virtual ~Program();
 
        void attach_shader(Shader &shader);
index 2a8b5970c86edfd3054d4931946dbb40c5bf7746..a7a9b037ef5b30861b4ce64f6eb66419506fb3e3 100644 (file)
@@ -17,7 +17,7 @@ namespace GL {
 
 ProgramData::ProgramData()
 {
-       require_extension("GL_ARB_shader_objects");
+       static RequireExtension _ext("GL_ARB_shader_objects");
 }
 
 ProgramData::~ProgramData()
index 49e0b74fbebdc908aa238eaedf6e2c0238ccf237..0f52ff595ec76bccee19f30c26e3f0e5f60ae7bb 100644 (file)
@@ -14,7 +14,7 @@ namespace GL {
 
 Renderbuffer::Renderbuffer()
 {
-       require_extension("GL_EXT_framebuffer_object");
+       static RequireExtension _ext("GL_EXT_framebuffer_object");
 
        glGenRenderbuffersEXT(1, &id);
        bind();
index 3c01242650d3bd26009a0a57711e34dc4a0779f7..93edafb45b35dab4dac34745cd404d51c1ad12e5 100644 (file)
@@ -15,29 +15,29 @@ using namespace std;
 namespace Msp {
 namespace GL {
 
-Shader::Shader(ShaderType t):
-       compiled(false)
+Shader::Shader(ShaderType t)
 {
-       if(t==FRAGMENT_SHADER)
-               require_extension("GL_ARB_fragment_program");
-       else if(t==VERTEX_SHADER)
-               require_extension("GL_ARB_vertex_program");
+       init(t);
+}
 
-       id=glCreateShaderObjectARB(t);
+Shader::Shader(ShaderType t, const string &src)
+{
+       init(t);
+
+       source(src);
+       compile();
 }
 
-Shader::Shader(ShaderType t, const string &src):
-       compiled(false)
+void Shader::init(ShaderType t)
 {
+       compiled=false;
+
        if(t==FRAGMENT_SHADER)
-               require_extension("GL_ARB_fragment_program");
+               static RequireExtension _ext("GL_ARB_fragment_program");
        else if(t==VERTEX_SHADER)
-               require_extension("GL_ARB_vertex_program");
+               static RequireExtension _ext("GL_ARB_vertex_program");
 
        id=glCreateShaderObjectARB(t);
-
-       source(src);
-       compile();
 }
 
 Shader::~Shader()
index cd01f2acda49a8c3374bc97c356263bccb653b91..06f769ccb94d8d66b7025fecfcc3de70688a8f10 100644 (file)
@@ -26,6 +26,9 @@ class Shader
 public:
        Shader(ShaderType t);
        Shader(ShaderType t, const std::string &);
+private:
+       void init(ShaderType);
+public:
        ~Shader();
 
        void source(sizei count, const char **str, const int *len);
index 2fc4f997396e3dcf7f3f1a9417532c8cd3364f9c..5f8649688655a1d420c82d061406fa1a6d24af63 100644 (file)
@@ -22,7 +22,7 @@ Texture3D::Texture3D():
        height(0),
        depth(0)
 {
-       require_version(1, 3);
+       static RequireVersion _ver(1, 3);
 
        target=GL_TEXTURE_3D;
        bind();
index ba3e7ca6208e3716029027dcdb253b7203221f15..7aced5cc3ba2ab182a4c5e37ce6b37f42e6e21a6 100644 (file)
@@ -34,7 +34,7 @@ TexUnit &TexUnit::activate(unsigned n)
 
        if(cur_unit!=&units[n] && (cur_unit || n))
        {
-               require_version(1, 3);
+               static RequireVersion _ver(1, 3);
                glActiveTexture(GL_TEXTURE0+n);
        }
        cur_unit=&units[n];
index c166e98718338c55bcfb175dde856d7c44e41c74..3c17141cfb59a592264505c7c67956cc5a9fd355 100644 (file)
@@ -5,7 +5,9 @@ Copyright © 2007  Mikko Rasa, Mikkosoft Productions
 Distributed under the LGPL
 */
 
+#include "extension.h"
 #include "gl.h"
+#include "version_1_2.h"
 #include "vertexarray.h"
 #include "vertexbuffer.h"
 
@@ -167,5 +169,27 @@ VertexArray::Loader::Loader(VertexArray &a):
        add("color4",    static_cast<void (Loader::*)(float, float, float, float)>(&Loader::color));
 }
 
+
+void array_element(int i)
+{
+       glArrayElement(i);
+}
+
+void draw_arrays(PrimitiveType mode, int first, sizei count)
+{
+       glDrawArrays(mode, first, count);
+}
+
+void draw_elements(PrimitiveType mode, sizei count, DataType type, const void *indices)
+{
+       glDrawElements(mode, count, type, indices);
+}
+
+void draw_range_elements(PrimitiveType mode, uint low, uint high, sizei count, DataType type, const void *indices)
+{
+       static RequireVersion _ver(1, 2);
+       glDrawRangeElements(mode, low, high, count, type, indices);
+}
+
 } // namespace GL
 } // namespace Msp
index 8e72d9554c7e39078b2ddebed2e94d5f8434fd59..02fa64f70b0f0cfdfe5c9fa0c893433fa59818f1 100644 (file)
@@ -62,6 +62,23 @@ private:
        static unsigned enabled_arrays;
 };
 
+void array_element(int);
+void draw_arrays(PrimitiveType, int, sizei);
+void draw_elements(PrimitiveType, sizei, DataType, const void *);
+void draw_range_elements(PrimitiveType, uint, uint, sizei, DataType, const void *);
+
+inline void draw_elements(PrimitiveType mode, sizei count, const unsigned *indices)
+{ draw_elements(mode, count, UNSIGNED_INT, indices); }
+
+inline void draw_elements(PrimitiveType mode, sizei count, const unsigned short *indices)
+{ draw_elements(mode, count, UNSIGNED_SHORT, indices); }
+
+inline void draw_range_elements(PrimitiveType mode, uint low, uint high, sizei count, const unsigned short *indices)
+{ draw_range_elements(mode, low, high, count, UNSIGNED_SHORT, indices); }
+
+inline void draw_range_elements(PrimitiveType mode, uint low, uint high, sizei count, const unsigned *indices)
+{ draw_range_elements(mode, low, high, count, UNSIGNED_INT, indices); }
+
 } // namespace GL
 } // namespace Msp
 
index e3680811dd9a8ccb59e1fb0e0b1f5b84b53ac6e3..395334b32833672d7eda162f8ed1c76ddcbc4e57 100644 (file)
@@ -14,7 +14,7 @@ namespace GL {
 
 VertexBuffer::VertexBuffer()
 {
-       require_extension("GL_ARB_vertex_buffer_object");
+       static RequireExtension _ext("GL_ARB_vertex_buffer_object");
 
        glGenBuffersARB(1, &id);
 }