VertexBuffer.hh 5.82 KB
Newer Older
Robert Menzel's avatar
Robert Menzel committed
1 2 3 4 5
////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2011, Computer Graphics Group RWTH Aachen University         //
// All rights reserved.                                                       //
////////////////////////////////////////////////////////////////////////////////

6 7
#ifndef ACGL_OPENGL_OBJECTS_VERTEXBUFFER_HH
#define ACGL_OPENGL_OBJECTS_VERTEXBUFFER_HH
Robert Menzel's avatar
Robert Menzel committed
8

Robert Menzel's avatar
Robert Menzel committed
9 10
#include <ACGL/ACGL.hh>

11
#include <ACGL/Base/Macros.hh>
Robert Menzel's avatar
Robert Menzel committed
12 13 14
#include <ACGL/OpenGL/GL.hh>
#include <ACGL/OpenGL/Objects/ArrayBuffer.hh>
#include <ACGL/OpenGL/Objects/ElementArrayBuffer.hh>
Robert Menzel's avatar
Robert Menzel committed
15 16

#include <vector>
Robert Menzel's avatar
Robert Menzel committed
17
#include <tr1/memory>
Robert Menzel's avatar
Robert Menzel committed
18 19

namespace ACGL{
Robert Menzel's avatar
Robert Menzel committed
20
namespace OpenGL{
Robert Menzel's avatar
Robert Menzel committed
21 22 23

class VertexBuffer
{
24 25
    ACGL_NOT_COPYABLE(VertexBuffer)

Robert Menzel's avatar
Robert Menzel committed
26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
    // ==================================================================================================== \/
    // ============================================================================================ STRUCTS \/
    // ==================================================================================================== \/
public:
    struct Attribute
    {
        std::string name;
        int_t bufferID;
        int_t attributeID;
    };

    // ===================================================================================================== \/
    // ============================================================================================ TYPEDEFS \/
    // ===================================================================================================== \/
public:
    typedef std::vector< SharedArrayBuffer > ArrayBufferVec;
    typedef std::vector< Attribute > AttributeVec;

    // ========================================================================================================= \/
    // ============================================================================================ CONSTRUCTORS \/
    // ========================================================================================================= \/
public:
48 49
    VertexBuffer(void)
    :   mpElementArrayBuffer(),
Robert Menzel's avatar
Robert Menzel committed
50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
        mArrayBuffers(),
        mAttributes()
    {}

    virtual ~VertexBuffer(void) {};
    
    // ==================================================================================================== \/
    // ============================================================================================ GETTERS \/
    // ==================================================================================================== \/
public:
    inline const SharedElementArrayBuffer& getElementArrayBuffer (void) const { return mpElementArrayBuffer; }
    inline const ArrayBufferVec&           getArrayBuffers       (void) const { return mArrayBuffers;        }
    inline const AttributeVec&             getAttributes         (void) const { return mAttributes;          }

    // ==================================================================================================== \/
    // ============================================================================================ METHODS \/
    // ==================================================================================================== \/
public:
    int_t getAttributeIndexByName(const std::string& _name) const;

70 71 72 73 74
    inline int_t getArrayBufferIDByAttributeIndex(AttributeVec::size_type _indexInArray) const
    {
        return mAttributes[_indexInArray].bufferID;
    }

75 76 77 78 79 80 81
    inline void setAttributePointer(AttributeVec::size_type _indexInArray, GLuint _indexInShader) const
    {
        mArrayBuffers[mAttributes[_indexInArray].bufferID]->setAttributePointer(
                mAttributes[_indexInArray].attributeID,
                _indexInShader);
    }

82
    void validate( void ) const;
Robert Menzel's avatar
Robert Menzel committed
83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121

    inline void setElementArrayBuffer(const SharedElementArrayBuffer& _elementArrayBuffer)
    {
        mpElementArrayBuffer = _elementArrayBuffer;
    }

    inline void attachArrayBuffer(const SharedArrayBuffer& _arrayBuffer)
    {
        mArrayBuffers.push_back(_arrayBuffer);
    }

    inline void removeArrayBuffers(void)
    {
        mArrayBuffers.clear();
    }

    inline void attachAttribute(
        const std::string& _name,
        int_t _bufferID,
        const std::string& _attributeName)
    {
        Attribute attribute = {
            _name,
            _bufferID,
            mArrayBuffers[_bufferID]->getAttributeIndexByName(_attributeName)};
        mAttributes.push_back(attribute);
    }

    inline void removeAttributes(void)
    {
        mAttributes.clear();
    }

    // ===================================================================================================== \/
    // ============================================================================================ WRAPPERS \/
    // ===================================================================================================== \/
public:
    void render(void) const;

122 123 124 125 126 127 128
    void drawElements(void) const
    {
        mpElementArrayBuffer->draw();
    }

    void drawArrays(void) const
    {
129 130 131
        //If no ElementArrayBuffer is specified we use the convention that
        //the first ArrayBuffers determines the mode and the number of elements.
        mArrayBuffers[0]->draw();
132 133
    }

Robert Menzel's avatar
Robert Menzel committed
134 135 136
    void draw(void) const
    {
        if(mpElementArrayBuffer)
137
            drawElements();
Robert Menzel's avatar
Robert Menzel committed
138
        else
139
            drawArrays();
140
        openGLRareError();
Robert Menzel's avatar
Robert Menzel committed
141 142 143 144 145 146 147 148 149 150 151
    }

    // =================================================================================================== \/
    // ============================================================================================ FIELDS \/
    // =================================================================================================== \/
protected:
    SharedElementArrayBuffer mpElementArrayBuffer;
    ArrayBufferVec           mArrayBuffers;
    AttributeVec             mAttributes;
};

152
ACGL_SHARED_TYPEDEF(VertexBuffer)
Robert Menzel's avatar
Robert Menzel committed
153 154

} // OpenGL
Robert Menzel's avatar
Robert Menzel committed
155 156
} // ACGL

157
#endif // ACGL_OPENGL_OBJECTS_VERTEXBUFFER_HH