# class glw::ArrayObject

## Overview

Class to store data arrays. Arrays can be later accessed by shaders when draw is requested. More…

    #include <ArrayObject.h>

    class ArrayObject {
    public:
        // typedefs

        typedef size_t BufferName;
        typedef size_t ElementBufferName;

        // structs

        struct ElementBuffer;

        // fields

        static const BufferName INVALID_NAME { UINT32_MAX };

        // construction

        ArrayObject(size_t vertex_count);
        ~ArrayObject();

        // methods

        static PArrayObject Create(const size_t vertex_count);
        uint64_t GetVertexCount() const;
        void Bind() const;
        void Unbind() const;
        bool IsBound() const;
        BufferName AddBuffer(const void* data, size_t per_vert_size, DataUsage usage = DataUsage::dynamic_draw);
        void SetBuffer(BufferName vert_buffer, const void* data, size_t per_vert_size);
        bool IsBufferValid(BufferName vert_buffer) const;
        void SetBinding(const Attrib& att, uint32_t shader_location, BufferName buffer);
        BufferName GetBinding(uint32_t shader_location) const;
        bool ExistsBinding(uint32_t shader_location) const;
        BufferName AddBufferBinding1f(uint32_t shader_location, const void* data);
        BufferName AddBufferBinding2f(uint32_t shader_location, const void* data);
        BufferName AddBufferBinding3f(uint32_t shader_location, const void* data);
        BufferName AddBufferBinding4f(uint32_t shader_location, const void* data);
        BufferName AddBufferBinding1i(uint32_t shader_location, const void* data);
        BufferName AddBufferBinding2i(uint32_t shader_location, const void* data);
        BufferName AddBufferBinding3i(uint32_t shader_location, const void* data);
        BufferName AddBufferBinding4i(uint32_t shader_location, const void* data);
        ElementBufferName AddElementBuffer(const uint32_t* data, size_t count);
        void SetDrawMode(DrawMode mode);
        void Draw() const;
        void DrawInstanced(uint32_t instance_count) const;
        void DrawVertices(DrawMode mode) const;
        void DrawVertices(size_t num_vertices, DrawMode mode) const;
        void DrawVerticesInstanced(uint32_t instance_count, DrawMode mode) const;
        void DrawElements(ElementBufferName el_buff, DrawMode mode) const;
        void DrawElementsInstanced(uint32_t instance_count, ElementBufferName el_buff, DrawMode mode) const;

    protected:
        // fields

        uint32_t vao_ = 0;
        size_t vertex_count_ = 0;
        DrawMode default_mode_ = DrawMode::points;
        std::vector<uint32_t> buffer_names_;
        std::unordered_map<uint32_t, BufferName> bindings_;
        std::vector<ElementBuffer> elements_;
    };

## Detailed Documentation

Class to store data arrays. Arrays can be later accessed by shaders when draw is requested.

### Typedefs

    typedef size_t BufferName

Identifier of vertex buffer.

    typedef size_t ElementBufferName

Identifier of element buffer.

### Fields

    static const BufferName INVALID_NAME { UINT32_MAX }

Element buffer or vertex buffer name which do not represent valid buffer.

### Construction

    ArrayObject(size_t vertex_count)

Creates new object. Defined vertex count is expected for a setters of this instance.

    ~ArrayObject()

Destructs array object and frees all allocated OpenGL buffers.

### Methods

    static PArrayObject Create(const size_t vertex_count)

Crate a shared pointer with new instance of ArrayObject class.

    uint64_t GetVertexCount() const

Returns number of vertices expected by this instance.

    void Bind() const

Binds this ArrayObject. Needs to be called before any changes and drawings are performed with this object.

    void Unbind() const

Unbinds this ArrayObject.

    bool IsBound() const

Returns, whether this ArrayObject is currently bound.

    BufferName AddBuffer(const void* data, size_t per_vert_size, DataUsage usage = DataUsage::dynamic_draw)

Creates new buffer in graphic memory, and fills it with data. Parameter per_vert_size defines data memory size (in bytes) for each vertex.

    void SetBuffer(BufferName vert_buffer, const void* data, size_t per_vert_size)

Replaces data in existing buffer.

    bool IsBufferValid(BufferName vert_buffer) const

Checks whether specified buffer name belongs to valid buffer.

    void SetBinding(const Attrib& att, uint32_t shader_location, BufferName buffer)

Creates shader binding for specified buffer. Attribute parameter defines how are data structured inside buffer.

    BufferName GetBinding(uint32_t shader_location) const

Return the name of buffer that is bound to shader location. If no such buffer exists, returns INVALID_NAME.

    bool ExistsBinding(uint32_t shader_location) const

Check if there is binding for a shader location;.

    BufferName AddBufferBinding1f(uint32_t shader_location, const void* data)

Creates new buffer and sets shader binding. This function replaces call of SetBuffer and SetBinding with Attrib1f parameter.

    BufferName AddBufferBinding2f(uint32_t shader_location, const void* data)

Creates new buffer and sets shader binding. This function replaces call of SetBuffer and SetBinding with Attrib2f parameter.

    BufferName AddBufferBinding3f(uint32_t shader_location, const void* data)

Creates new buffer and sets shader binding. This function replaces call of SetBuffer and SetBinding with Attrib3f parameter.

    BufferName AddBufferBinding4f(uint32_t shader_location, const void* data)

Creates new buffer and sets shader binding. This function replaces call of SetBuffer and SetBinding with Attrib4f parameter.

    BufferName AddBufferBinding1i(uint32_t shader_location, const void* data)

Creates new buffer and sets shader binding. This function replaces call of SetBuffer and SetBinding with Attrib1i parameter.

    BufferName AddBufferBinding2i(uint32_t shader_location, const void* data)

Creates new buffer and sets shader binding. This function replaces call of SetBuffer and SetBinding with Attrib2i parameter.

    BufferName AddBufferBinding3i(uint32_t shader_location, const void* data)

Creates new buffer and sets shader binding. This function replaces call of SetBuffer and SetBinding with Attrib3i parameter.

    BufferName AddBufferBinding4i(uint32_t shader_location, const void* data)

Creates new buffer and sets shader binding. This function replaces call of SetBuffer and SetBinding with Attrib4i parameter.

    ElementBufferName AddElementBuffer(const uint32_t* data, size_t count)

Creates new element buffer which defines how primitives are structured.

    void SetDrawMode(DrawMode mode)

Set default drawing mode used when calling pure Draw or DrawInstanced functions. Default value is DrawMode::points.

    void Draw() const

Draws vertices or first defined elements. Default draw mode set by function SetDrawMode.

    void DrawInstanced(uint32_t instance_count) const

Draws vertices or first defined elements multiple times. Default draw mode set by function SetDrawMode.

    void DrawVertices(DrawMode mode) const

Draws vertices from buffer arrays.

    void DrawVertices(size_t num_vertices, DrawMode mode) const

Draws vertices from buffer arrays, the number of vertices drawn is num_vertices or vao vertex count, whichever is smaller.

    void DrawVerticesInstanced(uint32_t instance_count, DrawMode mode) const

Draws vertices from buffer arrays multiple times.

    void DrawElements(ElementBufferName el_buff, DrawMode mode) const

Draws elements specified element buffer.

    void DrawElementsInstanced(uint32_t instance_count, ElementBufferName el_buff, DrawMode mode) const

Draws elements specified element buffer multiple times.