RenderObject.hh 5.48 KB
Newer Older
1 2 3 4 5
////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2011, Computer Graphics Group RWTH Aachen University         //
// All rights reserved.                                                       //
////////////////////////////////////////////////////////////////////////////////

6 7
#ifndef ACGL_OPENGL_OBJECTS_RENDEROBJECT_HH
#define ACGL_OPENGL_OBJECTS_RENDEROBJECT_HH
8 9 10 11 12 13 14 15 16 17 18

#include <vector>
#include <string>
#include <tr1/memory>
#include <iostream>

#include <ACGL/ACGL.hh>

#include <ACGL/Base/Macros.hh>
#include <ACGL/OpenGL/GL.hh>

19 20
#include <ACGL/OpenGL/Objects/VertexBufferObject.hh>
#include <ACGL/OpenGL/Objects/FrameBufferObject.hh>
21
#include <ACGL/OpenGL/Objects/ShaderProgramObject.hh>
22
#include <ACGL/OpenGL/Objects/Viewport.hh>
23 24 25 26

namespace ACGL{
namespace OpenGL{

27
class RenderObject
28
{
29
    ACGL_NOT_COPYABLE(RenderObject)
30 31 32 33 34 35
    // ==================================================================================================== \/
    // ============================================================================================ STRUCTS \/
    // ==================================================================================================== \/
private:
    struct AttributeMapping
    {
36 37 38 39
        //! The attributeID stores the attribute index within the vbo.
        int_t attributeID;
        //! The attributeLocation comes from the shader
        int_t attributeLocation;
40 41 42 43 44 45 46 47 48 49 50 51
    };

    // ===================================================================================================== \/
    // ============================================================================================ TYPEDEFS \/
    // ===================================================================================================== \/
private:
    typedef std::vector< AttributeMapping > AttributeMappingVec;

    // ========================================================================================================= \/
    // ============================================================================================ CONSTRUCTORS \/
    // ========================================================================================================= \/
public:
52
    RenderObject(ConstSharedVertexBufferObject _vertexBufferObject,
53
          ConstSharedShaderProgramObject _shaderProgram,
54
          ConstSharedFrameBufferObject _frameBufferObject)
55
    :   mpVertexBufferObject(_vertexBufferObject),
56
        mpShaderProgramObject(_shaderProgram),
57
        mpFrameBufferObject(_frameBufferObject),
58
        mAttributeMappings(),
59
        mpDrawBuffers(NULL)
60 61 62 63
    {
        updateMappings();
    }

64 65
    RenderObject(ConstSharedVertexBufferObject _vertexBufferObject,
          ConstSharedShaderProgramObject _shaderProgram)
66
    :   mpVertexBufferObject(_vertexBufferObject),
67
        mpShaderProgramObject(_shaderProgram),
68
        mpFrameBufferObject(),
69
        mAttributeMappings(),
70
        mpDrawBuffers(NULL)
71
    {
72
        updateMappings();
73 74
    }

75
    virtual ~RenderObject(void)
76
    {
77 78
        if(mpDrawBuffers != NULL)
            delete[](mpDrawBuffers);
79 80 81 82 83 84
    }

    // ==================================================================================================== \/
    // ============================================================================================ GETTERS \/
    // ==================================================================================================== \/
public:
85 86
    inline ConstSharedVertexBufferObject  getVertexBufferObject  (void) const { return mpVertexBufferObject;  }
    inline ConstSharedFrameBufferObject   getFrameBufferObject   (void) const { return mpFrameBufferObject;   }
87
    inline ConstSharedShaderProgramObject getShaderProgramObject (void) const { return mpShaderProgramObject; }
88 89 90 91 92

    // ==================================================================================================== \/
    // ============================================================================================ METHODS \/
    // ==================================================================================================== \/
public:
93
    void updateMappings (void);
94 95

    void bindFrameBufferObject     (void) const;
96
    void useShaderProgramObject    (void) const;
97 98
    void enableVertexBufferObject  (void) const;
    void disableVertexBufferObject (void) const;
99

100
    inline void enable(void) const
101
    {
102 103 104 105 106 107 108 109
        bindFrameBufferObject();
        useShaderProgramObject();
        enableVertexBufferObject();
    }

    inline void disable(void) const
    {
        disableVertexBufferObject();
110 111
    }

112
    inline void draw(void) const
113 114 115 116
    {
        mpVertexBufferObject->draw();
    }

117
    inline void render(void) const
118
    {
119
        enable();
120
        draw();
121 122 123 124 125 126 127
        disable();
    }

    inline void validate (void) const
    {
        mpFrameBufferObject->validate();
        mpVertexBufferObject->validate();
128
    }
129 130 131 132 133

    // =================================================================================================== \/
    // ============================================================================================ FIELDS \/
    // =================================================================================================== \/
protected:
134
    ConstSharedVertexBufferObject  mpVertexBufferObject;
135
    ConstSharedShaderProgramObject mpShaderProgramObject;
136
    ConstSharedFrameBufferObject   mpFrameBufferObject;
137 138

    AttributeMappingVec    mAttributeMappings;
139
    GLuint* mpDrawBuffers;
140 141
};

142
ACGL_SHARED_TYPEDEF(RenderObject)
143 144 145 146

} // OpenGL
} // ACGL

147
#endif // ACGL_OPENGL_OBJECTS_RENDEROBJECT_HH