#pragma once #include "drape/index_buffer_mutator.hpp" #include "drape/attribute_buffer_mutator.hpp" #include "drape/pointers.hpp" #include "drape/index_buffer.hpp" #include "drape/data_buffer.hpp" #include "drape/binding_info.hpp" #include "drape/gpu_program.hpp" #include "std/map.hpp" namespace dp { class VertexArrayBuffer { typedef map > TBuffersMap; public: VertexArrayBuffer(uint32_t indexBufferSize, uint32_t dataBufferSize); ~VertexArrayBuffer(); /// This method must be call on reading thread, before VAO will be transfer on render thread void Preflush(); ///{@ /// On devices where implemented OES_vertex_array_object extensions we use it for build VertexArrayBuffer /// OES_vertex_array_object create OpenGL resource that belong only one GL context (which was created by) /// by this reason Build/Bind and Render must be called only on Frontendrendere thread void Render(); void Build(RefPointer program); ///@} uint16_t GetAvailableVertexCount() const; uint16_t GetAvailableIndexCount() const; uint16_t GetStartIndexValue() const; uint16_t GetDynamicBufferOffset(BindingInfo const & bindingInfo); bool IsFilled() const; void UploadData(BindingInfo const & bindingInfo, void const * data, uint16_t count); void UploadIndexes(uint16_t const * data, uint16_t count); void ApplyMutation(RefPointer indexMutator, RefPointer attrMutator); private: RefPointer GetOrCreateStaticBuffer(BindingInfo const & bindingInfo); RefPointer GetOrCreateDynamicBuffer(BindingInfo const & bindingInfo); RefPointer GetDynamicBuffer(BindingInfo const & bindingInfo) const; RefPointer GetOrCreateBuffer(BindingInfo const & bindingInfo, bool isDynamic); RefPointer GetBuffer(BindingInfo const & bindingInfo, bool isDynamic) const; void Bind() const; void BindStaticBuffers() const; void BindDynamicBuffers() const; void BindBuffers(TBuffersMap const & buffers) const; private: int m_VAO; TBuffersMap m_staticBuffers; TBuffersMap m_dynamicBuffers; MasterPointer m_indexBuffer; uint32_t m_dataBufferSize; RefPointer m_program; }; } // namespace dp