Chrysalis - Renderer
Loading...
Searching...
No Matches
BaseRenderer.h
Go to the documentation of this file.
1#ifndef CHRYSALIS_BASERENDERER_H
2#define CHRYSALIS_BASERENDERER_H
3
4#include <glad/gl.h>
5
6#include "BaseRendererData.h"
7
8namespace Chrysalis {
9 template<typename D>
10 requires requires {
11 []<typename V>(BaseRendererData<V>*) -> auto {}(static_cast<D*>(nullptr));
12 }
14 using V = decltype([]<typename V>(BaseRendererData<V>*) -> V {}(static_cast<D*>(nullptr)));
15 protected:
16 explicit BaseRenderer(D* data): data_(data) {}
17 virtual ~BaseRenderer() {
18 delete data_;
19 if (vbo_ != 0) glDeleteBuffers(1, &vbo_);
20 if (vao_ != 0) glDeleteVertexArrays(1, &vao_);
21 }
22
23 public:
24 void upload() {
25 if (!data_->shouldUpload()) return;
26 glBindVertexArray(vao_);
27 glBindBuffer(GL_ARRAY_BUFFER, vbo_);
28 glBufferData(GL_ARRAY_BUFFER, data_->size() * sizeof(V), data_->vbo().data(), GL_DYNAMIC_DRAW);
29 glBindBuffer(GL_ARRAY_BUFFER, 0);
30 glBindVertexArray(0);
31 }
32
33 virtual void initialize() {
34 glGenVertexArrays(1, &vao_);
35 glBindVertexArray(vao_);
36
37 glGenBuffers(1, &vbo_);
38 glBindBuffer(GL_ARRAY_BUFFER, vbo_);
39
40 const auto layout = V::layout();
41 for (GLuint i = 0; i < layout.size(); i++) {
42 const auto& [count, offset] = layout[i];
43 glEnableVertexAttribArray(i);
44 glVertexAttribPointer(i, count, GL_FLOAT, GL_FALSE, sizeof(V), offset);
45 }
46
47 upload();
48 }
49
50 void render() {
51 glBindVertexArray(vao_);
52 draw();
53 glBindVertexArray(0);
54 }
55
56 virtual void draw() = 0;
57 protected:
60 private:
61 GLuint vbo_ = 0;
62 GLuint vao_ = 0;
63 };
64}
65
66#endif //CHRYSALIS_BASERENDERER_H
Definition BaseRendererData.h:9
void render()
Definition BaseRenderer.h:50
virtual ~BaseRenderer()
Definition BaseRenderer.h:17
BaseRenderer(D *data)
Definition BaseRenderer.h:16
virtual void initialize()
Definition BaseRenderer.h:33
void upload()
Definition BaseRenderer.h:24
D * data_
Definition BaseRenderer.h:59
virtual void draw()=0
Definition Area.h:4