render texture scaling
This commit is contained in:
parent
7227c8f3d1
commit
e52470951a
@ -105,6 +105,7 @@ SH_ENTRY(ROOTSIG) void cs(struct cs_input input)
|
|||||||
/* Apply temporal accumulation */
|
/* Apply temporal accumulation */
|
||||||
float hysterisis = 0;
|
float hysterisis = 0;
|
||||||
// hysterisis = 0.2;
|
// hysterisis = 0.2;
|
||||||
|
// hysterisis = 0.4;
|
||||||
// hysterisis = 0.5;
|
// hysterisis = 0.5;
|
||||||
// hysterisis = 0.9;
|
// hysterisis = 0.9;
|
||||||
color.rgb = lerp(color.rgb, read_tex[id].rgb, hysterisis);
|
color.rgb = lerp(color.rgb, read_tex[id].rgb, hysterisis);
|
||||||
|
|||||||
@ -28,7 +28,7 @@
|
|||||||
|
|
||||||
#define IMAGE_PIXELS_PER_UNIT 128.0
|
#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?
|
/* How many ticks back in time should the user thread blend between?
|
||||||
* <Delay> = <USER_INTERP_RATIO> * <Tick interval>
|
* <Delay> = <USER_INTERP_RATIO> * <Tick interval>
|
||||||
|
|||||||
231
src/user.c
231
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);
|
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
|
* 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
|
* 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 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));
|
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.x = min_f32(vis_scale.x, vis_scale.y);
|
||||||
vis_scale.y = vis_scale.x;
|
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);
|
scale = v2_mul_v2(scale, vis_scale);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -1109,126 +1028,20 @@ INTERNAL void user_update(struct sys_window *window)
|
|||||||
xf = xform_scaled(xf, scale);
|
xf = xform_scaled(xf, scale);
|
||||||
xf = xform_translated(xf, v2_mul(world_center, -1));
|
xf = xform_translated(xf, v2_mul(world_center, -1));
|
||||||
|
|
||||||
|
|
||||||
G.world_to_render_xf = xf;
|
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 xform world_to_ui_xf = G.world_to_ui_xf;
|
||||||
struct v2 camera_size = xform_get_scale(quad_xf);
|
struct xform world_to_render_xf = G.world_to_render_xf;
|
||||||
if (!v2_is_zero(camera_size)) {
|
struct xform render_to_world_xf = xform_invert(world_to_render_xf);
|
||||||
scale = v2_div_v2(G.render_vis_size, camera_size);
|
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;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
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));
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* ========================== *
|
/* ========================== *
|
||||||
* Update listener from view
|
* Update listener from view
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user