From b87df0764dfe36e3ecd9fa1c3c105758c8c28e05 Mon Sep 17 00:00:00 2001 From: XANTRONIX Development Date: Tue, 22 Feb 2022 23:01:33 -0500 Subject: Use cone rotation, not point of base, for vectors --- src/spatial.c | 38 +++++++++++++++++++++++--------------- 1 file changed, 23 insertions(+), 15 deletions(-) (limited to 'src') diff --git a/src/spatial.c b/src/spatial.c index 9885418..654ef0b 100644 --- a/src/spatial.c +++ b/src/spatial.c @@ -78,15 +78,23 @@ static void rotate(xas_spatial_coord rotation, static int within_cone(xas_spatial_coord coord, xas_spatial_cone cone) { - xas_spatial_coord apex_to_x_vect, - axis_vect; - - diff(&apex_to_x_vect, cone.apex, coord); - diff(&axis_vect, cone.apex, cone.base); - - return dotf(apex_to_x_vect, axis_vect) - / magnf(apex_to_x_vect) - / magnf(axis_vect) > cosf(cone.angle / 2.0f); + xas_spatial_coord apex_to_point_vect, + axis_vect, + rotated = cone.apex, + opposite = { + .x = cone.rotation.x * -2.0f, + .y = cone.rotation.y * -2.0f, + .z = cone.rotation.z * -2.0f + }; + + rotate(opposite, &rotated); + + diff(&apex_to_point_vect, cone.apex, coord); + diff(&axis_vect, cone.apex, rotated); + + return dotf(apex_to_point_vect, axis_vect) + / magnf(apex_to_point_vect) + / magnf(axis_vect) <= cosf(cone.angle / 2.0f); } static int buffer_realloc(xas_spatial_scene *scene, @@ -178,13 +186,13 @@ ssize_t scene_fill(xas_spatial_scene *scene, int16_t *dest = (int16_t *)(scene->buffer + 1); xas_spatial_cone cone_l = { - .apex = scene->speaker_l, - .base = { scene->speaker_l.x - 20.0f, scene->speaker_l.y, scene->speaker_l.z }, - .angle = M_PI / 4.0f + .apex = scene->speaker_l, + .rotation = { 0.0f, M_PI * 1.5f, 0.0f }, + .angle = M_PI / 4.0f }, cone_r = { - .apex = scene->speaker_r, - .base = { scene->speaker_r.x + 20.0f, scene->speaker_r.y, scene->speaker_r.z }, - .angle = M_PI / 4.0f + .apex = scene->speaker_r, + .rotation = { 0.0f, M_PI * 0.5f, 0.0f }, + .angle = M_PI / 4.0f }; buffer_zero(buffer, count); -- cgit v1.2.3