12#ifndef GAMP_GLSLUNIFORMDATA_HPP_
13#define GAMP_GLSLUNIFORMDATA_HPP_
32 using namespace gamp::render::gl;
33 using namespace jau::math::util;
51 virtual const
void*
data() const noexcept = 0;
60 constexpr bool isBuffer() const noexcept {
return 0!=m_bufferSize; }
61 constexpr GLuint
bufferName() const noexcept {
return m_bufferName; }
62 constexpr GLsizeiptr
bufferSize() const noexcept {
return m_bufferSize; }
69 constexpr GLuint
bufferBinding() const noexcept {
return isBuffer() ? m_bufferGlobalBinding : GL_INVALID_INDEX; }
94 constexpr GLsizei
count() const noexcept {
return m_count; }
96 constexpr GLsizei
components() const noexcept {
return m_rows*m_columns; }
98 constexpr GLsizei
rows() const noexcept {
return m_rows; }
100 constexpr GLsizei
columns() const noexcept {
return m_columns; }
102 constexpr bool isMatrix() const noexcept {
return m_rows > 1 && m_columns > 1; }
104 constexpr bool isVector() const noexcept {
return m_rows == 1 && m_columns > 1; }
106 constexpr bool isScalar() const noexcept {
return m_rows == 1 && m_columns == 1; }
111 .append(
", name ").append(m_name);
115 .append(
", name ").append(std::to_string(m_bufferName)).append(
", ")
116 .append(std::to_string(m_bufferSize)).append(
" bytes]");
118 sb.append(
", location ").append(std::to_string(
m_location));
120 sb.append(
", size ").append(std::to_string(m_rows)).append(
"x").append(std::to_string(m_columns))
121 .append(
", count ").append(std::to_string(m_count));
122 sb.append(
", data ");
126 const GLfloat* d =
reinterpret_cast<const GLfloat*
>(
data());
127 for( GLsizei i = 0; i < m_count; ++i ) {
128 if( i > 0 ) { sb.append(
"\n"); }
130 d+
static_cast<ptrdiff_t
>(i*m_rows*m_columns), m_rows, m_columns,
false);
135 const GLfloat* d =
reinterpret_cast<const GLfloat*
>(
data());
140 const GLfloat d = *
reinterpret_cast<const GLfloat*
>(
data());
141 sb.append(std::to_string(d));
143 const GLint d = *
reinterpret_cast<const GLint*
>(
data());
144 sb.append(std::to_string(d));
157 if( m_bufferName != 0 ) {
158 ::glDeleteBuffers(1, &m_bufferName);
166 bool sendSub(
const GL&
gl, GLintptr offset, GLsizeiptr size)
noexcept;
177 m_bufferSize(0), m_bufferName(0), m_bufferGlobalBinding(GL_INVALID_INDEX) {}
187 m_bufferSize(
bufferSize), m_bufferName(0), m_bufferGlobalBinding(globalBufferBinding) {}
196 GLsizei m_rows, m_columns, m_count;
197 GLsizeiptr m_bufferSize;
200 GLuint m_bufferGlobalBinding;
223 4, 4,
data.matrixCount()),
224 m_mat(mat), m_data(
data) {}
234 return std::make_shared<GLUniformSyncPMVMat4fExt>(
name, mat);
236 const void*
data() const noexcept
override {
return m_data.syncedData(); }
238 constexpr const GLfloat*
floats() const noexcept {
return m_data.floats(); }
259 4, 4, mat.matrixCount()),
260 m_mat(mat), m_data(m_mat.makeSyncPMvReq()) {}
270 return std::make_shared<GLUniformSyncPMVMat4f>(
name, derivedMatrices);
272 const void*
data() const noexcept
override {
return m_data.syncedData(); }
274 constexpr const GLfloat*
floats() const noexcept {
return m_data.floats(); }
293 4, 4,
data.matrixCount()),
301 return std::make_shared<GLUniformSyncMatrices4f>(
name, std::move(
data));
303 const void*
data() const noexcept
override {
return m_data.syncedData(); }
305 constexpr const GLfloat*
floats() const noexcept {
return m_data.floats(); }
328 return std::make_shared<GLUniformVec4f>(
name, v);
330 const void*
data() const noexcept
override {
return m_data.cbegin(); }
356 return std::make_shared<GLUniformVec3f>(
name, v);
358 const void*
data() const noexcept
override {
return m_data.cbegin(); }
384 return std::make_shared<GLUniformVec2f>(
name, v);
386 const void*
data() const noexcept
override {
return m_data.cbegin(); }
412 return std::make_shared<GLUniformScalarF32>(
name, v);
414 const void*
data() const noexcept
override {
return &m_data; }
416 constexpr float scalar() const noexcept {
return m_data; }
417 constexpr float&
scalar() noexcept {
return m_data; }
434 sizeof(T), globalBufferBinding),
442 return std::make_shared<GLUniformBuffer>(
name, instance);
444 const void*
data() const noexcept
override {
return &m_data; }
446 constexpr const T&
blob() const noexcept {
return m_data; }
447 constexpr T&
blob() noexcept {
return m_data; }
static const jau::type_info & f32()
jau::float_32_t or just float
static const jau::type_info & i32()
int32_t
SyncBuffer interface with multiple underlying Matrix4.
Generic type information using either Runtime type information (RTTI) or Compile time type informatio...
std::ostream & operator<<(std::ostream &os, const T v)
const jau::type_info & static_ctti() noexcept
Returns a static global reference of make_ctti<T>(true) w/ identity instance.
std::string & row_to_string(std::string &sb, const std::string_view f, const T a[], const jau::nsize_t rows, const jau::nsize_t columns, const bool rowMajorOrder, const jau::nsize_t row) noexcept
Appends a row of floating points to the given string sb
std::string & mat_to_string(std::string &sb, const std::string &rowPrefix, const std::string_view f, const T a[], const jau::nsize_t rows, const jau::nsize_t columns, const bool rowMajorOrder) noexcept
Appends a matrix of floating points to the given string sb
std::shared_ptr< GLUniformSyncPMVMat4f > GLUniformSyncPMVMat4fSRef
std::shared_ptr< GLUniformScalarF32 > GLUniformScalarF32SRef
std::shared_ptr< GLUniformSyncPMVMat4fExt > GLUniformSyncPMVMat4fExtSRef
std::shared_ptr< GLUniformBuffer< T > > GLUniformBufferRef
std::shared_ptr< GLUniformVec4f > GLUniformVec4fSRef
std::shared_ptr< GLUniformVec2f > GLUniformVec2fSRef
std::shared_ptr< GLUniformData > GLUniformDataSRef
std::shared_ptr< GLUniformVec3f > GLUniformVec3fSRef
std::shared_ptr< GLUniformSyncMatrices4f > GLUniformSyncMatrices4fSRef
std::string_view stringview_t
PMVData
PMVMatrix4 derived matrices and values.
PMVMatrix4< float > PMVMat4f
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.
__pack(...): Produces MSVC, clang and gcc compatible lead-in and -out macros.