VertexBuffer.hh 5.41 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.                                                       //
////////////////////////////////////////////////////////////////////////////////

Robert Menzel's avatar
Robert Menzel committed
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
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
#ifndef ACGL_RESOURCE_VERTEXBUFFER_HH
#define ACGL_RESOURCE_VERTEXBUFFER_HH

#include <ACGL/Resource/ResourceTypes.hh>
#include <ACGL/Resource/ArrayBuffer.hh>
#include <ACGL/Resource/ElementArrayBuffer.hh>
#include <ACGL/GL.hh>

#include <vector>

namespace ACGL{
namespace Resource{

class VertexBuffer
{
    // ==================================================================================================== \/
    // ============================================================================================ 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:
    VertexBuffer(
        GLenum _mode,
        GLsizei _elements)
    :   mMode(_mode),
        mElements(_elements),
        mpElementArrayBuffer(),
        mArrayBuffers(),
        mAttributes()
    {}

    virtual ~VertexBuffer(void) {};
    
    // ==================================================================================================== \/
    // ============================================================================================ GETTERS \/
    // ==================================================================================================== \/
public:
    inline       GLenum                    getMode               (void) const { return mMode;                }
    inline       GLsizei                   getElements           (void) const { return mElements;            }
    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;

    inline void setElements(GLsizei _elements)
    {
        mElements = _elements;
    }

    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;

    void draw(void) const
    {
        if(mpElementArrayBuffer)
            mpElementArrayBuffer->draw();
        else
            glDrawArrays(mMode, 0, mElements);
120
121

        openGLRareError();
Robert Menzel's avatar
Robert Menzel committed
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
    }

    // =================================================================================================== \/
    // ============================================================================================ FIELDS \/
    // =================================================================================================== \/
protected:
    GLenum                   mMode;
    GLsizei                  mElements;
    SharedElementArrayBuffer mpElementArrayBuffer;
    ArrayBufferVec           mArrayBuffers;
    AttributeVec             mAttributes;
};

} // Resource
} // ACGL

#endif // ACGL_RESOURCE_VERTEXBUFFER_HH