From e52470951a7dd4014df99ec8d6b9dc1e467fe7f9 Mon Sep 17 00:00:00 2001 From: jacob Date: Wed, 23 Jul 2025 15:11:47 -0500 Subject: [PATCH] render texture scaling --- res/sh/shade.hlsl | 1 + src/config.h | 2 +- src/user.c | 231 +++++----------------------------------------- 3 files changed, 24 insertions(+), 210 deletions(-) diff --git a/res/sh/shade.hlsl b/res/sh/shade.hlsl index d776add0..a016df19 100644 --- a/res/sh/shade.hlsl +++ b/res/sh/shade.hlsl @@ -105,6 +105,7 @@ SH_ENTRY(ROOTSIG) void cs(struct cs_input input) /* Apply temporal accumulation */ float hysterisis = 0; // hysterisis = 0.2; + // hysterisis = 0.4; // hysterisis = 0.5; // hysterisis = 0.9; color.rgb = lerp(color.rgb, read_tex[id].rgb, hysterisis); diff --git a/src/config.h b/src/config.h index 4988ed15..30aebbf4 100644 --- a/src/config.h +++ b/src/config.h @@ -28,7 +28,7 @@ #define IMAGE_PIXELS_PER_UNIT 128.0 -#define RENDER_MARGIN (1000) +#define RENDER_MARGIN (512) /* How many ticks back in time should the user thread blend between? * = * diff --git a/src/user.c b/src/user.c index 7120fb7e..43869fb0 100644 --- a/src/user.c +++ b/src/user.c @@ -915,100 +915,6 @@ INTERNAL void user_update(struct sys_window *window) G.ui_cursor = xform_mul_v2(xform_invert(G.ui_to_screen_xf), G.screen_cursor); - /* ========================== * - * Update render to ui xform - * ========================== */ - - //DEBUGBREAKABLE; - /* FIXME: - * At 180p & 360p, objects increment in uniform but grid does not. - * At 270p, grid increments in uniform but objects do not */ - - //G.render_vis_size = V2(20, 20); - //G.render_vis_size = V2(320, 180); - //G.render_vis_size = V2(480, 270); - G.render_vis_size = V2(640, 360); - - G.render_size = G.render_vis_size; - G.render_size.x += RENDER_MARGIN; - G.render_size.y += RENDER_MARGIN; - - -#if 0 - { - struct v2 scale = v2_div_v2(G.ui_size, G.render_vis_size); - scale.x = max_f32(scale.x, scale.y); - scale.y = scale.x; - struct xform xf = XFORM_IDENT; - xf = xform_scaled(xf, scale); - xf = xform_translated(xf, v2_mul(V2(RENDER_MARGIN, RENDER_MARGIN), -0.5)); - G.render_to_ui_xf = xf; - } -#elif 0 - { - struct v2 pos = v2_mul(G.ui_size, 0.5); - pos = v2_sub(pos, v2_mul(G.render_size, 0.5)); - G.render_to_ui_xf = XFORM_TRS(.t = pos); - } -#elif 0 - { - struct v2 scale = v2_div_v2(G.render_size, G.render_vis_size); - scale.x = min_f32(scale.x, scale.y); - scale.y = scale.x; - - struct xform xf = XFORM_IDENT; - //xf = xform_translated(xf, v2_mul(V2(RENDER_MARGIN, RENDER_MARGIN), -0.5)); - xf = xform_scaled(xf, scale); - G.render_to_ui_xf = xf; - } -#else - { - struct v2 margin = V2(RENDER_MARGIN, RENDER_MARGIN); - (UNUSED)margin; - - struct v2 scale = v2_div_v2(G.render_size, G.render_vis_size); - scale.x = max_f32(scale.x, scale.y); - scale.y = scale.x; - (UNUSED)scale; - - struct xform xf = XFORM_IDENT; - - -#if 0 - xf = xform_translated(xf, v2_mul(v2_sub(G.ui_size, G.render_size), 0.5)); - xf = xform_scaled(xf, scale); -#else - struct v2 ui_center = v2_mul(G.ui_size, 0.5); - struct v2 render_center = v2_mul(G.render_size, 0.5); - - xf = xform_translated(xf, ui_center); - xf = xform_scaled(xf, scale); - xf = xform_translated(xf, v2_neg(render_center)); -#endif - - //xf = xform_translated(xf, v2_mul(V2(RENDER_MARGIN, RENDER_MARGIN), -0.5)); - - - //xf = xform_translated(xf, v2_mul(v2_sub(G.ui_size, G.render_size), -0.5)); - - - - //xf = xform_translated(xf, margin); - - //xf = xform_translated(xf, V2(100, 100)); - - //xf.og = v2_sub(G.ui_size, G.render_size); - - //xf = xform_translated(xf, v2_div_v2(v2_mul(v2_sub(G.ui_size, G.render_size), 0.5), scale)); - - - - - - G.render_to_ui_xf = xf; - } -#endif - /* ========================== * * Update world to ui xform from camera * ========================== */ @@ -1077,6 +983,19 @@ INTERNAL void user_update(struct sys_window *window) * Update world to render xform from camera * ========================== */ + //DEBUGBREAKABLE; + /* FIXME: + * At 180p & 360p, objects increment in uniform but grid does not. + * At 270p, grid increments in uniform but objects do not */ + + //G.render_vis_size = V2(320, 180); + //G.render_vis_size = V2(480, 270); + G.render_vis_size = V2(640, 360); + + G.render_size = G.render_vis_size; + G.render_size.x += RENDER_MARGIN; + G.render_size.y += RENDER_MARGIN; + { struct xform ui_to_world_xf = xform_invert(G.world_to_ui_xf); struct v2 world_center = xform_mul_v2(ui_to_world_xf, v2_mul(G.ui_size, 0.5)); @@ -1097,7 +1016,7 @@ INTERNAL void user_update(struct sys_window *window) vis_scale.x = min_f32(vis_scale.x, vis_scale.y); vis_scale.y = vis_scale.x; - scale = xform_get_scale(G.world_to_ui_xf); + scale = V2(IMAGE_PIXELS_PER_UNIT, IMAGE_PIXELS_PER_UNIT); scale = v2_mul_v2(scale, vis_scale); #endif @@ -1109,126 +1028,20 @@ INTERNAL void user_update(struct sys_window *window) xf = xform_scaled(xf, scale); xf = xform_translated(xf, v2_mul(world_center, -1)); - G.world_to_render_xf = xf; } + /* ========================== * + * Update render to ui xform + * ========================== */ - - - - - - -#if 0 - if (G.debug_camera) { -#if 0 - G.world_to_render_xf = xform_basis_with_rotation_world(G.world_to_render_xf, 0); - - struct v2 world_cursor = G.world_cursor; - - /* Pan view */ - if (G.bind_states[USER_BIND_KIND_PAN].is_held) { - if (!G.debug_camera_panning) { - G.debug_camera_pan_start = world_cursor; - G.debug_camera_panning = 1; - } - struct v2 offset = v2_neg(v2_sub(G.debug_camera_pan_start, world_cursor)); - G.world_to_render_xf = xform_translated(G.world_to_render_xf, offset); - world_cursor = xform_invert_mul_v2(G.world_to_render_xf, G.ui_cursor); - G.debug_camera_pan_start = world_cursor; - } else { - G.debug_camera_panning = 0; - } - - /* Zoom view */ - i32 input_zooms = G.bind_states[USER_BIND_KIND_ZOOM_IN].num_presses - G.bind_states[USER_BIND_KIND_ZOOM_OUT].num_presses; - if (input_zooms != 0) { - /* Zoom to cursor */ - f32 zoom_rate = 2; - f32 zoom = math_pow(zoom_rate, input_zooms); - G.world_to_render_xf = xform_translated(G.world_to_render_xf, world_cursor); - G.world_to_render_xf = xform_scaled(G.world_to_render_xf, V2(zoom, zoom)); - G.world_to_render_xf = xform_translated(G.world_to_render_xf, v2_neg(world_cursor)); - } -#endif - } else { - struct xform xf = sim_ent_get_xform(local_camera); - - struct v2 world_center = xf.og; - f32 rot = xform_get_rotation(xf); - - /* Scale view into viewport based on camera size */ - struct v2 scale = G.render_vis_size; - { - struct xform quad_xf = xform_mul(xf, local_camera->camera_quad_xform); - struct v2 camera_size = xform_get_scale(quad_xf); - if (!v2_is_zero(camera_size)) { - scale = v2_div_v2(G.render_vis_size, camera_size); - } - } - scale.x = min_f32(scale.x, scale.y); - scale.y = scale.x; - - struct v2 render_center = v2_mul(G.render_size, 0.5); - struct trs trs = TRS(.t = v2_sub(render_center, world_center), .r = rot, .s = scale); - struct v2 pivot = world_center; - G.world_to_render_xf = XFORM_IDENT; - G.world_to_render_xf = xform_translated(G.world_to_render_xf, pivot); - G.world_to_render_xf = xform_translated(G.world_to_render_xf, trs.t); - G.world_to_render_xf = xform_rotated(G.world_to_render_xf, trs.r); - G.world_to_render_xf = xform_scaled(G.world_to_render_xf, trs.s); - G.world_to_render_xf = xform_translated(G.world_to_render_xf, v2_neg(pivot)); - } -#endif - - - - - - - - - - - - -#if 0 { -#if 1 - struct quad world_camera_quad = ZI; - world_camera_quad.p0 = V2(0, 0); - world_camera_quad.p1 = V2(0, G.ui_size.x); - world_camera_quad.p2 = V2(G.ui_size.x, G.ui_size.y); - world_camera_quad.p3 = V2(0, G.ui_size.y); - - struct xform ui_to_world_xf = xform_invert(G.world_to_ui_xf); - world_camera_quad = xform_mul_quad(ui_to_world_xf, world_camera_quad); - - struct v2 world_center = xform_mul_v2(ui_to_world_xf, v2_mul(G.ui_size, 0.5)); -#else - //struct xform xf = sim_ent_get_xform(local_camera); -#endif - - //struct v2 world_center = xf.og; - f32 rot = xform_get_rotation(G.world_to_ui_xf); - - /* Scale view into viewport based on camera size */ - //struct v2 scale = v2_div_v2(G.render_size, G.ui_size); - struct v2 scale = v2_sub(world_camera_quad.p2, world_camera_quad.p0); - scale = v2_div_v2(G.render_size, scale); - - struct v2 render_center = v2_mul(G.render_size, 0.5); - struct trs trs = TRS(.t = v2_sub(render_center, world_center), .r = rot, .s = scale); - struct v2 pivot = world_center; - G.world_to_render_xf = XFORM_IDENT; - G.world_to_render_xf = xform_translated(G.world_to_render_xf, pivot); - G.world_to_render_xf = xform_translated(G.world_to_render_xf, trs.t); - G.world_to_render_xf = xform_rotated(G.world_to_render_xf, trs.r); - G.world_to_render_xf = xform_scaled(G.world_to_render_xf, trs.s); - G.world_to_render_xf = xform_translated(G.world_to_render_xf, v2_neg(pivot)); + struct xform world_to_ui_xf = G.world_to_ui_xf; + struct xform world_to_render_xf = G.world_to_render_xf; + struct xform render_to_world_xf = xform_invert(world_to_render_xf); + struct xform render_to_ui_xf = xform_mul(world_to_ui_xf, render_to_world_xf); + G.render_to_ui_xf = render_to_ui_xf; } -#endif /* ========================== * * Update listener from view