From 7715310afe244d74744de16add9520726ee1e339 Mon Sep 17 00:00:00 2001 From: Eric Wasylishen Date: Thu, 19 May 2016 22:02:45 -0600 Subject: [PATCH] common: add AllocWindingEdges, FreeWindingEdges, PointInWindingEdges --- common/polylib.c | 50 ++++++++++++++++++++++++++++++++++++++++ include/common/polylib.h | 9 ++++++++ 2 files changed, 59 insertions(+) diff --git a/common/polylib.c b/common/polylib.c index 91b32de0..4125ab0a 100644 --- a/common/polylib.c +++ b/common/polylib.c @@ -503,3 +503,53 @@ winding_t *WindingFromFace (const bsp2_t *bsp, const bsp2_dface_t *f) return w; } + +winding_edges_t * +AllocWindingEdges(const winding_t *w) +{ + plane_t p; + WindingPlane(w, p.normal, &p.dist); + + winding_edges_t *result = (winding_edges_t *) calloc(1, sizeof(winding_edges_t)); + result->numedges = w->numpoints; + result->planes = (plane_t *) calloc(w->numpoints, sizeof(plane_t)); + + for (int i=0; inumpoints; i++) + { + plane_t *dest = &result->planes[i]; + + const vec_t *v0 = w->p[i]; + const vec_t *v1 = w->p[(i+1)%w->numpoints]; + + vec3_t edgevec; + VectorSubtract(v1, v0, edgevec); + VectorNormalize(edgevec); + + CrossProduct(edgevec, p.normal, dest->normal); + dest->dist = DotProduct(dest->normal, v0); + } + + return result; +} + +void +FreeWindingEdges(winding_edges_t *wi) +{ + free(wi->planes); + free(wi); +} + +bool +PointInWindingEdges(const winding_edges_t *wi, const vec3_t point) +{ + for (int i=0; inumedges; i++) + { + /* faces toward the center of the face */ + const plane_t *edgeplane = &wi->planes[i]; + + vec_t dist = DotProduct(point, edgeplane->normal) - edgeplane->dist; + if (dist < 0) + return false; + } + return true; +} diff --git a/include/common/polylib.h b/include/common/polylib.h index 43962af5..c34375d2 100644 --- a/include/common/polylib.h +++ b/include/common/polylib.h @@ -15,6 +15,11 @@ typedef struct { vec3_t p[4]; /* variable sized */ } winding_t; +typedef struct { + int numedges; + plane_t *planes; +} winding_edges_t; + #define MAX_POINTS_ON_WINDING 64 #define ON_EPSILON 0.1 @@ -35,6 +40,10 @@ typedef void (*save_winding_fn_t)(winding_t *w); void DiceWinding (winding_t *w, vec_t subdiv, save_winding_fn_t save_fn); winding_t *WindingFromFace (const bsp2_t *bsp, const bsp2_dface_t *f); + +winding_edges_t *AllocWindingEdges(const winding_t *w); +void FreeWindingEdges(winding_edges_t *wi); +bool PointInWindingEdges(const winding_edges_t *wi, const vec3_t point); #ifdef __cplusplus }