rename viewport -> ui

This commit is contained in:
jacob 2025-01-20 09:29:34 -06:00
parent 3c47774e67
commit c6e1450d88

View File

@ -54,7 +54,7 @@ GLOBAL struct {
struct renderer_cmd_buffer *ui_cmd_buffer; struct renderer_cmd_buffer *ui_cmd_buffer;
struct renderer_cmd_buffer *final_cmd_buffer; struct renderer_cmd_buffer *final_cmd_buffer;
struct renderer_cmd_buffer *backbuffer_cmd_buffer; struct renderer_cmd_buffer *backbuffer_cmd_buffer;
struct xform world_view; struct xform world_to_ui_xf;
struct blend_tick *head_free_blend_tick; struct blend_tick *head_free_blend_tick;
struct blend_tick *head_blend_tick; struct blend_tick *head_blend_tick;
@ -77,10 +77,10 @@ GLOBAL struct {
f64 dt; f64 dt;
struct v2 screen_size; struct v2 screen_size;
struct v2 screen_cursor; struct v2 screen_cursor;
struct v2 viewport_screen_offset; struct v2 ui_screen_offset;
struct v2 viewport_size; struct v2 ui_size;
struct v2 viewport_center; struct v2 ui_center;
struct v2 viewport_cursor; struct v2 ui_cursor;
struct v2 world_cursor; struct v2 world_cursor;
} G = ZI, DEBUG_ALIAS(G, G_user); } G = ZI, DEBUG_ALIAS(G, G_user);
@ -154,7 +154,7 @@ struct user_startup_receipt user_startup(struct work_startup_receipt *work_sr,
G.sys_events_arena = arena_alloc(GIGABYTE(64)); G.sys_events_arena = arena_alloc(GIGABYTE(64));
world_alloc(&G.world); world_alloc(&G.world);
G.world_view = XFORM_TRS(.t = V2(0, 0), .r = 0, .s = V2(PIXELS_PER_UNIT, PIXELS_PER_UNIT)); G.world_to_ui_xf = XFORM_TRS(.t = V2(0, 0), .r = 0, .s = V2(PIXELS_PER_UNIT, PIXELS_PER_UNIT));
G.world_cmd_buffer = renderer_cmd_buffer_alloc(); G.world_cmd_buffer = renderer_cmd_buffer_alloc();
G.ui_cmd_buffer = renderer_cmd_buffer_alloc(); G.ui_cmd_buffer = renderer_cmd_buffer_alloc();
G.final_cmd_buffer = renderer_cmd_buffer_alloc(); G.final_cmd_buffer = renderer_cmd_buffer_alloc();
@ -410,9 +410,9 @@ INTERNAL void debug_draw_xform(struct xform xf, u32 color_x, u32 color_y)
f32 thickness = 2.f; f32 thickness = 2.f;
f32 arrowhead_len = 15.f; f32 arrowhead_len = 15.f;
struct v2 pos = xform_mul_v2(G.world_view, xf.og); struct v2 pos = xform_mul_v2(G.world_to_ui_xf, xf.og);
struct v2 x_ray = xform_basis_mul_v2(G.world_view, xform_get_right(xf)); struct v2 x_ray = xform_basis_mul_v2(G.world_to_ui_xf, xform_get_right(xf));
struct v2 y_ray = xform_basis_mul_v2(G.world_view, xform_get_up(xf)); struct v2 y_ray = xform_basis_mul_v2(G.world_to_ui_xf, xform_get_up(xf));
f32 ray_scale = 1; f32 ray_scale = 1;
x_ray = v2_mul(x_ray, ray_scale); x_ray = v2_mul(x_ray, ray_scale);
@ -438,8 +438,8 @@ INTERNAL void debug_draw_movement(struct entity *ent)
struct xform xf = entity_get_xform(ent); struct xform xf = entity_get_xform(ent);
struct v2 velocity = ent->linear_velocity; struct v2 velocity = ent->linear_velocity;
struct v2 pos = xform_mul_v2(G.world_view, xf.og); struct v2 pos = xform_mul_v2(G.world_to_ui_xf, xf.og);
struct v2 vel_ray = xform_basis_mul_v2(G.world_view, velocity); struct v2 vel_ray = xform_basis_mul_v2(G.world_to_ui_xf, velocity);
draw_arrow_ray(G.ui_cmd_buffer, pos, vel_ray, thickness, arrow_len, color_vel); draw_arrow_ray(G.ui_cmd_buffer, pos, vel_ray, thickness, arrow_len, color_vel);
} }
@ -642,10 +642,10 @@ INTERNAL void user_update(void)
b32 pressed = event->kind == SYS_EVENT_KIND_BUTTON_DOWN; b32 pressed = event->kind == SYS_EVENT_KIND_BUTTON_DOWN;
#if 0 #if 0
b32 out_of_bounds = button >= SYS_BTN_M1 && button <= SYS_BTN_M5 && b32 out_of_bounds = button >= SYS_BTN_M1 && button <= SYS_BTN_M5 &&
(G.viewport_cursor.x < 0 || (G.ui_cursor.x < 0 ||
G.viewport_cursor.y < 0 || G.ui_cursor.y < 0 ||
G.viewport_cursor.x > G.viewport_size.x || G.ui_cursor.x > G.ui_size.x ||
G.viewport_cursor.y > G.viewport_size.y); G.ui_cursor.y > G.ui_size.y);
#else #else
b32 out_of_bounds = false; b32 out_of_bounds = false;
#endif #endif
@ -759,16 +759,16 @@ INTERNAL void user_update(void)
} }
/* ========================== * /* ========================== *
* Update viewport from camera * Update ui from camera
* ========================== */ * ========================== */
/* Calculate screen viewport dimensions */ /* Calculate ui dimensions */
if (G.debug_camera) { if (G.debug_camera) {
G.viewport_size = G.screen_size; G.ui_size = G.screen_size;
G.viewport_screen_offset = V2(0, 0); G.ui_screen_offset = V2(0, 0);
} else { } else {
/* Determine viewport size by camera & window dimensions */ /* Determine ui size by camera & window dimensions */
f32 aspect_ratio = 1.0; f32 aspect_ratio = 1.0;
{ {
struct xform quad_xf = xform_mul(entity_get_xform(active_camera), active_camera->camera_quad_xform); struct xform quad_xf = xform_mul(entity_get_xform(active_camera), active_camera->camera_quad_xform);
@ -784,35 +784,35 @@ INTERNAL void user_update(void)
} else { } else {
height = math_ceil(width / aspect_ratio); height = math_ceil(width / aspect_ratio);
} }
G.viewport_size = V2(width, height); G.ui_size = V2(width, height);
/* Center viewport in window */ /* Center ui in window */
f32 x = 0; f32 x = 0;
f32 y = 0; f32 y = 0;
x = math_round(G.screen_size.x / 2 - width / 2); x = math_round(G.screen_size.x / 2 - width / 2);
y = math_round(G.screen_size.y / 2 - height / 2); y = math_round(G.screen_size.y / 2 - height / 2);
G.viewport_screen_offset = V2(x, y); G.ui_screen_offset = V2(x, y);
} }
G.viewport_center = v2_mul(G.viewport_size, 0.5); G.ui_center = v2_mul(G.ui_size, 0.5);
G.viewport_cursor = v2_sub(G.screen_cursor, G.viewport_screen_offset); G.ui_cursor = v2_sub(G.screen_cursor, G.ui_screen_offset);
/* ========================== * /* ========================== *
* Update view from camera * Update view from camera
* ========================== */ * ========================== */
if (G.debug_camera) { if (G.debug_camera) {
G.world_view = xform_basis_with_rotation_world(G.world_view, 0); G.world_to_ui_xf = xform_basis_with_rotation_world(G.world_to_ui_xf, 0);
/* Pan view */ /* Pan view */
if (G.bind_states[USER_BIND_KIND_PAN].is_held) { if (G.bind_states[USER_BIND_KIND_PAN].is_held) {
if (!G.debug_camera_panning) { if (!G.debug_camera_panning) {
G.debug_camera_pan_start = xform_invert_mul_v2(G.world_view, G.viewport_cursor); G.debug_camera_pan_start = xform_invert_mul_v2(G.world_to_ui_xf, G.ui_cursor);
} }
G.debug_camera_panning = true; G.debug_camera_panning = true;
struct v2 offset = v2_sub(G.debug_camera_pan_start, xform_invert_mul_v2(G.world_view, G.viewport_cursor)); struct v2 offset = v2_sub(G.debug_camera_pan_start, xform_invert_mul_v2(G.world_to_ui_xf, G.ui_cursor));
G.world_view = xform_translated(G.world_view, v2_neg(offset)); G.world_to_ui_xf = xform_translated(G.world_to_ui_xf, v2_neg(offset));
G.debug_camera_pan_start = xform_invert_mul_v2(G.world_view, G.viewport_cursor); G.debug_camera_pan_start = xform_invert_mul_v2(G.world_to_ui_xf, G.ui_cursor);
} else { } else {
G.debug_camera_panning = false; G.debug_camera_panning = false;
} }
@ -823,10 +823,10 @@ INTERNAL void user_update(void)
/* Zoom to cursor */ /* Zoom to cursor */
f32 zoom_rate = 2; f32 zoom_rate = 2;
f32 zoom = math_pow(zoom_rate, input_zooms); f32 zoom = math_pow(zoom_rate, input_zooms);
struct v2 world_cursor = xform_invert_mul_v2(G.world_view, G.viewport_cursor); struct v2 world_cursor = xform_invert_mul_v2(G.world_to_ui_xf, G.ui_cursor);
G.world_view = xform_translated(G.world_view, world_cursor); G.world_to_ui_xf = xform_translated(G.world_to_ui_xf, world_cursor);
G.world_view = xform_scaled(G.world_view, V2(zoom, zoom)); G.world_to_ui_xf = xform_scaled(G.world_to_ui_xf, V2(zoom, zoom));
G.world_view = xform_translated(G.world_view, v2_neg(world_cursor)); G.world_to_ui_xf = xform_translated(G.world_to_ui_xf, v2_neg(world_cursor));
} }
} else { } else {
struct xform xf = entity_get_xform(active_camera); struct xform xf = entity_get_xform(active_camera);
@ -835,7 +835,7 @@ INTERNAL void user_update(void)
f32 rot = xform_get_rotation(xf); f32 rot = xform_get_rotation(xf);
/* Scale view into viewport based on camera size */ /* Scale view into viewport based on camera size */
struct v2 size = G.viewport_size; struct v2 size = G.ui_size;
{ {
struct xform quad_xf = xform_mul(xf, active_camera->camera_quad_xform); struct xform quad_xf = xform_mul(xf, active_camera->camera_quad_xform);
struct v2 camera_size = xform_get_scale(quad_xf); struct v2 camera_size = xform_get_scale(quad_xf);
@ -846,20 +846,20 @@ INTERNAL void user_update(void)
f32 scale = min_f32(size.x, size.y); f32 scale = min_f32(size.x, size.y);
struct trs trs = TRS( struct trs trs = TRS(
.t = v2_sub(G.viewport_center, center), .t = v2_sub(G.ui_center, center),
.r = rot, .r = rot,
.s = V2(scale, scale) .s = V2(scale, scale)
); );
struct v2 pivot = center; struct v2 pivot = center;
G.world_view = XFORM_IDENT; G.world_to_ui_xf = XFORM_IDENT;
G.world_view = xform_translated(G.world_view, pivot); G.world_to_ui_xf = xform_translated(G.world_to_ui_xf, pivot);
G.world_view = xform_translated(G.world_view, trs.t); G.world_to_ui_xf = xform_translated(G.world_to_ui_xf, trs.t);
G.world_view = xform_rotated(G.world_view, trs.r); G.world_to_ui_xf = xform_rotated(G.world_to_ui_xf, trs.r);
G.world_view = xform_scaled(G.world_view, trs.s); G.world_to_ui_xf = xform_scaled(G.world_to_ui_xf, trs.s);
G.world_view = xform_translated(G.world_view, v2_neg(pivot)); G.world_to_ui_xf = xform_translated(G.world_to_ui_xf, v2_neg(pivot));
} }
G.world_cursor = xform_invert_mul_v2(G.world_view, G.viewport_cursor); G.world_cursor = xform_invert_mul_v2(G.world_to_ui_xf, G.ui_cursor);
/* ========================== * /* ========================== *
* Update listener from view * Update listener from view
@ -867,8 +867,8 @@ INTERNAL void user_update(void)
{ {
struct v2 up = V2(0, -1); struct v2 up = V2(0, -1);
struct v2 listener_pos = xform_invert_mul_v2(G.world_view, G.viewport_center); struct v2 listener_pos = xform_invert_mul_v2(G.world_to_ui_xf, G.ui_center);
struct v2 listener_dir = v2_norm(xform_basis_invert_mul_v2(G.world_view, up)); struct v2 listener_dir = v2_norm(xform_basis_invert_mul_v2(G.world_to_ui_xf, up));
mixer_set_listener(listener_pos, listener_dir); mixer_set_listener(listener_pos, listener_dir);
} }
@ -880,11 +880,11 @@ INTERNAL void user_update(void)
f32 thickness = 2; f32 thickness = 2;
u32 color = RGBA_32(0x3f, 0x3f, 0x3f, 0xFF); u32 color = RGBA_32(0x3f, 0x3f, 0x3f, 0xFF);
struct v2 offset = v2_neg(xform_mul_v2(G.world_view, V2(0, 0))); struct v2 offset = v2_neg(xform_mul_v2(G.world_to_ui_xf, V2(0, 0)));
f32 spacing = xform_get_scale(G.world_view).x; f32 spacing = xform_get_scale(G.world_to_ui_xf).x;
struct v2 pos = xform_invert_mul_v2(G.world_view, V2(0, 0)); struct v2 pos = xform_invert_mul_v2(G.world_to_ui_xf, V2(0, 0));
struct v2 size = xform_basis_invert_mul_v2(G.world_view, G.viewport_size); struct v2 size = xform_basis_invert_mul_v2(G.world_to_ui_xf, G.ui_size);
draw_grid(G.world_cmd_buffer, RECT_FROM_V2(pos, size), color, thickness, spacing, offset); draw_grid(G.world_cmd_buffer, RECT_FROM_V2(pos, size), color, thickness, spacing, offset);
} }
@ -1014,9 +1014,9 @@ INTERNAL void user_update(void)
struct sprite_sheet *sheet = sprite_sheet_from_tag_async(sprite_frame_scope, ent->sprite); struct sprite_sheet *sheet = sprite_sheet_from_tag_async(sprite_frame_scope, ent->sprite);
struct sprite_sheet_slice slice = sprite_sheet_get_slice(sheet, STR("attach.wep"), ent->animation_frame); struct sprite_sheet_slice slice = sprite_sheet_get_slice(sheet, STR("attach.wep"), ent->animation_frame);
struct v2 start = xform_mul_v2(sprite_xform, slice.center); struct v2 start = xform_mul_v2(sprite_xform, slice.center);
start = xform_mul_v2(G.world_view, start); start = xform_mul_v2(G.world_to_ui_xf, start);
struct v2 end = v2_add(xf.og, ent->control.focus); struct v2 end = v2_add(xf.og, ent->control.focus);
end = xform_mul_v2(G.world_view, end); end = xform_mul_v2(G.world_to_ui_xf, end);
draw_arrow_line(G.ui_cmd_buffer, start, end, 3, 10, RGBA_32_F(1, 1, 1, 0.5)); draw_arrow_line(G.ui_cmd_buffer, start, end, 3, 10, RGBA_32_F(1, 1, 1, 0.5));
} }
@ -1041,12 +1041,12 @@ INTERNAL void user_update(void)
struct sprite_sheet_slice slice = group->frame_slices[(ent->animation_frame * group->per_frame_count) + j]; struct sprite_sheet_slice slice = group->frame_slices[(ent->animation_frame * group->per_frame_count) + j];
struct v2 center = xform_mul_v2(sprite_xform, slice.center); struct v2 center = xform_mul_v2(sprite_xform, slice.center);
center = xform_mul_v2(G.world_view, center); center = xform_mul_v2(G.world_to_ui_xf, center);
if (!slice.has_ray) { if (!slice.has_ray) {
struct quad quad = quad_from_rect(slice.rect); struct quad quad = quad_from_rect(slice.rect);
quad = xform_mul_quad(sprite_xform, quad); quad = xform_mul_quad(sprite_xform, quad);
quad = xform_mul_quad(G.world_view, quad); quad = xform_mul_quad(G.world_to_ui_xf, quad);
draw_quad_line(G.ui_cmd_buffer, quad, 2, quad_color); draw_quad_line(G.ui_cmd_buffer, quad, 2, quad_color);
} }
@ -1054,7 +1054,7 @@ INTERNAL void user_update(void)
if (slice.has_ray) { if (slice.has_ray) {
struct v2 ray = xform_basis_mul_v2(sprite_xform, slice.dir); struct v2 ray = xform_basis_mul_v2(sprite_xform, slice.dir);
ray = xform_basis_mul_v2(G.world_view, ray); ray = xform_basis_mul_v2(G.world_to_ui_xf, ray);
ray = v2_with_len(ray, 25); ray = v2_with_len(ray, 25);
draw_arrow_ray(G.ui_cmd_buffer, center, ray, 2, 10, ray_color); draw_arrow_ray(G.ui_cmd_buffer, center, ray, 2, 10, ray_color);
} }
@ -1072,12 +1072,12 @@ INTERNAL void user_update(void)
/* Draw collider using support points */ /* Draw collider using support points */
//u32 detail = 64; //u32 detail = 64;
u32 detail = 512; u32 detail = 512;
draw_collider_line(G.ui_cmd_buffer, G.world_view, collider, xf, thickness, color, detail); draw_collider_line(G.ui_cmd_buffer, G.world_to_ui_xf, collider, xf, thickness, color, detail);
} }
{ {
/* Draw collider shape points */ /* Draw collider shape points */
for (u32 i = 0; i < collider.count; ++i) { for (u32 i = 0; i < collider.count; ++i) {
struct v2 p = xform_mul_v2(xform_mul(G.world_view, xf), collider.points[i]); struct v2 p = xform_mul_v2(xform_mul(G.world_to_ui_xf, xf), collider.points[i]);
draw_circle(G.ui_cmd_buffer, p, 3, COLOR_BLUE, 10); draw_circle(G.ui_cmd_buffer, p, 3, COLOR_BLUE, 10);
} }
} }
@ -1085,15 +1085,15 @@ INTERNAL void user_update(void)
/* Draw upwards line for circle */ /* Draw upwards line for circle */
struct v2 start = xf.og; struct v2 start = xf.og;
struct v2 end = collider_get_support_point(&collider, xf, v2_neg(xf.by)).p; struct v2 end = collider_get_support_point(&collider, xf, v2_neg(xf.by)).p;
start = xform_mul_v2(G.world_view, start); start = xform_mul_v2(G.world_to_ui_xf, start);
end = xform_mul_v2(G.world_view, end); end = xform_mul_v2(G.world_to_ui_xf, end);
draw_line(G.ui_cmd_buffer, start, end, thickness, color); draw_line(G.ui_cmd_buffer, start, end, thickness, color);
} }
#if 0 #if 0
/* Draw support point at focus dir */ /* Draw support point at focus dir */
{ {
struct v2 p = collider_support_point(&collider, xf, ent->control.focus); struct v2 p = collider_support_point(&collider, xf, ent->control.focus);
p = xform_mul_v2(G.world_view, p); p = xform_mul_v2(G.world_to_ui_xf, p);
draw_circle(G.ui_cmd_buffer, p, 3, COLOR_RED, 10); draw_circle(G.ui_cmd_buffer, p, 3, COLOR_RED, 10);
} }
#endif #endif
@ -1126,7 +1126,7 @@ INTERNAL void user_update(void)
u32 color = RGBA_32_F(1, 1, 0, 0.50); u32 color = RGBA_32_F(1, 1, 0, 0.50);
//struct v2 point = xform_mul_v2(e0_xf, contact.p0_local); //struct v2 point = xform_mul_v2(e0_xf, contact.p0_local);
//struct v2 point = contact.p0_initial_world; //struct v2 point = contact.p0_initial_world;
draw_circle(G.ui_cmd_buffer, xform_mul_v2(G.world_view, dbg_pt), radius, color, 10); draw_circle(G.ui_cmd_buffer, xform_mul_v2(G.world_to_ui_xf, dbg_pt), radius, color, 10);
} }
/* Draw normal */ /* Draw normal */
{ {
@ -1134,8 +1134,8 @@ INTERNAL void user_update(void)
f32 len = 0.1f; f32 len = 0.1f;
f32 arrow_thickness = 2; f32 arrow_thickness = 2;
f32 arrow_height = 5; f32 arrow_height = 5;
struct v2 start = xform_mul_v2(G.world_view, dbg_pt); struct v2 start = xform_mul_v2(G.world_to_ui_xf, dbg_pt);
struct v2 end = xform_mul_v2(G.world_view, v2_add(dbg_pt, v2_mul(v2_norm(data->normal), len))); struct v2 end = xform_mul_v2(G.world_to_ui_xf, v2_add(dbg_pt, v2_mul(v2_norm(data->normal), len)));
draw_arrow_line(G.ui_cmd_buffer, start, end, arrow_thickness, arrow_height, color); draw_arrow_line(G.ui_cmd_buffer, start, end, arrow_thickness, arrow_height, color);
} }
#if 0 #if 0
@ -1166,7 +1166,7 @@ INTERNAL void user_update(void)
FMT_UINT(data->num_points)); FMT_UINT(data->num_points));
draw_text(G.ui_cmd_buffer, disp_font, v2_add(v2_round(xform_mul_v2(G.world_view, dbg_pt)), V2(0, offset_px)), text); draw_text(G.ui_cmd_buffer, disp_font, v2_add(v2_round(xform_mul_v2(G.world_to_ui_xf, dbg_pt)), V2(0, offset_px)), text);
} }
} }
#endif #endif
@ -1191,8 +1191,8 @@ INTERNAL void user_update(void)
{ {
f32 radius = 4; f32 radius = 4;
u32 color = RGBA_32_F(1, 1, 0, 0.5); u32 color = RGBA_32_F(1, 1, 0, 0.5);
struct v2 a = xform_mul_v2(G.world_view, data->closest0); struct v2 a = xform_mul_v2(G.world_to_ui_xf, data->closest0);
struct v2 b = xform_mul_v2(G.world_view, data->closest1); struct v2 b = xform_mul_v2(G.world_to_ui_xf, data->closest1);
draw_circle(G.ui_cmd_buffer, a, radius, color, 10); draw_circle(G.ui_cmd_buffer, a, radius, color, 10);
draw_circle(G.ui_cmd_buffer, b, radius, color, 10); draw_circle(G.ui_cmd_buffer, b, radius, color, 10);
} }
@ -1209,27 +1209,27 @@ INTERNAL void user_update(void)
u32 color_a_clipped = RGBA_32_F(1, 0, 0, 1); u32 color_a_clipped = RGBA_32_F(1, 0, 0, 1);
u32 color_b_clipped = RGBA_32_F(0, 1, 0, 1); u32 color_b_clipped = RGBA_32_F(0, 1, 0, 1);
{ {
struct v2 a = xform_mul_v2(G.world_view, collider_res.a0); struct v2 a = xform_mul_v2(G.world_to_ui_xf, collider_res.a0);
struct v2 b = xform_mul_v2(G.world_view, collider_res.b0); struct v2 b = xform_mul_v2(G.world_to_ui_xf, collider_res.b0);
draw_line(G.ui_cmd_buffer, a, b, thickness, color_line); draw_line(G.ui_cmd_buffer, a, b, thickness, color_line);
draw_circle(G.ui_cmd_buffer, a, radius, color_a, 10); draw_circle(G.ui_cmd_buffer, a, radius, color_a, 10);
draw_circle(G.ui_cmd_buffer, b, radius, color_b, 10); draw_circle(G.ui_cmd_buffer, b, radius, color_b, 10);
struct v2 a_clipped = xform_mul_v2(G.world_view, collider_res.a0_clipped); struct v2 a_clipped = xform_mul_v2(G.world_to_ui_xf, collider_res.a0_clipped);
struct v2 b_clipped = xform_mul_v2(G.world_view, collider_res.b0_clipped); struct v2 b_clipped = xform_mul_v2(G.world_to_ui_xf, collider_res.b0_clipped);
draw_line(G.ui_cmd_buffer, a_clipped, b_clipped, thickness, color_line_clipped); draw_line(G.ui_cmd_buffer, a_clipped, b_clipped, thickness, color_line_clipped);
draw_circle(G.ui_cmd_buffer, a_clipped, radius, color_a_clipped, 10); draw_circle(G.ui_cmd_buffer, a_clipped, radius, color_a_clipped, 10);
draw_circle(G.ui_cmd_buffer, b_clipped, radius, color_b_clipped, 10); draw_circle(G.ui_cmd_buffer, b_clipped, radius, color_b_clipped, 10);
} }
{ {
struct v2 a = xform_mul_v2(G.world_view, collider_res.a1); struct v2 a = xform_mul_v2(G.world_to_ui_xf, collider_res.a1);
struct v2 b = xform_mul_v2(G.world_view, collider_res.b1); struct v2 b = xform_mul_v2(G.world_to_ui_xf, collider_res.b1);
draw_line(G.ui_cmd_buffer, a, b, thickness, color_line); draw_line(G.ui_cmd_buffer, a, b, thickness, color_line);
draw_circle(G.ui_cmd_buffer, a, radius, color_a, 10); draw_circle(G.ui_cmd_buffer, a, radius, color_a, 10);
draw_circle(G.ui_cmd_buffer, b, radius, color_b, 10); draw_circle(G.ui_cmd_buffer, b, radius, color_b, 10);
struct v2 a_clipped = xform_mul_v2(G.world_view, collider_res.a1_clipped); struct v2 a_clipped = xform_mul_v2(G.world_to_ui_xf, collider_res.a1_clipped);
struct v2 b_clipped = xform_mul_v2(G.world_view, collider_res.b1_clipped); struct v2 b_clipped = xform_mul_v2(G.world_to_ui_xf, collider_res.b1_clipped);
draw_line(G.ui_cmd_buffer, a_clipped, b_clipped, thickness, color_line_clipped); draw_line(G.ui_cmd_buffer, a_clipped, b_clipped, thickness, color_line_clipped);
draw_circle(G.ui_cmd_buffer, a_clipped, radius, color_a_clipped, 10); draw_circle(G.ui_cmd_buffer, a_clipped, radius, color_a_clipped, 10);
draw_circle(G.ui_cmd_buffer, b_clipped, radius, color_b_clipped, 10); draw_circle(G.ui_cmd_buffer, b_clipped, radius, color_b_clipped, 10);
@ -1273,7 +1273,7 @@ INTERNAL void user_update(void)
FMT_FLOAT_P(xform_get_rotation(e1_xf), 24)); FMT_FLOAT_P(xform_get_rotation(e1_xf), 24));
draw_text(G.ui_cmd_buffer, disp_font, v2_add(v2_round(xform_mul_v2(G.world_view, V2(0, 0))), V2(0, offset_px)), text); draw_text(G.ui_cmd_buffer, disp_font, v2_add(v2_round(xform_mul_v2(G.world_to_ui_xf, V2(0, 0))), V2(0, offset_px)), text);
} }
} }
#endif #endif
@ -1288,7 +1288,7 @@ INTERNAL void user_update(void)
struct v2_array m = menkowski(temp.arena, &e0_collider, &e1_collider, e0_xf, e1_xf, detail); struct v2_array m = menkowski(temp.arena, &e0_collider, &e1_collider, e0_xf, e1_xf, detail);
for (u64 i = 0; i < m.count; ++i) m.points[i] = xform_mul_v2(G.world_view, m.points[i]); for (u64 i = 0; i < m.count; ++i) m.points[i] = xform_mul_v2(G.world_to_ui_xf, m.points[i]);
draw_poly_line(G.ui_cmd_buffer, m, true, thickness, color); draw_poly_line(G.ui_cmd_buffer, m, true, thickness, color);
//draw_poly(G.ui_cmd_buffer, m, color); //draw_poly(G.ui_cmd_buffer, m, color);
} }
@ -1301,7 +1301,7 @@ INTERNAL void user_update(void)
struct v2_array m = cloud(temp.arena, &e0_collider, &e1_collider, e0_xf, e1_xf); struct v2_array m = cloud(temp.arena, &e0_collider, &e1_collider, e0_xf, e1_xf);
for (u64 i = 0; i < m.count; ++i) { for (u64 i = 0; i < m.count; ++i) {
struct v2 p = xform_mul_v2(G.world_view, m.points[i]); struct v2 p = xform_mul_v2(G.world_to_ui_xf, m.points[i]);
draw_circle(G.ui_cmd_buffer, p, radius, color, 10); draw_circle(G.ui_cmd_buffer, p, radius, color, 10);
} }
} }
@ -1312,8 +1312,8 @@ INTERNAL void user_update(void)
f32 len = 0.1f; f32 len = 0.1f;
f32 arrow_thickness = 2; f32 arrow_thickness = 2;
f32 arrow_height = 5; f32 arrow_height = 5;
struct v2 start = xform_mul_v2(G.world_view, V2(0, 0)); struct v2 start = xform_mul_v2(G.world_to_ui_xf, V2(0, 0));
struct v2 end = xform_mul_v2(G.world_view, v2_mul(v2_norm(collider_res.normal), len)); struct v2 end = xform_mul_v2(G.world_to_ui_xf, v2_mul(v2_norm(collider_res.normal), len));
draw_arrow_line(G.ui_cmd_buffer, start, end, arrow_thickness, arrow_height, color); draw_arrow_line(G.ui_cmd_buffer, start, end, arrow_thickness, arrow_height, color);
} }
@ -1326,7 +1326,7 @@ INTERNAL void user_update(void)
.points = collider_res.prototype.points, .points = collider_res.prototype.points,
.count = collider_res.prototype.len .count = collider_res.prototype.len
}; };
for (u64 i = 0; i < m.count; ++i) m.points[i] = xform_mul_v2(G.world_view, m.points[i]); for (u64 i = 0; i < m.count; ++i) m.points[i] = xform_mul_v2(G.world_to_ui_xf, m.points[i]);
draw_poly_line(G.ui_cmd_buffer, m, true, thickness, color); draw_poly_line(G.ui_cmd_buffer, m, true, thickness, color);
for (u64 i = 0; i < m.count; ++i) draw_circle(G.ui_cmd_buffer, m.points[i], 10, color, 10); for (u64 i = 0; i < m.count; ++i) draw_circle(G.ui_cmd_buffer, m.points[i], 10, color, 10);
} }
@ -1341,7 +1341,7 @@ INTERNAL void user_update(void)
struct collider_menkowski_simplex simplex = collider_res.simplex; struct collider_menkowski_simplex simplex = collider_res.simplex;
struct v2 simplex_points[] = { simplex.a.p, simplex.b.p, simplex.c.p }; struct v2 simplex_points[] = { simplex.a.p, simplex.b.p, simplex.c.p };
for (u64 i = 0; i < ARRAY_COUNT(simplex_points); ++i) simplex_points[i] = xform_mul_v2(G.world_view, simplex_points[i]); for (u64 i = 0; i < ARRAY_COUNT(simplex_points); ++i) simplex_points[i] = xform_mul_v2(G.world_to_ui_xf, simplex_points[i]);
struct v2_array simplex_array = { .count = simplex.len, .points = simplex_points }; struct v2_array simplex_array = { .count = simplex.len, .points = simplex_points };
if (simplex.len >= 1) { if (simplex.len >= 1) {
@ -1372,8 +1372,8 @@ INTERNAL void user_update(void)
f32 thickness = 2; f32 thickness = 2;
f32 arrow_height = 15; f32 arrow_height = 15;
struct v2 start = xform_mul_v2(G.world_view, xf.og); struct v2 start = xform_mul_v2(G.world_to_ui_xf, xf.og);
struct v2 end = xform_mul_v2(G.world_view, parent_xf.og); struct v2 end = xform_mul_v2(G.world_to_ui_xf, parent_xf.og);
draw_arrow_line(G.ui_cmd_buffer, start, end, thickness, arrow_height, color); draw_arrow_line(G.ui_cmd_buffer, start, end, thickness, arrow_height, color);
} }
@ -1384,7 +1384,7 @@ INTERNAL void user_update(void)
struct xform quad_xf = xform_mul(xf, ent->camera_quad_xform); struct xform quad_xf = xform_mul(xf, ent->camera_quad_xform);
struct quad quad = xform_mul_quad(quad_xf, QUAD_UNIT_SQUARE_CENTERED); struct quad quad = xform_mul_quad(quad_xf, QUAD_UNIT_SQUARE_CENTERED);
quad = xform_mul_quad(G.world_view, quad); quad = xform_mul_quad(G.world_to_ui_xf, quad);
draw_quad_line(G.ui_cmd_buffer, quad, thickness, color); draw_quad_line(G.ui_cmd_buffer, quad, thickness, color);
} }
@ -1396,7 +1396,7 @@ INTERNAL void user_update(void)
/* Draw crosshair or show cursor */ /* Draw crosshair or show cursor */
if (!G.debug_camera) { if (!G.debug_camera) {
struct v2 crosshair_pos = G.viewport_cursor; struct v2 crosshair_pos = G.ui_cursor;
u32 tint = RGBA_32_F(1, 1, 1, 1); u32 tint = RGBA_32_F(1, 1, 1, 1);
struct sprite_tag crosshair_tag = sprite_tag_from_path(STR("res/graphics/crosshair.ase")); struct sprite_tag crosshair_tag = sprite_tag_from_path(STR("res/graphics/crosshair.ase"));
@ -1407,7 +1407,7 @@ INTERNAL void user_update(void)
struct quad quad = xform_mul_quad(xf, QUAD_UNIT_SQUARE_CENTERED); struct quad quad = xform_mul_quad(xf, QUAD_UNIT_SQUARE_CENTERED);
draw_quad_texture(G.ui_cmd_buffer, DRAW_TEXTURE_PARAMS(.sprite = crosshair_tag, .tint = tint), quad); draw_quad_texture(G.ui_cmd_buffer, DRAW_TEXTURE_PARAMS(.sprite = crosshair_tag, .tint = tint), quad);
struct rect cursor_clip = RECT_FROM_V2(G.viewport_screen_offset, G.viewport_size); struct rect cursor_clip = RECT_FROM_V2(G.ui_screen_offset, G.ui_size);
cursor_clip.pos = v2_add(cursor_clip.pos, v2_mul(size, 0.5f)); cursor_clip.pos = v2_add(cursor_clip.pos, v2_mul(size, 0.5f));
cursor_clip.pos = v2_add(cursor_clip.pos, V2(1, 1)); cursor_clip.pos = v2_add(cursor_clip.pos, V2(1, 1));
cursor_clip.size = v2_sub(cursor_clip.size, size); cursor_clip.size = v2_sub(cursor_clip.size, size);
@ -1462,7 +1462,7 @@ INTERNAL void user_update(void)
} }
} }
input_move_dir = xform_basis_invert_mul_v2(G.world_view, input_move_dir); /* Make move dir relative to world view */ input_move_dir = xform_basis_invert_mul_v2(G.world_to_ui_xf, input_move_dir); /* Make move dir relative to world view */
input_move_dir = v2_mul(v2_norm(input_move_dir), move_speed); input_move_dir = v2_mul(v2_norm(input_move_dir), move_speed);
} }
struct v2 input_aim_dir = v2_sub(G.world_cursor, entity_get_xform(active_player).og); struct v2 input_aim_dir = v2_sub(G.world_cursor, entity_get_xform(active_player).og);
@ -1542,25 +1542,25 @@ INTERNAL void user_update(void)
draw_text(G.ui_cmd_buffer, font, pos, string_format(temp.arena, STR("screen_cursor: (%F, %F)"), FMT_FLOAT((f64)G.screen_cursor.x), FMT_FLOAT((f64)G.screen_cursor.y))); draw_text(G.ui_cmd_buffer, font, pos, string_format(temp.arena, STR("screen_cursor: (%F, %F)"), FMT_FLOAT((f64)G.screen_cursor.x), FMT_FLOAT((f64)G.screen_cursor.y)));
pos.y += spacing; pos.y += spacing;
draw_text(G.ui_cmd_buffer, font, pos, string_format(temp.arena, STR("viewport_screen_offset: (%F, %F)"), FMT_FLOAT((f64)G.viewport_screen_offset.x), FMT_FLOAT((f64)G.viewport_screen_offset.y))); draw_text(G.ui_cmd_buffer, font, pos, string_format(temp.arena, STR("ui_screen_offset: (%F, %F)"), FMT_FLOAT((f64)G.ui_screen_offset.x), FMT_FLOAT((f64)G.ui_screen_offset.y)));
pos.y += spacing; pos.y += spacing;
draw_text(G.ui_cmd_buffer, font, pos, string_format(temp.arena, STR("viewport_size: (%F, %F)"), FMT_FLOAT((f64)G.viewport_size.x), FMT_FLOAT((f64)G.viewport_size.y))); draw_text(G.ui_cmd_buffer, font, pos, string_format(temp.arena, STR("ui_size: (%F, %F)"), FMT_FLOAT((f64)G.ui_size.x), FMT_FLOAT((f64)G.ui_size.y)));
pos.y += spacing; pos.y += spacing;
draw_text(G.ui_cmd_buffer, font, pos, string_format(temp.arena, STR("viewport_center: (%F, %F)"), FMT_FLOAT((f64)G.viewport_center.x), FMT_FLOAT((f64)G.viewport_center.y))); draw_text(G.ui_cmd_buffer, font, pos, string_format(temp.arena, STR("ui_center: (%F, %F)"), FMT_FLOAT((f64)G.ui_center.x), FMT_FLOAT((f64)G.ui_center.y)));
pos.y += spacing; pos.y += spacing;
draw_text(G.ui_cmd_buffer, font, pos, string_format(temp.arena, STR("viewport_cursor: (%F, %F)"), FMT_FLOAT((f64)G.viewport_cursor.x), FMT_FLOAT((f64)G.viewport_cursor.y))); draw_text(G.ui_cmd_buffer, font, pos, string_format(temp.arena, STR("ui_cursor: (%F, %F)"), FMT_FLOAT((f64)G.ui_cursor.x), FMT_FLOAT((f64)G.ui_cursor.y)));
pos.y += spacing; pos.y += spacing;
draw_text(G.ui_cmd_buffer, font, pos, string_format(temp.arena, STR("world_view.og: (%F, %F)"), FMT_FLOAT((f64)G.world_view.og.x), FMT_FLOAT((f64)G.world_view.og.y))); draw_text(G.ui_cmd_buffer, font, pos, string_format(temp.arena, STR("world_to_ui_xf.og: (%F, %F)"), FMT_FLOAT((f64)G.world_to_ui_xf.og.x), FMT_FLOAT((f64)G.world_to_ui_xf.og.y)));
pos.y += spacing; pos.y += spacing;
draw_text(G.ui_cmd_buffer, font, pos, string_format(temp.arena, STR("world_view rotation: %F"), FMT_FLOAT((f64)xform_get_rotation(G.world_view)))); draw_text(G.ui_cmd_buffer, font, pos, string_format(temp.arena, STR("world_to_ui_xf rotation: %F"), FMT_FLOAT((f64)xform_get_rotation(G.world_to_ui_xf))));
pos.y += spacing; pos.y += spacing;
draw_text(G.ui_cmd_buffer, font, pos, string_format(temp.arena, STR("world_view scale: (%F, %F)"), FMT_FLOAT((f64)xform_get_scale(G.world_view).x), FMT_FLOAT((f64)xform_get_scale(G.world_view).x))); draw_text(G.ui_cmd_buffer, font, pos, string_format(temp.arena, STR("world_to_ui_xf scale: (%F, %F)"), FMT_FLOAT((f64)xform_get_scale(G.world_to_ui_xf).x), FMT_FLOAT((f64)xform_get_scale(G.world_to_ui_xf).x)));
pos.y += spacing; pos.y += spacing;
draw_text(G.ui_cmd_buffer, font, pos, string_format(temp.arena, STR("world_cursor: (%F, %F)"), FMT_FLOAT((f64)G.world_cursor.x), FMT_FLOAT((f64)G.world_cursor.y))); draw_text(G.ui_cmd_buffer, font, pos, string_format(temp.arena, STR("world_cursor: (%F, %F)"), FMT_FLOAT((f64)G.world_cursor.x), FMT_FLOAT((f64)G.world_cursor.y)));
@ -1600,11 +1600,11 @@ INTERNAL void user_update(void)
{ {
__profscope(render); __profscope(render);
struct rect target_viewport = RECT_FROM_V2(V2(0, 0), G.viewport_size); struct rect target_viewport = RECT_FROM_V2(V2(0, 0), G.ui_size);
struct rect backbuffer_viewport = RECT_FROM_V2(V2(0, 0), G.screen_size); struct rect backbuffer_viewport = RECT_FROM_V2(V2(0, 0), G.screen_size);
/* Allocate rt textures */ /* Allocate rt textures */
struct v2 ui_rt_resolution = G.viewport_size; struct v2 ui_rt_resolution = G.ui_size;
struct v2 world_rt_resolution = V2(target_viewport.width + target_viewport.x, target_viewport.height + target_viewport.y); struct v2 world_rt_resolution = V2(target_viewport.width + target_viewport.x, target_viewport.height + target_viewport.y);
{ {
/* World rt */ /* World rt */
@ -1654,7 +1654,7 @@ INTERNAL void user_update(void)
/* Draw final texture to backbuffer */ /* Draw final texture to backbuffer */
{ {
struct draw_texture_params params = DRAW_TEXTURE_PARAMS(.texture = G.final_rt); struct draw_texture_params params = DRAW_TEXTURE_PARAMS(.texture = G.final_rt);
struct quad quad = quad_from_rect(RECT_FROM_V2(G.viewport_screen_offset, G.viewport_size)); struct quad quad = quad_from_rect(RECT_FROM_V2(G.ui_screen_offset, G.ui_size));
draw_quad_texture(G.backbuffer_cmd_buffer, params, quad); draw_quad_texture(G.backbuffer_cmd_buffer, params, quad);
} }
} }
@ -1674,7 +1674,7 @@ INTERNAL void user_update(void)
renderer_clear_backbuffer(RGBA_32_F(0, 0, 0, 1)); renderer_clear_backbuffer(RGBA_32_F(0, 0, 0, 1));
/* Render to world texture */ /* Render to world texture */
renderer_render_to_texture(G.world_rt, G.world_cmd_buffer, G.world_view, target_viewport, sprite_frame_scope); renderer_render_to_texture(G.world_rt, G.world_cmd_buffer, G.world_to_ui_xf, target_viewport, sprite_frame_scope);
/* Render to UI texture */ /* Render to UI texture */
renderer_render_to_texture(G.ui_rt, G.ui_cmd_buffer, XFORM_IDENT, target_viewport, sprite_frame_scope); renderer_render_to_texture(G.ui_rt, G.ui_cmd_buffer, XFORM_IDENT, target_viewport, sprite_frame_scope);