summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/xas/spatial.h4
-rw-r--r--src/spatial.c37
2 files changed, 20 insertions, 21 deletions
diff --git a/include/xas/spatial.h b/include/xas/spatial.h
index e888f7b..6ad2675 100644
--- a/include/xas/spatial.h
+++ b/include/xas/spatial.h
@@ -13,8 +13,8 @@ typedef struct _xas_spatial_coord {
} xas_spatial_coord;
typedef struct _xas_spatial_cone {
- xas_spatial_coord coord,
- rotation;
+ xas_spatial_coord apex,
+ base;
float angle;
} xas_spatial_cone;
diff --git a/src/spatial.c b/src/spatial.c
index 791c6f9..4a93fdd 100644
--- a/src/spatial.c
+++ b/src/spatial.c
@@ -78,14 +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;
+ xas_spatial_coord apex_to_x_vect,
+ axis_vect;
- float cosf_angle = cosf(cone.angle / 2.0f);
+ int is_infinite;
- diff(&apex_to_x, cone.coord, coord);
+ diff(&apex_to_x_vect, cone.apex, coord);
+ diff(&axis_vect, cone.apex, cone.base);
- return dotf(apex_to_x, cone.rotation) / magnf(apex_to_x) / magnf(cone.rotation)
- > cosf_angle;
+ is_infinite = dotf(apex_to_x_vect, axis_vect)
+ / magnf(apex_to_x_vect)
+ / magnf(axis_vect) > cosf(cone.angle / 2.0f);
+
+ if (!is_infinite) {
+ return 0;
+ }
+
+ return dotf(apex_to_x_vect, axis_vect) / magnf(axis_vect) < magnf(axis_vect);
}
static int buffer_realloc(xas_spatial_scene *scene,
@@ -177,22 +186,12 @@ ssize_t scene_fill(xas_spatial_scene *scene,
int16_t *dest = (int16_t *)(scene->buffer + 1);
xas_spatial_cone cone_l = {
- .coord = scene->speaker_l,
- .rotation = {
- .x = 0.0f,
- .y = 0.5f * M_PI,
- .z = 0.0f
- },
-
+ .apex = scene->speaker_l,
+ .base = { scene->speaker_l.x - 20.0f, scene->speaker_l.y, scene->speaker_l.z },
.angle = M_PI / 4.0f
}, cone_r = {
- .coord = scene->speaker_r,
- .rotation = {
- .x = 0.0f,
- .y = 1.5f * M_PI,
- .z = 0.0f
- },
-
+ .apex = scene->speaker_r,
+ .base = { scene->speaker_r.x + 20.0f, scene->speaker_r.y, scene->speaker_r.z },
.angle = M_PI / 4.0f
};