12#ifndef GAMP_GLARRAYDATASERVER_HPP_
13#define GAMP_GLARRAYDATASERVER_HPP_
34 using namespace gamp::render::gl;
40 template <
typename Value_type>
43 template <
typename Value_type>
56 template <
typename Value_type>
87 server_ref r = std::make_shared<GLArrayDataServer>(Private(),
88 name, compsPerElement,
110 server_ref r = std::make_shared<GLArrayDataServer>(Private(),
111 name, compsPerElement,
132 server_ref r = std::make_shared<GLArrayDataServer>(Private(),
133 name, compsPerElement,
154 server_ref r = std::make_shared<GLArrayDataServer>(Private(),
178 server_ref r = std::make_shared<GLArrayDataServer>(Private(),
201 server_ref r = std::make_shared<GLArrayDataServer>(Private(),
203 false, 0, mappedElementCount,
224 server_ref r = std::make_shared<GLArrayDataServer>(Private(),
247 server_ref r = std::make_shared<GLArrayDataServer>(Private(),
270 server_ref r = std::make_shared<GLArrayDataServer>(Private(),
279 std::string_view
className() const noexcept
override {
return "GLArrayDataServer"; }
343 ::glDeleteBuffers(1, &
vboName);
370 proxy_t::checkSeal(
true);
371 proxy_t::bindBuffer(
gl,
true);
372 ::glBufferData(getVBOTarget(), getByteCount(), null, getVBOUsage());
373 GLMappedBuffer storage =
gl.mapBuffer(getVBOTarget(), access);
374 setMappedBuffer(storage);
375 proxy_t::bindBuffer(
gl,
false);
376 proxy_t::seal(
false);
380 GLMappedBuffer mapStorage(
const GL&
gl,
final long offset,
final long length,
final int access) {
381 if( proxyproxy_t::usesClientBuffer() ) {
382 throw IllegalStateException(
"user buffer not null");
389 ::glBufferData(getVBOTarget(), getByteCount(), null, getVBOUsage());
390 GLMappedBuffer storage = gl.mapBufferRange(getVBOTarget(), offset, length, access);
391 setMappedBuffer(storage);
399 void setMappedBuffer(
const GLMappedBuffer& storage) {
402 m_buffer = storage.getMappedBuffer();
405 void unmapStorage(
const GL& gl) {
407 throw IllegalStateException(
"not mapped");
413 gl.glUnmapBuffer(getVBOTarget());
421 std::string
toString(
bool withData)
const noexcept override {
424 .append(
", location ")
426 .append(
", isVertexAttribute ")
428 .append(
", usesShaderState ")
430 .append(
", dataType ")
432 .append(
", compsPerElem ")
439 .append(
", mappedElements ")
443 .append(
", mappedStorage ")
445 .append(
", vboEnabled ")
447 .append(
", vboName ")
449 .append(
", vboUsage ")
451 .append(
", vboTarget ")
453 .append(
", vboOffset ")
455 .append(
", enabled ")
457 .append(
", written ")
484 name, componentsPerElement,
497 name, componentsPerElement,
510 name, componentsPerElement,
522 ::glGenBuffers(1, &tmp);
constexpr float growthFactor() const noexcept
impl::GLArrayHandlerPtr< value_type > m_glArrayHandler
void rewind()
Rewinds this buffer.
bool bindBuffer(GL &gl, bool bind)
if bind is true and the data uses VBO, the latter will be bound and data written to the GPU if requir...
void destroy(GL &gl) override
void seal(GL &gl, bool seal_)
Convenience method calling seal(bool) and enableBuffer(GL&, bool).
GLArrayDataClient(Private, const std::string &name, GLsizei componentsPerElement, bool normalized, GLsizei stride, buffer_t &&data, float growthFactor, bool isVertexAttribute, impl::GLArrayHandlerPtr< value_type > &&glArrayHandler, GLuint vboName, uintptr_t vboOffset, GLenum vboUsage, GLenum vboTarget)
Private client-mem ctor w/ passing custom buffer.
ShaderState * m_shaderState
static constexpr float DEFAULT_GROWTH_FACTOR
virtual void init_vbo(const GL &gl)
void checkSeal(bool test)
Proxying a data buffer for GLArrayData usage of given template-type Value_type.
static proxy_ref createGLSL(const std::string &name, GLsizei componentsPerElement, bool normalized, GLsizei stride, buffer_t &buffer, GLuint vboName, uintptr_t vboOffset, GLenum vboUsage, GLenum vboTarget)
std::string elemStatsToString() const noexcept override
jau::darray< value_type, glmemsize_t > buffer_t
std::unique_ptr< buffer_t > buffer_ref
void glBufferData(const GL &gl) const noexcept
constexpr bool usesClientMem() const noexcept
Server data buffer for VBO GLArrayData usage of given template-type Value_type.
uintptr_t m_interleavedOffset
static server_ref createGLSLMapped(const std::string &name, GLsizei compsPerElement, bool normalized, GLsizei mappedElementCount, GLenum vboUsage)
Create a VBO, using a custom GLSL array attribute name intended for GPU buffer storage mapping,...
static server_ref createGLSLInterleaved(GLsizei compsPerElement, bool normalized, GLsizei initialElementCount, GLenum vboUsage)
Create a VBO for GLSL interleaved array data starting with a new created Buffer object with initialEl...
static server_ref createGLSLInterleaved(GLsizei compsPerElement, bool normalized, GLsizei stride, buffer_t &&buffer, GLenum vboUsage)
Create a VBO for GLSL interleaved array data starting with a given Buffer object incl it's stride.
GLArrayDataProxy< value_type > proxy_t
void setVBOEnabled(bool vboEnabled) override
Convenient way do disable the VBO behavior and switch to client side data one Only possible if buffer...
std::shared_ptr< server_t > server_ref
void setInterleavedOffset(uintptr_t interleavedOffset) noexcept
static server_ref createDataMapped(GLsizei compsPerElement, GLsizei mappedElementCount, GLenum vboUsage, GLenum vboTarget)
Create a VBO data object for any target w/o render pipeline association, i.e.
GLMappedBufferPtr m_mappedStorage
std::string toString() const noexcept override
static server_ref createData(GLsizei compsPerElement, GLsizei stride, buffer_t &&buffer, GLenum vboUsage, GLenum vboTarget)
Create a VBO data object for any target w/o render pipeline association, ie GL#GL_ELEMENT_ARRAY_BUFFE...
const GLArrayDataServerRef< value_type > shared()
static server_ref createGLSL(const std::string &name, GLsizei compsPerElement, bool normalized, GLsizei stride, buffer_t &&buffer, GLenum vboUsage)
Create a VBO, using a custom GLSL array attribute name and starting with a given Buffer object incl i...
GLArrayDataClient< value_type > client_t
static server_ref createGLSL(const std::string &name, GLsizei compsPerElement, bool normalized, GLsizei initialElementCount, GLenum vboUsage)
Create a VBO, using a custom GLSL array attribute name and starting with a new created Buffer object ...
void init_vbo(const GL &gl) override
void destroy(GL &gl) override
GLArrayDataServer< value_type > server_t
static server_ref createData(GLsizei compsPerElement, GLsizei initialElementCount, GLenum vboUsage, GLenum vboTarget)
Create a VBO data object for any target w/o render pipeline association, ie GL#GL_ELEMENT_ARRAY_BUFFE...
GLArrayDataServer(Private, const std::string &name, GLsizei componentsPerElement, bool normalized, GLsizei stride, buffer_t &&data, float growthFactor, bool isVertexAttribute, impl::GLArrayHandlerPtr< value_type > &&glArrayHandler, GLuint vboName, uintptr_t vboOffset, GLenum vboUsage, GLenum vboTarget)
Private client-mem ctor w/ passing custom buffer.
std::string toString(bool withData) const noexcept override
static server_ref createGLSLInterleavedMapped(GLsizei compsPerElement, bool normalized, GLsizei mappedElementCount, GLenum vboUsage)
Create a VBO for GLSL interleaved array data intended for GPU buffer storage mapping,...
jau::darray< value_type, glmemsize_t > buffer_t
std::shared_ptr< proxy_t > proxy_ref
const jau::type_info & classSignature() const noexcept override
Returns type signature of implementing class.
std::string_view className() const noexcept override
Returns class name of implementing class.
uintptr_t interleavedOffset() const noexcept
GLArrayDataServer(Private, const std::string &name, GLsizei componentsPerElement, bool normalized, GLsizei stride, GLsizei mappedElementCount, bool isVertexAttribute, impl::GLArrayHandlerPtr< value_type > &&glArrayHandler, GLuint vboName, uintptr_t vboOffset, GLenum vboUsage, GLenum vboTarget)
using memory mapped elements
GLArrayDataServer(Private, const std::string &name, GLsizei componentsPerElement, bool normalized, GLsizei stride, GLsizei initialElementCount, float growthFactor, bool isVertexAttribute, impl::GLArrayHandlerPtr< value_type > &&glArrayHandler, GLuint vboName, uintptr_t vboOffset, GLenum vboUsage, GLenum vboTarget)
Private client-mem ctor w/o passing custom buffer.
proxy_ref addGLSLSubArray(const std::string &name, GLsizei compsPerElement, GLenum vboTarget)
Configure a segment of this GLSL interleaved array (see createGLSLInterleaved(int,...
constexpr uintptr_t vboOffset() const noexcept
The VBO buffer offset if isVBO()
constexpr GLsizei compsPerElem() const noexcept
The number of components per element.
virtual void setVBOEnabled(bool vboEnabled)
Enable or disable use of VBO.
constexpr GLuint vboName() const noexcept
The VBO name or 0 if not a VBO.
constexpr bool isVertexAttribute() const noexcept
Returns true if this data set is intended for a GLSL vertex shader attribute, otherwise false,...
GLsizei m_strideB
stride in bytes; strideB >= compsPerElement * bytesPerComp
constexpr GLenum vboUsage() const noexcept
The VBO usage or 0 if not a VBO.
GLsizei stride() const noexcept
constexpr GLsizei bytesPerComp() const noexcept
The component's size in bytes.
constexpr bool normalized() const noexcept
True, if GL shall normalize fixed point data while converting them into float.
GLsizei m_strideL
stride in logical components
constexpr bool isVBO() const noexcept
Determines whether the data is server side (VBO) and enabled, or a client side array (false).
std::shared_ptr< ChildT > shared_from_base()
constexpr GLenum vboTarget() const noexcept
The VBO target or 0 if not a VBO.
GLsizei m_mappedElemCount
OpenGL mapped buffer storage object reflecting it's.
Used for pure VBO data arrays, i.e.
Interleaved fixed function arrays, i.e.
Used for 1:1 GLSL arrays, i.e.
Used for interleaved GLSL arrays, i.e.
Generic type information using either Runtime type information (RTTI) or Compile time type informatio...
consteval_cxx20 std::string_view name() noexcept
const jau::type_info & static_ctti() noexcept
Returns a static global reference of make_ctti<T>(true) w/ identity instance.
@ null
Denotes a func::null_target_t.
GLArrayDataServer< float > GLFloatArrayDataServer
std::shared_ptr< GLArrayData > GLArrayDataRef
std::shared_ptr< GLArrayDataServer< Value_type > > GLArrayDataServerRef
GLArrayDataServerRef< float > GLFloatArrayDataServerRef
GLArrayDataServer< uint32_t > GLUIntArrayDataServer
GLArrayDataServerRef< uint32_t > GLUIntArrayDataServerRef
std::unique_ptr< GLMappedBuffer > GLMappedBufferPtr
std::unique_ptr< GLArrayHandler< Value_type > > GLArrayHandlerPtr
static constexpr std::string_view mgl_InterleaveArray
std::string to_hexstring(value_type const &v, const bool skipLeading0x=false) noexcept
Produce a lower-case hexadecimal string representation with leading 0x in MSB of the given pointer.