Chrysalis - Renderer
Toggle main menu visibility
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
8
namespace
Chrysalis
{
9
template
<
typename
D>
10
requires
requires
{
11
[]<
typename
V>(
BaseRendererData<V>
*) ->
auto
{}(
static_cast<
D*
>
(
nullptr
));
12
}
13
class
BaseRenderer
{
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
:
59
D*
data_
;
60
private
:
61
GLuint vbo_ = 0;
62
GLuint vao_ = 0;
63
};
64
}
65
66
#endif
//CHRYSALIS_BASERENDERER_H
BaseRendererData.h
Chrysalis::BaseRendererData
Definition
BaseRendererData.h:9
Chrysalis::BaseRenderer::render
void render()
Definition
BaseRenderer.h:50
Chrysalis::BaseRenderer::~BaseRenderer
virtual ~BaseRenderer()
Definition
BaseRenderer.h:17
Chrysalis::BaseRenderer::BaseRenderer
BaseRenderer(D *data)
Definition
BaseRenderer.h:16
Chrysalis::BaseRenderer::initialize
virtual void initialize()
Definition
BaseRenderer.h:33
Chrysalis::BaseRenderer::upload
void upload()
Definition
BaseRenderer.h:24
Chrysalis::BaseRenderer::data_
D * data_
Definition
BaseRenderer.h:59
Chrysalis::BaseRenderer::draw
virtual void draw()=0
Chrysalis
Definition
Area.h:4
renderer
include
BaseRenderer.h
Generated by
1.17.0