summaryrefslogtreecommitdiff
path: root/src/sars.c
diff options
context:
space:
mode:
authorVito Caputo <vcaputo@pengaru.com>2022-10-10 19:16:21 -0700
committerVito Caputo <vcaputo@pengaru.com>2022-10-10 19:33:40 -0700
commit8feec5ee3ba551859d787f077d797bc1b19d4dc2 (patch)
treeabde1ce7da1a0215dce95d1f6e16e21b680b1df6 /src/sars.c
parent26f569299d6769cff6edf024c68df83732715392 (diff)
sars: add ndc->bpc conversion helpers
bpc = boxed projection coordinates, this basically comes from eon just like the pillar/letter boxing code for fullscreen stuff did. Previously I didn't need this part of that code, but the touch coordinates are in ndc and those need to get transformed by the projection transform's inverse.
Diffstat (limited to 'src/sars.c')
-rw-r--r--src/sars.c40
1 files changed, 40 insertions, 0 deletions
diff --git a/src/sars.c b/src/sars.c
index 488d459..dc35383 100644
--- a/src/sars.c
+++ b/src/sars.c
@@ -110,6 +110,44 @@ void sars_viewport_from_ndc(sars_t *sars, float x, float y, int *res_x, int *res
}
+void sars_ndc_to_bpc(sars_t *sars, float x, float y, float *res_x, float *res_y)
+{
+ v3f_t coord = { .x = x, .y = y}, res;
+
+ res = m4f_mult_v3f(&sars->projection_x_inv, &coord);
+
+ /* it's not particularly useful to return coordinates outside the projection,
+ * rather than having everything using this function have to clamp or otherwise
+ * handle the result within these bounds, just do it here. Callers wanting to
+ * work with coordinates outside the projection arguably shouldn't be going through
+ * this transformation in the first place; they're clearly interested
+ * in viewport/screen-space or canvas-space coordinates, not projection coordinates.
+ */
+
+ if (res.x > 1.f)
+ res.x = 1.f;
+ else if (res.x < -1.f)
+ res.x = -1.f;
+
+ if (res.y > 1.f)
+ res.y = 1.f;
+ else if (res.y < -1.f)
+ res.y = -1.f;
+
+ *res_x = res.x;
+ *res_y = res.y;
+}
+
+
+void sars_viewport_to_bpc(sars_t *sars, int x, int y, float *res_x, float *res_y)
+{
+ v3f_t coord = {};
+
+ sars_viewport_to_ndc(sars, x, y, &coord.x, &coord.y);
+ sars_ndc_to_bpc(sars, coord.x, coord.y, res_x, res_y);
+}
+
+
uint32_t sars_viewport_id(sars_t *sars)
{
return SDL_GetWindowID(sars->window);
@@ -149,6 +187,8 @@ static void sars_update_projection_x(sars_t *sars)
sars->projection_x = m4f_identity();
else
sars->projection_x = sars_boxed_projection_x(sars);
+
+ sars->projection_x_inv = m4f_invert(&sars->projection_x);
}
© All Rights Reserved