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_sref r = std::make_shared<GLArrayDataServer>(Private(),
88 name, compsPerElement,
90 true, std::move(std::make_unique<impl::GLSLArrayHandler<value_type>>()),
110 server_sref r = std::make_shared<GLArrayDataServer>(Private(),
111 name, compsPerElement,
113 true, std::move(std::make_unique<impl::GLSLArrayHandler<value_type>>()),
132 server_sref r = std::make_shared<GLArrayDataServer>(Private(),
133 name, compsPerElement,
135 true, std::move(std::make_unique<impl::GLSLArrayHandler<value_type>>()),
154 server_sref r = std::make_shared<GLArrayDataServer>(Private(),
155 "data", compsPerElement,
157 false, std::move(std::make_unique<impl::GLDataArrayHandler<value_type>>()),
178 server_sref r = std::make_shared<GLArrayDataServer>(Private(),
179 "data", compsPerElement,
181 false, std::move(std::make_unique<impl::GLDataArrayHandler<value_type>>()),
201 server_sref r = std::make_shared<GLArrayDataServer>(Private(),
202 "mdata", compsPerElement,
203 false, 0, mappedElementCount,
204 false, std::move(std::make_unique<impl::GLDataArrayHandler<value_type>>()),
224 server_sref r = std::make_shared<GLArrayDataServer>(Private(),
227 false, std::move(std::make_unique<impl::GLSLArrayHandlerInterleaved<value_type>>()),
247 server_sref r = std::make_shared<GLArrayDataServer>(Private(),
250 true, std::move(std::make_unique<impl::GLSLArrayHandlerInterleaved<value_type>>()),
270 server_sref r = std::make_shared<GLArrayDataServer>(Private(),
273 false, std::move(std::make_unique<impl::GLSLArrayHandlerInterleaved<value_type>>()),
279 std::string_view
className() const noexcept
override {
return "GLArrayDataServer"; }
344 ::glDeleteBuffers(1, &
vboName);
371 proxy_t::checkSeal(
true);
372 proxy_t::bindBuffer(
gl,
true);
373 ::glBufferData(getVBOTarget(), getByteCount(), null, getVBOUsage());
374 GLMappedBuffer storage =
gl.mapBuffer(getVBOTarget(), access);
375 setMappedBuffer(storage);
376 proxy_t::bindBuffer(
gl,
false);
377 proxy_t::seal(
false);
381 GLMappedBuffer mapStorage(
const GL&
gl,
final long offset,
final long length,
final int access) {
382 if( proxyproxy_t::usesClientBuffer() ) {
383 throw IllegalStateException(
"user buffer not null");
390 ::glBufferData(getVBOTarget(), getByteCount(), null, getVBOUsage());
391 GLMappedBuffer storage = gl.mapBufferRange(getVBOTarget(), offset, length, access);
392 setMappedBuffer(storage);
400 void setMappedBuffer(
const GLMappedBuffer& storage) {
403 m_buffer = storage.getMappedBuffer();
406 void unmapStorage(
const GL& gl) {
408 throw IllegalStateException(
"not mapped");
414 gl.glUnmapBuffer(getVBOTarget());
422 std::string
toString(
bool withData)
const noexcept override {
425 .append(
", location ")
427 .append(
", isVertexAttribute ")
429 .append(
", usesShaderState ")
431 .append(
", dataType ")
433 .append(
", compsPerElem ")
440 .append(
", mappedElements ")
444 .append(
", mappedStorage ")
446 .append(
", vboEnabled ")
448 .append(
", vboName ")
450 .append(
", vboUsage ")
452 .append(
", vboTarget ")
454 .append(
", vboOffset ")
456 .append(
", enabled ")
458 .append(
", written ")
485 name, componentsPerElement,
498 name, componentsPerElement,
511 name, componentsPerElement,
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, std::string_view 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/o 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.
std::string elemStatsToString() const noexcept override
jau::darray< value_type, glmemsize_t > buffer_t
static proxy_sref createGLSL(std::string_view name, GLsizei componentsPerElement, bool normalized, GLsizei stride, buffer_t &buffer, GLuint vboName, uintptr_t vboOffset, GLenum vboUsage, GLenum vboTarget)
void glBufferData(const GL &gl) const noexcept
constexpr bool usesClientMem() const noexcept
std::unique_ptr< buffer_t > buffer_sref
Server data buffer for VBO GLArrayData usage of given template-type Value_type.
uintptr_t m_interleavedOffset
static server_sref 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...
GLArrayDataServer(Private, std::string_view 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.
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...
void setInterleavedOffset(uintptr_t interleavedOffset) noexcept
static server_sref createGLSL(std::string_view 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 ...
std::shared_ptr< proxy_t > proxy_sref
GLArrayDataServer(Private, std::string_view 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
GLMappedBufferPtr m_mappedStorage
std::string toString() const noexcept override
proxy_sref addGLSLSubArray(std::string_view name, GLsizei compsPerElement, GLenum vboTarget)
Configure a segment of this GLSL interleaved array (see createGLSLInterleaved(int,...
const GLArrayDataServerSRef< value_type > shared()
static server_sref 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.
GLArrayDataClient< value_type > client_t
static server_sref createGLSLInterleavedMapped(GLsizei compsPerElement, bool normalized, GLsizei mappedElementCount, GLenum vboUsage)
Create a VBO for GLSL interleaved array data intended for GPU buffer storage mapping,...
void init_vbo(const GL &gl) override
static server_sref 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...
void destroy(GL &gl) override
static server_sref createGLSLMapped(std::string_view 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,...
GLArrayDataServer< value_type > server_t
std::string toString(bool withData) const noexcept override
jau::darray< value_type, glmemsize_t > buffer_t
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
std::shared_ptr< server_t > server_sref
static server_sref createGLSL(std::string_view 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...
static server_sref createDataMapped(GLsizei compsPerElement, GLsizei mappedElementCount, GLenum vboUsage, GLenum vboTarget)
Create a VBO data object for any target w/o render pipeline association, i.e.
GLArrayDataServer(Private, std::string_view 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.
static server_sref 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...
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.
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
GLArrayDataServerSRef< float > GLFloatArrayDataServerSRef
std::shared_ptr< GLArrayData > GLArrayDataSRef
GLArrayDataServer< uint32_t > GLUIntArrayDataServer
GLArrayDataServerSRef< uint32_t > GLUIntArrayDataServerSRef
std::shared_ptr< GLArrayDataServer< Value_type > > GLArrayDataServerSRef
std::unique_ptr< GLMappedBuffer > GLMappedBufferPtr
static constexpr std::string_view gca_InterleaveArray
std::string toHexString(const void *data, const nsize_t length, const lb_endian_t byteOrder=lb_endian_t::big, const LoUpCase capitalization=LoUpCase::lower, const PrefixOpt prefix=PrefixOpt::prefix) noexcept
Produce a hexadecimal string representation of the given lsb-first byte values.