feat: instance + array buffer
This commit is contained in:
@@ -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);
|
||||
};
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user