feat: instance + array buffer

This commit is contained in:
2025-10-24 13:06:40 +02:00
parent b5ea21ad43
commit e459fea503
7 changed files with 67 additions and 35 deletions

View File

@@ -2,12 +2,15 @@
#define COMPONENT_BATCH_H_
#include <glm/mat4x4.hpp>
#include <memory>
#include "engine/opengl/buffers.h"
#include "engine/export.h"
namespace Core {
// requires mesh component
struct ENGINE_API batch {
friend class Renderer;
public:
// requires Transform component
struct item {
@@ -17,13 +20,18 @@ public:
batch();
inline const unsigned int id() const { return m_id; }
inline const bool Initialized() const { return m_instanceBuffer != nullptr; }
protected:
static unsigned int LastID;
private:
unsigned int m_id;
unsigned int m_instance_vbo { 0 };
unsigned int m_instance_count { 0 };
// TODO: use static draw when possible
std::unique_ptr<OpenGL::InstanceBuffer> m_instanceBuffer = nullptr;
private:
friend class Renderer;
void prepare(glm::mat4 *instances, unsigned int count);
};
}

View File

@@ -17,15 +17,16 @@ namespace OpenGL {
public:
Buffer(BufferTarget target, BufferUsage usage);
inline const BufferID GetID() const { return m_buffer; }
protected:
void Data(void* data, size_t size);
void SubData(void *data, size_t size, size_t offset);
void BindBuffer(unsigned int index);
void BindBufferRanged(unsigned int index, size_t offset, size_t size);
void BindBuffer(unsigned int index) const;
void BindBufferRanged(unsigned int index, size_t offset, size_t size) const;
protected:
void Bind();
void Unbind();
void Bind() const;
void Unbind() const;
private:
BufferID m_buffer;
BufferTarget m_target;
@@ -36,7 +37,7 @@ namespace OpenGL {
public:
UniformBuffer(size_t size, unsigned int index);
void ConfigureShader(Shader& shader, const char* uniformName);
void ConfigureShader(Shader& shader, const char* uniformName) const;
template<typename T, typename S = size_t>
void UpdateUniform(void* data, S offset) {
@@ -47,6 +48,27 @@ namespace OpenGL {
private:
static unsigned int s_bufferNextId;
};
class ENGINE_API ArrayBuffer : public Buffer {
public:
ArrayBuffer(BufferUsage usage);
};
class ENGINE_API InstanceBuffer : public ArrayBuffer {
public:
InstanceBuffer(BufferUsage usage);
void Data(void *data, size_t size) {
Buffer::Data(data, size);
}
void SubData(void *data, size_t size, size_t offset) {
Buffer::SubData(data, size, offset);
}
inline void StartConfigure() const { Bind(); }
inline void EndConfigure() const { Unbind(); }
};
} // namespace OpenGL
} // namespace Core

View File

@@ -11,6 +11,7 @@
#include "engine/renderer/renderer.h"
#include "engine/renderer/material.h"
#include "engine/renderer/mesh.h"
#include "engine/opengl/buffers.h"
#include "engine/export.h"
@@ -43,7 +44,7 @@ public:
void Render(Shader& shader, unsigned int count);
[[nodiscard]] inline const std::string Name() const { return m_name; }
protected:
void EnableBatch(unsigned int instanceVBO);
void EnableBatch(const OpenGL::InstanceBuffer* instanceBuffer);
private:
std::string m_name;
std::vector<glm::vec3> m_vertices;