summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/daw.c176
-rw-r--r--src/include/daw/rendering.h3
-rw-r--r--src/include/daw/window.h4
-rw-r--r--src/rendering.c139
-rw-r--r--src/window.c9
5 files changed, 160 insertions, 171 deletions
diff --git a/src/daw.c b/src/daw.c
index f49e508..c6553ab 100644
--- a/src/daw.c
+++ b/src/daw.c
@@ -41,9 +41,6 @@
Instance* GLOBAL_PLATFORM = NULL;
-#define DEFAULT_CAMERA { .pos = {3, 0, 0}, .dir = {1, 1, 1}, }
-static Camera default_camera = DEFAULT_CAMERA;
-
input_callback_t* callbacks[128];
usize callbacks_len;
@@ -152,82 +149,10 @@ Instance* engine_init(const char* windowtitle, i32 windowWidth, i32 windowHeight
return p;
}
-// TODO: MOVE TO RENDERING
-static f32 default_quad[8] = {
- -1.0f, -1.0f,
- 1.0f, -1.0f,
- 1.0f, 1.0f,
- -1.0f, 1.0f,
-};
-
-static f32 default_quad_uv[8] = {
- 0.f, 0.f,
- 1.f, 0.f,
- 1.f, 1.f,
- 0.f, 1.f,
-};
-
-static u8 default_quad_ibo[6] = {
- 0, 1, 2,
- 2, 3, 0,
-};
-
-// TODO: CREATE DEFAULT SHADERBUFF
-#define COUNT(a) sizeof(a) / sizeof(a[0])
-static ShaderBuffer shaderbuf[3] = {
- SHADERBUFFER_NEW(f32, COUNT(default_quad), 2, default_quad, ShaderBuffer_AccessFrequency_static | ShaderBuffer_AccessType_draw | ShaderBuffer_Type_vertexPosition),
- SHADERBUFFER_NEW(f32, COUNT(default_quad_uv), 2, default_quad_uv, ShaderBuffer_AccessFrequency_static | ShaderBuffer_AccessType_draw),
- SHADERBUFFER_NEW(u8, COUNT(default_quad_ibo), 3, default_quad_ibo, ShaderBuffer_AccessFrequency_static | ShaderBuffer_AccessType_draw | ShaderBuffer_Type_vertexIndex),
-};
-#undef COUNT
-
-static const char* default_quad_shader_vertex_src =
-"#version 330 core\n"
-"\n"
-"layout(location = 0) in vec2 vertexPosition_modelspace;\n"
-"layout(location = 1) in vec2 vertexUV;\n"
-"\n"
-"out vec2 UV;\n"
-"\n"
-"void main() {\n"
-" gl_Position = vec4(vertexPosition_modelspace, 0, 1);\n"
-"\n"
-" UV = vertexUV;\n"
-"}";
-
-static const char* default_quad_shader_fragment_src =
-"#version 330 core\n"
-"\n"
-"// Ouput data\n"
-"in vec2 UV;\n"
-"out vec3 color;\n"
-"\n"
-"uniform sampler2D textureSampler;\n"
-"\n"
-"void main() {\n"
-" color = texture(textureSampler, UV).rgb;\n"
-"}";
-
-
-void framebuffer_size_callback_default(ivec3* dst,ivec2 src) {
- glm_ivec2_copy(src, *dst);
-}
-
-void camera_reset_callback_default(Camera* dst, void* state, ivec2 src) {
- r_reset_camera(dst, src);
-}
-
-
i32 engine_run(Instance* p, StateType initial_state, void* state_arg) {
- // TODO: MOVE TO INIT
- Shader default_quad_shaders[] = {
- compile_shader(default_quad_shader_vertex_src, Shader_Vertex),
- compile_shader(default_quad_shader_fragment_src, Shader_Fragment),
- (Shader){0},
- };
- default_quad_shaders[2] = compose_shader(default_quad_shaders, 2);
+ Shader default_quad_shader = init_default_shader();
RenderObject default_quad_renderobject;
if (p == NULL) {
@@ -245,52 +170,13 @@ i32 engine_run(Instance* p, StateType initial_state, void* state_arg) {
{
u64 state_init_time = get_time();
State_init(state, p->window, mem, state_arg);
- if (!w->render_targets) {
- // Create only 1 additional framebuffer, in addition to the default
- // one. This is used to render a texture that is represented as a quad
- // on the default framebuffer.
- ivec2 wsz;
- window_get_size(&wsz);
- u32 t[] = {
- BUFFERPARAMETER_SET_PARAMETER(BUFFERPARAMETER_SET_TYPE(0, BufferType_texture), BUFFERPARAMETER_FMT_RGB8),
- // The depth buffer could also be a texture like so:
- // BUFFERPARAMETER_SET_PARAMETER(
- // BUFFERPARAMETER_SET_TYPE(0, BufferType_texture),
- // BUFFERPARAMETER_FMT_DEPTH32
- // ),
- BUFFERPARAMETER_SET_PARAMETER(BUFFERPARAMETER_SET_TYPE(0, BufferType_render), BUFFERPARAMETER_FMT_DEPTH32F),
- };
- FramebufferParameters p[] = {
- {.num_textures = 1, .num_renderbuffers = 1, .dimensions = {wsz[0], wsz[1], 0}},
- };
- window_init_renderstack(w, 1, sizeof(t) / sizeof(t[0]), p, t);
-
- w->render_targets->framebuffer_size_callback[0] = &framebuffer_size_callback_default;
- w->render_targets->camera_reset_callback[0] = &camera_reset_callback_default;
- w->render_targets->cam[0] = &default_camera;
-
- window_reset_cameras(w, mem, w->render_targets);
- }
-
- u32 first_texture = 0;
-
- for (usize i = 0; i < w->render_targets->buffer_len; i++) {
- if (BUFFERPARAMETER_GET_TYPE(w->render_targets->buffer_parameters[i]) == BufferType_texture) {
- first_texture = w->render_targets->buffer[i];
- break;
- }
- }
-
- default_quad_renderobject = RenderObject_new(
- // Shader
- &default_quad_shaders[2],
- // Texture
- first_texture,
- // Vertices
- shaderbuf,
- sizeof(shaderbuf) / sizeof(ShaderBuffer)
- );
+ r_reset_pipeline(w);
+ // TODO: Both the shader & renderobject should only be created here if it is
+ // overwritten in Instance->Window.
+ // TODO: Add default quad & renderobject to Instance->Window. Should allow
+ // for customization.
+ default_quad_renderobject = init_default_renderobject(w, default_quad_shader);
INFO("Initializing state \"%s\" took %.1fns", StateTypeStr[state],
(get_time() - state_init_time));
@@ -346,53 +232,9 @@ i32 engine_run(Instance* p, StateType initial_state, void* state_arg) {
{
u64 state_init_time = get_time();
State_init(state, p->window, mem, retval);
- if (!w->render_targets) {
- // Create only 1 additional framebuffer, in addition to the default
- // one. This is used to render a texture that is represented as a quad
- // on the default framebuffer.
- ivec2 wsz;
- window_get_size(&wsz);
- u32 t[] = {
- BUFFERPARAMETER_SET_PARAMETER(BUFFERPARAMETER_SET_TYPE(0, BufferType_texture), BUFFERPARAMETER_FMT_RGB8),
-
- // The depth buffer could also be a texture like so:
- // BUFFERPARAMETER_SET_PARAMETER(
- // BUFFERPARAMETER_SET_TYPE(0, BufferType_texture),
- // BUFFERPARAMETER_FMT_DEPTH32
- // ),
- BUFFERPARAMETER_SET_PARAMETER(BUFFERPARAMETER_SET_TYPE(0, BufferType_render), BUFFERPARAMETER_FMT_DEPTH32F),
- };
- FramebufferParameters p[] = {
- {.num_textures = 1, .num_renderbuffers = 1, .dimensions = {wsz[0], wsz[1], 0}},
- };
- window_init_renderstack(w, 1, sizeof(t) / sizeof(t[0]), p, t);
-
- // TODO set if null ..?
- w->render_targets->framebuffer_size_callback[0] = &framebuffer_size_callback_default;
- w->render_targets->camera_reset_callback[0] = &camera_reset_callback_default;
- w->render_targets->cam[0] = &default_camera;
-
- window_reset_cameras(w, mem, w->render_targets);
- }
- u32 first_texture = 0;
-
- for (usize i = 0; i < w->render_targets->buffer_len; i++) {
- if (BUFFERPARAMETER_GET_TYPE(w->render_targets->buffer_parameters[i]) == BufferType_texture) {
- first_texture = w->render_targets->buffer[i];
- break;
- }
- }
-
- default_quad_renderobject = RenderObject_new(
- // Shader
- &default_quad_shaders[2],
- // Texture
- first_texture, /*TODO*/
- // Vertices
- shaderbuf,
- sizeof(shaderbuf) / sizeof(ShaderBuffer)
- );
+ r_reset_pipeline(w);
+ default_quad_renderobject = init_default_renderobject(w, default_quad_shader);
INFO("Initializing state \"%s\" took %.1fns", StateTypeStr[state],
(get_time() - state_init_time));
diff --git a/src/include/daw/rendering.h b/src/include/daw/rendering.h
index 321cfd0..640f104 100644
--- a/src/include/daw/rendering.h
+++ b/src/include/daw/rendering.h
@@ -400,6 +400,9 @@ void r_init_renderstack(
void r_clear_buffer(void *restrict context, RenderTargets *restrict t, u32 framebuffer_idx);
//static void r_create_renderbuffers(GladGLContext* restrict ctx, u32* restrict renderbuffer_array, u32* restrict renderbuffer_types, ivec2* restrict renderbuffer_sizes, usize num_targets);
+// Callbacks used for framebuffers in rendertargets
+void framebuffer_size_callback_default(ivec3* dst,ivec2 src);
+void camera_reset_callback_default(Camera* dst, void* state, ivec2 src);
#ifdef __cplusplus
}
diff --git a/src/include/daw/window.h b/src/include/daw/window.h
index 3fe432d..99f6b6c 100644
--- a/src/include/daw/window.h
+++ b/src/include/daw/window.h
@@ -106,6 +106,10 @@ void window_reset_drawing(void);
void render(Window* w);
void draw_model(Window *restrict w, u32 framebuffer_idx, RenderObject* o, vec4 pos);
+void r_reset_pipeline(Window* w);
+RenderObject init_default_renderobject(Window* w, Shader s);
+Shader init_default_shader(void);
+
void window_init_renderstack(Window *restrict w,
usize num_fbuf, usize num_buf,
FramebufferParameters *restrict fb_params,
diff --git a/src/rendering.c b/src/rendering.c
index 296c2ed..8feac35 100644
--- a/src/rendering.c
+++ b/src/rendering.c
@@ -13,6 +13,64 @@
#include <daw/rendering.h>
#include <daw/logging.h>
+static f32 default_quad[8] = {
+ -1.0f, -1.0f,
+ 1.0f, -1.0f,
+ 1.0f, 1.0f,
+ -1.0f, 1.0f,
+};
+
+static f32 default_quad_uv[8] = {
+ 0.f, 0.f,
+ 1.f, 0.f,
+ 1.f, 1.f,
+ 0.f, 1.f,
+};
+
+static u8 default_quad_ibo[6] = {
+ 0, 1, 2,
+ 2, 3, 0,
+};
+
+#define DEFAULT_CAMERA { .pos = {3, 0, 0}, .dir = {1, 1, 1}, }
+static Camera default_camera = DEFAULT_CAMERA;
+
+
+// TODO: CREATE DEFAULT SHADERBUFF
+#define COUNT(a) sizeof(a) / sizeof(a[0])
+static ShaderBuffer shaderbuf[3] = {
+ SHADERBUFFER_NEW(f32, COUNT(default_quad), 2, default_quad, ShaderBuffer_AccessFrequency_static | ShaderBuffer_AccessType_draw | ShaderBuffer_Type_vertexPosition),
+ SHADERBUFFER_NEW(f32, COUNT(default_quad_uv), 2, default_quad_uv, ShaderBuffer_AccessFrequency_static | ShaderBuffer_AccessType_draw),
+ SHADERBUFFER_NEW(u8, COUNT(default_quad_ibo), 3, default_quad_ibo, ShaderBuffer_AccessFrequency_static | ShaderBuffer_AccessType_draw | ShaderBuffer_Type_vertexIndex),
+};
+#undef COUNT
+
+static const char* default_quad_shader_vertex_src =
+"#version 330 core\n"
+"\n"
+"layout(location = 0) in vec2 vertexPosition_modelspace;\n"
+"layout(location = 1) in vec2 vertexUV;\n"
+"\n"
+"out vec2 UV;\n"
+"\n"
+"void main() {\n"
+" gl_Position = vec4(vertexPosition_modelspace, 0, 1);\n"
+"\n"
+" UV = vertexUV;\n"
+"}";
+
+static const char* default_quad_shader_fragment_src =
+"#version 330 core\n"
+"\n"
+"// Ouput data\n"
+"in vec2 UV;\n"
+"out vec3 color;\n"
+"\n"
+"uniform sampler2D textureSampler;\n"
+"\n"
+"void main() {\n"
+" color = texture(textureSampler, UV).rgb;\n"
+"}";
/* Extern globals */
extern Instance* GLOBAL_PLATFORM;
@@ -922,3 +980,84 @@ void r_attach_buffers(void *restrict ctx, u32 fbo, u32* buffers, u32* buffer_par
}
}
}
+
+void framebuffer_size_callback_default(ivec3* dst,ivec2 src) {
+ glm_ivec2_copy(src, *dst);
+}
+
+void camera_reset_callback_default(Camera* dst, void* state, ivec2 src) {
+ r_reset_camera(dst, src);
+}
+
+RenderObject init_default_renderobject(Window *restrict w, Shader s) {
+ u32 first_texture = 0;
+
+ for (usize i = 0; i < w->render_targets->buffer_len; i++) {
+ if (BUFFERPARAMETER_GET_TYPE(w->render_targets->buffer_parameters[i]) == BufferType_texture) {
+ first_texture = w->render_targets->buffer[i];
+ break;
+ }
+ }
+
+ // WHAT?!
+ // --- Should _really_ make renderobjects heap allocated..!
+ return RenderObject_new(
+ // Shader
+ &s,
+ // Texture
+ first_texture,
+ // Vertices
+ shaderbuf,
+ sizeof(shaderbuf) / sizeof(ShaderBuffer)
+ );
+}
+
+Shader init_default_shader(void) {
+ // TODO: MOVE TO INIT
+ Shader default_quad_shaders[] = {
+ compile_shader(default_quad_shader_vertex_src, Shader_Vertex),
+ compile_shader(default_quad_shader_fragment_src, Shader_Fragment),
+ (Shader){0},
+ };
+ return compose_shader(default_quad_shaders, 2);
+}
+
+void r_reset_pipeline(Window* w) {
+ if (w->render_targets == NULL) {
+ // Create only 1 additional framebuffer, in addition to the default
+ // one. This is used to render a texture that is represented as a quad
+ // on the default framebuffer.
+ u32 t[] = {
+ BUFFERPARAMETER_SET_PARAMETER(BUFFERPARAMETER_SET_TYPE(0, BufferType_texture), BUFFERPARAMETER_FMT_RGB8),
+
+ // The depth buffer could also be a texture like so:
+ // BUFFERPARAMETER_SET_PARAMETER( BUFFERPARAMETER_SET_TYPE(0, BufferType_texture), BUFFERPARAMETER_FMT_DEPTH32),
+ BUFFERPARAMETER_SET_PARAMETER(BUFFERPARAMETER_SET_TYPE(0, BufferType_render), BUFFERPARAMETER_FMT_DEPTH32F),
+ };
+ FramebufferParameters p[] = {
+ // 16 by 16 is just some bogus values, but they cannot be zero, as they're
+ // needed to be set when resetting cameras.
+ {.num_textures = 1, .num_renderbuffers = 1, .dimensions = {16, 16, 0}},
+ };
+ window_init_renderstack(w, 1, sizeof(t) / sizeof(t[0]), p, t);
+ }
+
+ // Set default callbacks and camera for default framebuffer
+ if (w->render_targets->framebuffer_size_callback[0] == NULL) {
+ w->render_targets->framebuffer_size_callback[0] = framebuffer_size_callback_default;
+ }
+ if (w->render_targets->camera_reset_callback[0] == NULL) {
+ w->render_targets->camera_reset_callback[0] = camera_reset_callback_default;
+ }
+ if (w->render_targets->camera_reset_callback[0 == NULL]) {
+ w->render_targets->cam[0] = &default_camera;
+ }
+
+ window_reset_cameras(w, GLOBAL_PLATFORM->mem->data, w->render_targets);
+
+ // TODO: Both the shader & renderobject should only be created here if it is
+ // overwritten in Instance->Window.
+ // TODO: Add default quad & renderobject to Instance->Window. Should allow
+ // for customization.
+ //default_quad_renderobject = init_default_renderobject(p->window, default_quad_shader);
+}
diff --git a/src/window.c b/src/window.c
index 79e9a42..6e5fe71 100644
--- a/src/window.c
+++ b/src/window.c
@@ -152,7 +152,7 @@ void window_init_renderstack(Window *restrict w,
ASSERT(buffer_params != NULL);
RenderTargets *t = NULL;
- void* allocation = malloc(
+ usize allocation_sz =
sizeof(RenderTargets) +
sizeof(*t->framebuffer) * num_fbuf +
sizeof(*t->framebuffer_parameters) * num_fbuf +
@@ -160,9 +160,10 @@ void window_init_renderstack(Window *restrict w,
sizeof(*t->framebuffer_size_callback) * num_fbuf +
sizeof(*t->camera_reset_callback) * num_fbuf +
sizeof(*t->buffer) * num_buf +
- sizeof(*t->buffer_parameters) * num_buf
- // TODO: callbacks
- );
+ sizeof(*t->buffer_parameters) * num_buf;
+
+ void* allocation = malloc(allocation_sz);
+ memset(allocation, 0, allocation_sz);
#define ADVANCE_PTR(target, count)\
t->target = (void*)((u64)allocation + acc); \