diff options
| author | 0undefined <oscar@nelin.dk> | 2026-02-08 00:36:27 +0000 |
|---|---|---|
| committer | 0undefined <oscar@nelin.dk> | 2026-02-08 00:37:36 +0000 |
| commit | b8bbf51f27237d9036bf77250043538a65f6dbf4 (patch) | |
| tree | 53af7e69fd86aa597833a4eec1fee7c7c12df129 /state_mainstate/src/mainstate.c | |
| parent | 67abeb98391b5ae7bedff16d2050b1076dcde53a (diff) | |
Setup new framebuffer
Remains to use the texture of the other framebuffer as input for new
framebuffer. May require a render object.
Diffstat (limited to 'state_mainstate/src/mainstate.c')
| -rw-r--r-- | state_mainstate/src/mainstate.c | 32 |
1 files changed, 25 insertions, 7 deletions
diff --git a/state_mainstate/src/mainstate.c b/state_mainstate/src/mainstate.c index 7c2c86a..b9948c3 100644 --- a/state_mainstate/src/mainstate.c +++ b/state_mainstate/src/mainstate.c @@ -113,6 +113,8 @@ void window_resize_callback(ivec3* dst, ivec2 src) { //glm_ivec2_divs(src, 4, *dst); } +Camera UI_Camera; + void perspective_update_callback(Camera* dst, void *s, ivec2 src) { mainstate_state *state = s; #ifdef FOV_ORTHO @@ -366,27 +368,42 @@ void mainstate_init(Window *restrict w, mainstate_state *state, void* arg) { WARN("Number of bindings: %lu", state->input_ctx.len); i_ctx_push(&state->input_ctx); + // Setup flat "final" camera + ivec2 ws = {200,200}; + glm_vec3_copy((vec3){0,0,0}, UI_Camera.pos); + glm_vec3_copy((vec3){0,0,1}, UI_Camera.dir); + r_perspective_ortho(&UI_Camera, 15, ws); u32 t[] = { + // Texture final texture that is presented to screen + BUFFERPARAMETER_SET_PARAMETER(BUFFERPARAMETER_SET_TYPE(0, BufferType_texture), BUFFERPARAMETER_FMT_RGB8), + + // Target texture for intermmediate FB 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 = 0, .dimensions = {48, 48, 0}}, {.num_textures = 1, .num_renderbuffers = 1, .dimensions = {48, 48, 0}}, }; // There's a strange duality between using functions to change render_targets, // and manipulating the datastructures directly. - window_init_renderstack(w, 1, sizeof(t) / sizeof(t[0]), p, t); + window_init_renderstack(w, 2, sizeof(t) / sizeof(t[0]), p, t); w->render_targets->camera_reset_callback[0] = &perspective_update_callback; w->render_targets->framebuffer_size_callback[0] = &window_resize_callback; - r_set_camera(w->render_targets, 0, &state->c); + w->render_targets->camera_reset_callback[1] = &perspective_update_callback; + w->render_targets->framebuffer_size_callback[1] = &window_resize_callback; + r_set_camera(w->render_targets, 0, &UI_Camera); + //r_set_camera(w->render_targets, 0, &state->c); + r_set_camera(w->render_targets, 1, &state->c); } @@ -402,12 +419,13 @@ StateType mainstate_update(Window *restrict w, mainstate_state *state, f64 dt) { const f32 dsec = (f32)(dt / 1000000.f); r_clear_buffer(w->context, w->render_targets, 0); + r_clear_buffer(w->context, w->render_targets, 1); - //extern Instance* p; - draw_model(w, 0, &state->terrain.renderobj, (vec4){0,0,0,1}); - //engine_draw_model(&(state->objects[2]), (vec3){0,3,0}); - //engine_draw_model(&(state->objects[0]), (vec3){0,0,0}); - //engine_draw_model(&(state->objects[1]), (vec3){0,0,0}); + // Order really shouldn't matter + draw_model(w, 1, &state->terrain.renderobj, (vec4){0,0,0,1}); + // Location should, however + // Draw UI by their screen XY coordinates, Z is the depth/layering + draw_model(w, 0, &state->objects[2], (vec4){-0.5,0.5,0.0,1}); // Move the camera // ... all of this should be easily selectable in the engine |
