A 3D game engine from scratch.
1// (c) 2020 Vlad-Stefan Harbuz <vlad@vladh.net>
2
3#include "debug.hpp"
4#include "util.hpp"
5#include "logs.hpp"
6#include "models.hpp"
7
8
9drawable::State *drawable::state = nullptr;
10
11
12char const *
13drawable::render_pass_to_string(drawable::Pass render_pass)
14{
15 if (render_pass == drawable::Pass::none) {
16 return "none";
17 } else if (render_pass == drawable::Pass::shadowcaster) {
18 return "shadowcaster";
19 } else if (render_pass == drawable::Pass::deferred) {
20 return "deferred";
21 } else if (render_pass == drawable::Pass::forward_depth) {
22 return "forward_depth";
23 } else if (render_pass == drawable::Pass::forward_nodepth) {
24 return "forward_nodepth";
25 } else if (render_pass == drawable::Pass::forward_skybox) {
26 return "forward_skybox";
27 } else if (render_pass == drawable::Pass::lighting) {
28 return "lighting";
29 } else if (render_pass == drawable::Pass::postprocessing) {
30 return "postprocessing";
31 } else if (render_pass == drawable::Pass::preblur) {
32 return "preblur";
33 } else if (render_pass == drawable::Pass::blur1) {
34 return "blur1";
35 } else if (render_pass == drawable::Pass::blur2) {
36 return "blur2";
37 } else if (render_pass == drawable::Pass::renderdebug) {
38 return "renderdebug";
39 } else {
40 logs::error("Don't know how to convert drawable::Pass to string: %d", render_pass);
41 return "<unknown>";
42 }
43}
44
45
46drawable::Pass
47drawable::render_pass_from_string(const char* str)
48{
49 if (pstr_eq(str, "none")) {
50 return drawable::Pass::none;
51 } else if (pstr_eq(str, "shadowcaster")) {
52 return drawable::Pass::shadowcaster;
53 } else if (pstr_eq(str, "deferred")) {
54 return drawable::Pass::deferred;
55 } else if (pstr_eq(str, "forward_depth")) {
56 return drawable::Pass::forward_depth;
57 } else if (pstr_eq(str, "forward_nodepth")) {
58 return drawable::Pass::forward_nodepth;
59 } else if (pstr_eq(str, "forward_skybox")) {
60 return drawable::Pass::forward_skybox;
61 } else if (pstr_eq(str, "lighting")) {
62 return drawable::Pass::lighting;
63 } else if (pstr_eq(str, "postprocessing")) {
64 return drawable::Pass::postprocessing;
65 } else if (pstr_eq(str, "preblur")) {
66 return drawable::Pass::preblur;
67 } else if (pstr_eq(str, "blur1")) {
68 return drawable::Pass::blur1;
69 } else if (pstr_eq(str, "blur2")) {
70 return drawable::Pass::blur2;
71 } else if (pstr_eq(str, "renderdebug")) {
72 return drawable::Pass::renderdebug;
73 } else {
74 logs::fatal("Could not parse drawable::Pass: %s", str);
75 return drawable::Pass::none;
76 }
77}
78
79
80bool
81drawable::is_component_valid(drawable::Component *drawable_component)
82{
83 return geom::is_mesh_valid(&drawable_component->mesh);
84}
85
86
87void
88drawable::destroy_component(drawable::Component *drawable_component)
89{
90 if (!is_component_valid(drawable_component)) {
91 return;
92 }
93 geom::destroy_mesh(&drawable_component->mesh);
94}
95
96
97Array<drawable::Component> *
98drawable::get_components()
99{
100 return &drawable::state->components;
101}
102
103
104drawable::Component *
105drawable::get_component(entities::Handle entity_handle)
106{
107 return drawable::state->components[entity_handle];
108}
109
110
111u32
112drawable::get_last_drawn_shader_program()
113{
114 return drawable::state->last_drawn_shader_program;
115}
116
117
118void
119drawable::set_last_drawn_shader_program(u32 val)
120{
121 drawable::state->last_drawn_shader_program = val;
122}
123
124
125void
126drawable::init(drawable::State *drawable_state, memory::Pool *asset_memory_pool)
127{
128 drawable::state = drawable_state;
129 drawable::state->components = Array<drawable::Component>(
130 asset_memory_pool, MAX_N_ENTITIES, "drawable_components", true, 1);
131}