Render: Add more value setter types for uniformbuffer objects
This commit is contained in:
@@ -217,7 +217,7 @@ int Application::run()
|
|||||||
RenderCommand::clearBit(m_screenFramebuffer->clearBit());
|
RenderCommand::clearBit(m_screenFramebuffer->clearBit());
|
||||||
|
|
||||||
Renderer2D::the().setEnableDepthBuffer(false);
|
Renderer2D::the().setEnableDepthBuffer(false);
|
||||||
Uniformbuffer::the().setFloat("Camera", "u_projectionView", matIdentity);
|
Uniformbuffer::the().setValue("Camera", "u_projectionView", matIdentity);
|
||||||
Renderer2D::the().drawQuad(transformIdentity, vectorOne, m_framebuffer->texture(0));
|
Renderer2D::the().drawQuad(transformIdentity, vectorOne, m_framebuffer->texture(0));
|
||||||
Renderer2D::the().endScene();
|
Renderer2D::the().endScene();
|
||||||
Renderer2D::the().setEnableDepthBuffer(true);
|
Renderer2D::the().setEnableDepthBuffer(true);
|
||||||
|
|||||||
@@ -5,10 +5,12 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <cstddef> // size_t
|
#include <cstddef> // size_t
|
||||||
#include <cstdint> // int32_t, uint8_t
|
#include <cstdint> // int32_t, uint32_t, uint8_t
|
||||||
#include <string_view>
|
#include <string_view>
|
||||||
|
|
||||||
#include "glad/glad.h"
|
#include "glad/glad.h"
|
||||||
|
#include "glm/ext/matrix_float2x2.hpp" // glm::mat2
|
||||||
|
#include "glm/ext/matrix_float3x3.hpp" // glm::mat3
|
||||||
#include "glm/gtc/type_ptr.hpp" // glm::value_ptr
|
#include "glm/gtc/type_ptr.hpp" // glm::value_ptr
|
||||||
#include "ruc/meta/assert.h"
|
#include "ruc/meta/assert.h"
|
||||||
|
|
||||||
@@ -44,6 +46,7 @@ void Uniformbuffer::setLayout(std::string_view blockName, uint8_t bindingPoint,
|
|||||||
}
|
}
|
||||||
|
|
||||||
UniformbufferBlock& block = m_blocks[blockName];
|
UniformbufferBlock& block = m_blocks[blockName];
|
||||||
|
block.bindingPoint = bindingPoint;
|
||||||
|
|
||||||
// Example block layout:
|
// Example block layout:
|
||||||
// - mat3
|
// - mat3
|
||||||
@@ -207,18 +210,36 @@ void Uniformbuffer::create(std::string_view blockName)
|
|||||||
glBindBufferBase(GL_UNIFORM_BUFFER, block.bindingPoint, block.id);
|
glBindBufferBase(GL_UNIFORM_BUFFER, block.bindingPoint, block.id);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Uniformbuffer::setFloat(std::string_view blockName, std::string_view member, glm::mat4 matrix)
|
void Uniformbuffer::setValue(std::string_view blockName, std::string_view member, bool value)
|
||||||
{
|
{
|
||||||
VERIFY(exists(blockName), "uniformbuffer block doesnt exist");
|
CHECK_SET_CALL(blockName, member);
|
||||||
|
|
||||||
const UniformbufferBlock& block = m_blocks[blockName];
|
glBindBuffer(GL_UNIFORM_BUFFER, block.id);
|
||||||
|
uint32_t tmp = static_cast<uint32_t>(value);
|
||||||
|
glBufferSubData(GL_UNIFORM_BUFFER, block.uniformLocations.at(member.data()), sizeof(uint32_t), &tmp);
|
||||||
|
glBindBuffer(GL_UNIFORM_BUFFER, 0);
|
||||||
|
}
|
||||||
|
|
||||||
VERIFY(block.uniformLocations.find(member.data()) != block.uniformLocations.end(),
|
void Uniformbuffer::setValue(std::string_view blockName, std::string_view member, glm::mat2 value)
|
||||||
"uniformbuffer block member doesnt exist");
|
{
|
||||||
|
CHECK_SET_CALL(blockName, member);
|
||||||
|
|
||||||
// Note: Uniformbuffers are bound to a binding point for the entire pipeline,
|
// Write only the first 2 rows (32 bytes), additional values are padded with 0
|
||||||
// it remains accessible without needing to rebind it every time
|
glBindBuffer(GL_UNIFORM_BUFFER, block.id);
|
||||||
glBufferSubData(GL_UNIFORM_BUFFER, block.uniformLocations.at(member.data()), sizeof(glm::mat4), glm::value_ptr(matrix));
|
glm::mat4 tmp = static_cast<glm::mat4>(value);
|
||||||
|
glBufferSubData(GL_UNIFORM_BUFFER, block.uniformLocations.at(member.data()), sizeof(glm::vec4) * 2, glm::value_ptr(tmp));
|
||||||
|
glBindBuffer(GL_UNIFORM_BUFFER, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Uniformbuffer::setValue(std::string_view blockName, std::string_view member, glm::mat3 value)
|
||||||
|
{
|
||||||
|
CHECK_SET_CALL(blockName, member);
|
||||||
|
|
||||||
|
// Write only the first 3 rows (48 bytes), additional values are padded with 0
|
||||||
|
glBindBuffer(GL_UNIFORM_BUFFER, block.id);
|
||||||
|
glm::mat4 tmp = static_cast<glm::mat4>(value);
|
||||||
|
glBufferSubData(GL_UNIFORM_BUFFER, block.uniformLocations.at(member.data()), sizeof(glm::vec4) * 3, glm::value_ptr(tmp));
|
||||||
|
glBindBuffer(GL_UNIFORM_BUFFER, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace Inferno
|
} // namespace Inferno
|
||||||
|
|||||||
@@ -9,11 +9,19 @@
|
|||||||
#include <string_view>
|
#include <string_view>
|
||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
|
|
||||||
#include "glm/ext/matrix_float4x4.hpp" // glm::mat4
|
#include "glad/glad.h"
|
||||||
|
#include "glm/ext/matrix_float2x2.hpp" // glm::mat2
|
||||||
|
#include "glm/ext/matrix_float3x3.hpp" // glm::mat3
|
||||||
#include "ruc/singleton.h"
|
#include "ruc/singleton.h"
|
||||||
|
|
||||||
#include "inferno/render/buffer.h"
|
#include "inferno/render/buffer.h"
|
||||||
|
|
||||||
|
#define CHECK_SET_CALL(blockName, member) \
|
||||||
|
VERIFY(exists(blockName), "uniformbuffer block doesnt exist"); \
|
||||||
|
const UniformbufferBlock& block = m_blocks[blockName]; \
|
||||||
|
VERIFY(block.uniformLocations.find(member.data()) != block.uniformLocations.end(), \
|
||||||
|
"uniformbuffer block member doesnt exist");
|
||||||
|
|
||||||
namespace Inferno {
|
namespace Inferno {
|
||||||
|
|
||||||
struct UniformbufferBlock {
|
struct UniformbufferBlock {
|
||||||
@@ -31,7 +39,19 @@ public:
|
|||||||
void setLayout(std::string_view blockName, uint8_t bindingPoint, const BufferLayout& layout);
|
void setLayout(std::string_view blockName, uint8_t bindingPoint, const BufferLayout& layout);
|
||||||
void create(std::string_view blockName);
|
void create(std::string_view blockName);
|
||||||
|
|
||||||
void setFloat(std::string_view blockName, std::string_view member, glm::mat4 matrix);
|
template<typename T>
|
||||||
|
void setValue(std::string_view blockName, std::string_view member, T value)
|
||||||
|
{
|
||||||
|
CHECK_SET_CALL(blockName, member);
|
||||||
|
|
||||||
|
glBindBuffer(GL_UNIFORM_BUFFER, block.id);
|
||||||
|
glBufferSubData(GL_UNIFORM_BUFFER, block.uniformLocations.at(member.data()), sizeof(T), &value);
|
||||||
|
glBindBuffer(GL_UNIFORM_BUFFER, 0);
|
||||||
|
}
|
||||||
|
// Exceptions:
|
||||||
|
void setValue(std::string_view blockName, std::string_view member, bool value);
|
||||||
|
void setValue(std::string_view blockName, std::string_view member, glm::mat2 value);
|
||||||
|
void setValue(std::string_view blockName, std::string_view member, glm::mat3 value);
|
||||||
|
|
||||||
bool exists(std::string_view blockName) const { return m_blocks.find(blockName) != m_blocks.end(); }
|
bool exists(std::string_view blockName) const { return m_blocks.find(blockName) != m_blocks.end(); }
|
||||||
|
|
||||||
|
|||||||
@@ -85,7 +85,7 @@ void Scene::update(float deltaTime)
|
|||||||
void Scene::render()
|
void Scene::render()
|
||||||
{
|
{
|
||||||
auto [projection, view] = CameraSystem::the().projectionView();
|
auto [projection, view] = CameraSystem::the().projectionView();
|
||||||
Uniformbuffer::the().setFloat("Camera", "u_projectionView", projection * view);
|
Uniformbuffer::the().setValue("Camera", "u_projectionView", projection * view);
|
||||||
RendererCubemap::the().beginScene(projection, view); // camera, lights, environment
|
RendererCubemap::the().beginScene(projection, view); // camera, lights, environment
|
||||||
|
|
||||||
RenderSystem::the().render();
|
RenderSystem::the().render();
|
||||||
|
|||||||
Reference in New Issue
Block a user