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 *final_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_blend_tick;
@ -77,10 +77,10 @@ GLOBAL struct {
f64 dt;
struct v2 screen_size;
struct v2 screen_cursor;
struct v2 viewport_screen_offset;
struct v2 viewport_size;
struct v2 viewport_center;
struct v2 viewport_cursor;
struct v2 ui_screen_offset;
struct v2 ui_size;
struct v2 ui_center;
struct v2 ui_cursor;
struct v2 world_cursor;
} 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));
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.ui_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 arrowhead_len = 15.f;
struct v2 pos = xform_mul_v2(G.world_view, xf.og);
struct v2 x_ray = xform_basis_mul_v2(G.world_view, xform_get_right(xf));
struct v2 y_ray = xform_basis_mul_v2(G.world_view, xform_get_up(xf));
struct v2 pos = xform_mul_v2(G.world_to_ui_xf, xf.og);
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_to_ui_xf, xform_get_up(xf));
f32 ray_scale = 1;
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 v2 velocity = ent->linear_velocity;
struct v2 pos = xform_mul_v2(G.world_view, xf.og);
struct v2 vel_ray = xform_basis_mul_v2(G.world_view, velocity);
struct v2 pos = xform_mul_v2(G.world_to_ui_xf, xf.og);
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);
}
@ -642,10 +642,10 @@ INTERNAL void user_update(void)
b32 pressed = event->kind == SYS_EVENT_KIND_BUTTON_DOWN;
#if 0
b32 out_of_bounds = button >= SYS_BTN_M1 && button <= SYS_BTN_M5 &&
(G.viewport_cursor.x < 0 ||
G.viewport_cursor.y < 0 ||
G.viewport_cursor.x > G.viewport_size.x ||
G.viewport_cursor.y > G.viewport_size.y);
(G.ui_cursor.x < 0 ||
G.ui_cursor.y < 0 ||
G.ui_cursor.x > G.ui_size.x ||
G.ui_cursor.y > G.ui_size.y);
#else
b32 out_of_bounds = false;
#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) {
G.viewport_size = G.screen_size;
G.viewport_screen_offset = V2(0, 0);
G.ui_size = G.screen_size;
G.ui_screen_offset = V2(0, 0);
} else {
/* Determine viewport size by camera & window dimensions */
/* Determine ui size by camera & window dimensions */
f32 aspect_ratio = 1.0;
{
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 {
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 y = 0;
x = math_round(G.screen_size.x / 2 - width / 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.viewport_cursor = v2_sub(G.screen_cursor, G.viewport_screen_offset);
G.ui_center = v2_mul(G.ui_size, 0.5);
G.ui_cursor = v2_sub(G.screen_cursor, G.ui_screen_offset);
/* ========================== *
* Update view from 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 */
if (G.bind_states[USER_BIND_KIND_PAN].is_held) {
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;
struct v2 offset = v2_sub(G.debug_camera_pan_start, xform_invert_mul_v2(G.world_view, G.viewport_cursor));
G.world_view = xform_translated(G.world_view, v2_neg(offset));
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_to_ui_xf = xform_translated(G.world_to_ui_xf, v2_neg(offset));
G.debug_camera_pan_start = xform_invert_mul_v2(G.world_to_ui_xf, G.ui_cursor);
} else {
G.debug_camera_panning = false;
}
@ -823,10 +823,10 @@ INTERNAL void user_update(void)
/* Zoom to cursor */
f32 zoom_rate = 2;
f32 zoom = math_pow(zoom_rate, input_zooms);
struct v2 world_cursor = xform_invert_mul_v2(G.world_view, G.viewport_cursor);
G.world_view = xform_translated(G.world_view, world_cursor);
G.world_view = xform_scaled(G.world_view, V2(zoom, zoom));
G.world_view = xform_translated(G.world_view, v2_neg(world_cursor));
struct v2 world_cursor = xform_invert_mul_v2(G.world_to_ui_xf, G.ui_cursor);
G.world_to_ui_xf = xform_translated(G.world_to_ui_xf, world_cursor);
G.world_to_ui_xf = xform_scaled(G.world_to_ui_xf, V2(zoom, zoom));
G.world_to_ui_xf = xform_translated(G.world_to_ui_xf, v2_neg(world_cursor));
}
} else {
struct xform xf = entity_get_xform(active_camera);
@ -835,7 +835,7 @@ INTERNAL void user_update(void)
f32 rot = xform_get_rotation(xf);
/* 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 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);
struct trs trs = TRS(
.t = v2_sub(G.viewport_center, center),
.t = v2_sub(G.ui_center, center),
.r = rot,
.s = V2(scale, scale)
);
struct v2 pivot = center;
G.world_view = XFORM_IDENT;
G.world_view = xform_translated(G.world_view, pivot);
G.world_view = xform_translated(G.world_view, trs.t);
G.world_view = xform_rotated(G.world_view, trs.r);
G.world_view = xform_scaled(G.world_view, trs.s);
G.world_view = xform_translated(G.world_view, v2_neg(pivot));
G.world_to_ui_xf = XFORM_IDENT;
G.world_to_ui_xf = xform_translated(G.world_to_ui_xf, pivot);
G.world_to_ui_xf = xform_translated(G.world_to_ui_xf, trs.t);
G.world_to_ui_xf = xform_rotated(G.world_to_ui_xf, trs.r);
G.world_to_ui_xf = xform_scaled(G.world_to_ui_xf, trs.s);
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
@ -867,8 +867,8 @@ INTERNAL void user_update(void)
{
struct v2 up = V2(0, -1);
struct v2 listener_pos = xform_invert_mul_v2(G.world_view, G.viewport_center);
struct v2 listener_dir = v2_norm(xform_basis_invert_mul_v2(G.world_view, up));
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_to_ui_xf, up));
mixer_set_listener(listener_pos, listener_dir);
}
@ -880,11 +880,11 @@ INTERNAL void user_update(void)
f32 thickness = 2;
u32 color = RGBA_32(0x3f, 0x3f, 0x3f, 0xFF);
struct v2 offset = v2_neg(xform_mul_v2(G.world_view, V2(0, 0)));
f32 spacing = xform_get_scale(G.world_view).x;
struct v2 offset = v2_neg(xform_mul_v2(G.world_to_ui_xf, V2(0, 0)));
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 size = xform_basis_invert_mul_v2(G.world_view, G.viewport_size);
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_to_ui_xf, G.ui_size);
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_slice slice = sprite_sheet_get_slice(sheet, STR("attach.wep"), ent->animation_frame);
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);
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));
}
@ -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 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) {
struct quad quad = quad_from_rect(slice.rect);
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);
}
@ -1054,7 +1054,7 @@ INTERNAL void user_update(void)
if (slice.has_ray) {
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);
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 */
//u32 detail = 64;
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 */
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);
}
}
@ -1085,15 +1085,15 @@ INTERNAL void user_update(void)
/* Draw upwards line for circle */
struct v2 start = xf.og;
struct v2 end = collider_get_support_point(&collider, xf, v2_neg(xf.by)).p;
start = xform_mul_v2(G.world_view, start);
end = xform_mul_v2(G.world_view, end);
start = xform_mul_v2(G.world_to_ui_xf, start);
end = xform_mul_v2(G.world_to_ui_xf, end);
draw_line(G.ui_cmd_buffer, start, end, thickness, color);
}
#if 0
/* Draw support point at focus dir */
{
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);
}
#endif
@ -1126,7 +1126,7 @@ INTERNAL void user_update(void)
u32 color = RGBA_32_F(1, 1, 0, 0.50);
//struct v2 point = xform_mul_v2(e0_xf, contact.p0_local);
//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 */
{
@ -1134,8 +1134,8 @@ INTERNAL void user_update(void)
f32 len = 0.1f;
f32 arrow_thickness = 2;
f32 arrow_height = 5;
struct v2 start = xform_mul_v2(G.world_view, dbg_pt);
struct v2 end = xform_mul_v2(G.world_view, v2_add(dbg_pt, v2_mul(v2_norm(data->normal), len)));
struct v2 start = xform_mul_v2(G.world_to_ui_xf, dbg_pt);
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);
}
#if 0
@ -1166,7 +1166,7 @@ INTERNAL void user_update(void)
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
@ -1191,8 +1191,8 @@ INTERNAL void user_update(void)
{
f32 radius = 4;
u32 color = RGBA_32_F(1, 1, 0, 0.5);
struct v2 a = xform_mul_v2(G.world_view, data->closest0);
struct v2 b = xform_mul_v2(G.world_view, data->closest1);
struct v2 a = xform_mul_v2(G.world_to_ui_xf, data->closest0);
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, 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_b_clipped = RGBA_32_F(0, 1, 0, 1);
{
struct v2 a = xform_mul_v2(G.world_view, collider_res.a0);
struct v2 b = xform_mul_v2(G.world_view, collider_res.b0);
struct v2 a = xform_mul_v2(G.world_to_ui_xf, collider_res.a0);
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_circle(G.ui_cmd_buffer, a, radius, color_a, 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 b_clipped = xform_mul_v2(G.world_view, collider_res.b0_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_to_ui_xf, collider_res.b0_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, b_clipped, radius, color_b_clipped, 10);
}
{
struct v2 a = xform_mul_v2(G.world_view, collider_res.a1);
struct v2 b = xform_mul_v2(G.world_view, collider_res.b1);
struct v2 a = xform_mul_v2(G.world_to_ui_xf, collider_res.a1);
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_circle(G.ui_cmd_buffer, a, radius, color_a, 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 b_clipped = xform_mul_v2(G.world_view, collider_res.b1_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_to_ui_xf, collider_res.b1_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, 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));
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
@ -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);
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(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);
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);
}
}
@ -1312,8 +1312,8 @@ INTERNAL void user_update(void)
f32 len = 0.1f;
f32 arrow_thickness = 2;
f32 arrow_height = 5;
struct v2 start = xform_mul_v2(G.world_view, V2(0, 0));
struct v2 end = xform_mul_v2(G.world_view, v2_mul(v2_norm(collider_res.normal), len));
struct v2 start = xform_mul_v2(G.world_to_ui_xf, V2(0, 0));
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);
}
@ -1326,7 +1326,7 @@ INTERNAL void user_update(void)
.points = collider_res.prototype.points,
.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);
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 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 };
if (simplex.len >= 1) {
@ -1372,8 +1372,8 @@ INTERNAL void user_update(void)
f32 thickness = 2;
f32 arrow_height = 15;
struct v2 start = xform_mul_v2(G.world_view, xf.og);
struct v2 end = xform_mul_v2(G.world_view, parent_xf.og);
struct v2 start = xform_mul_v2(G.world_to_ui_xf, 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);
}
@ -1384,7 +1384,7 @@ INTERNAL void user_update(void)
struct xform quad_xf = xform_mul(xf, ent->camera_quad_xform);
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);
}
@ -1396,7 +1396,7 @@ INTERNAL void user_update(void)
/* Draw crosshair or show cursor */
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);
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);
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(1, 1));
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);
}
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)));
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;
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;
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;
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;
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;
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;
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;
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);
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);
/* 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);
{
/* World rt */
@ -1654,7 +1654,7 @@ INTERNAL void user_update(void)
/* Draw final texture to backbuffer */
{
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);
}
}
@ -1674,7 +1674,7 @@ INTERNAL void user_update(void)
renderer_clear_backbuffer(RGBA_32_F(0, 0, 0, 1));
/* 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 */
renderer_render_to_texture(G.ui_rt, G.ui_cmd_buffer, XFORM_IDENT, target_viewport, sprite_frame_scope);