render texture scaling

This commit is contained in:
jacob 2025-07-23 15:11:47 -05:00
parent 7227c8f3d1
commit e52470951a
3 changed files with 24 additions and 210 deletions

View File

@ -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);

View File

@ -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?
* <Delay> = <USER_INTERP_RATIO> * <Tick interval>

View File

@ -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