1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
|
#pragma once
#include "core/memory.h"
#include "vertex_array.h"
#include "shader.h"
#include "framebuffer.h"
#include <glm/glm.hpp>
namespace Donut
{
class RendererAPI
{
public:
enum class API
{
None = 0,
OpenGL = 1,
Vulkan = 2,
};
public:
virtual ~RendererAPI() = default;
virtual auto init() -> void = 0;
virtual auto set_viewport(uint32_t x, uint32_t y,
uint32_t width, uint32_t height) -> void = 0;
virtual auto set_clear_color(const glm::vec4& color) -> void = 0;
virtual auto clear() -> void = 0;
virtual auto enable_depth_test() -> void = 0;
virtual auto disable_depth_test() -> void = 0;
virtual auto set_face_culling(bool enabled) -> void = 0;
virtual auto enable_blending() -> void = 0;
virtual auto disable_blending() -> void = 0;
virtual auto draw_indexed(const Ref<VertexArray>& vertex_array,
uint32_t index_count = 0) -> void = 0;
virtual auto draw_arrays(uint32_t vertex_count, uint32_t first = 0) -> void = 0;
virtual auto draw_lines(const Ref<VertexArray>& vertex_array,
uint32_t index_count = 0) -> void = 0;
virtual auto bind_texture(uint32_t texture_id, uint32_t slot = 0) -> void = 0;
virtual auto bind_image_texture(uint32_t texture_id,
uint32_t slot = 0,
bool read_only = false) -> void = 0;
virtual auto read_pixels(uint32_t x, uint32_t y, uint32_t width, uint32_t height,
uint32_t format, uint32_t type, void* pixels) -> void = 0;
inline static auto get_api() -> API { return s_api; }
inline static auto set_api(API api) -> void { s_api = api; }
static auto create() -> Scope<RendererAPI>;
private:
static API s_api;
};
class RenderCommand
{
public:
inline static auto init() -> void
{
s_renderer_api->init();
}
inline static auto set_viewport(uint32_t x, uint32_t y, uint32_t width, uint32_t height) -> void
{
s_renderer_api->set_viewport(x, y, width, height);
}
inline static auto set_clear_color(const glm::vec4& color) -> void
{
s_renderer_api->set_clear_color(color);
}
inline static auto clear() -> void
{
s_renderer_api->clear();
}
inline static auto enable_depth_test() -> void
{
s_renderer_api->enable_depth_test();
}
inline static auto disable_depth_test() -> void
{
s_renderer_api->disable_depth_test();
}
inline static auto set_face_culling(bool enabled) -> void
{
s_renderer_api->set_face_culling(enabled);
}
inline static auto enable_blending() -> void
{
s_renderer_api->enable_blending();
}
inline static auto disable_blending() -> void
{
s_renderer_api->disable_blending();
}
inline static auto draw_indexed(const Ref<VertexArray>& vertex_array, uint32_t index_count = 0) -> void
{
s_renderer_api->draw_indexed(vertex_array, index_count);
}
inline static auto draw_arrays(uint32_t vertex_count, uint32_t first = 0) -> void
{
s_renderer_api->draw_arrays(vertex_count, first);
}
inline static auto draw_lines(const Ref<VertexArray>& vertex_array, uint32_t index_count = 0) -> void
{
s_renderer_api->draw_lines(vertex_array, index_count);
}
inline static auto bind_texture(uint32_t texture_id, uint32_t slot = 0) -> void
{
s_renderer_api->bind_texture(texture_id, slot);
}
inline static auto bind_image_texture(uint32_t texture_id, uint32_t slot = 0, bool read_only = false) -> void
{
s_renderer_api->bind_image_texture(texture_id, slot, read_only);
}
inline static auto read_pixels(uint32_t x, uint32_t y, uint32_t width, uint32_t height,
uint32_t format, uint32_t type, void* pixels) -> void
{
s_renderer_api->read_pixels(x, y, width, height, format, type, pixels);
}
private:
static Scope<RendererAPI> s_renderer_api;
};
class Renderer
{
public:
static auto init() -> void;
static auto shutdown() -> void;
static auto on_window_resize(uint32_t width, uint32_t height) -> void;
static auto submit(const Ref<Shader>& shader,
const Ref<VertexArray>& vertex_array,
const glm::mat4& transform,
const glm::mat4& view_projection) -> void;
static auto set_clear_color(const glm::vec4& color) -> void;
static auto clear() -> void;
inline static auto get_api() -> RendererAPI::API { return RendererAPI::get_api(); }
};
};
|