From 03df93851b28afc31ab0875c4d8c8ca5a09cb039 Mon Sep 17 00:00:00 2001 From: Eric Wasylishen Date: Tue, 19 Apr 2016 19:33:49 -0600 Subject: [PATCH] light: phong shading: handle some sources of nan's --- light/light.cc | 10 +++++++--- light/ltface.c | 7 +++++++ 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/light/light.cc b/light/light.cc index cbe6122d..34318761 100644 --- a/light/light.cc +++ b/light/light.cc @@ -311,10 +311,14 @@ FindModelInfo(const bsp2_t *bsp, const char *lmscaleoverride) selfshadowlist = selfshadowmodels; } +/* return 0 if either vector is zero-length */ static float AngleBetweenVectors(const vec3_t d1, const vec3_t d2) { - float cosangle = DotProduct(d1, d2)/(VectorLength(d1)*VectorLength(d2)); + float length_product = (VectorLength(d1)*VectorLength(d2)); + if (length_product == 0) + return 0; + float cosangle = DotProduct(d1, d2)/length_product; if (cosangle < -1) cosangle = -1; if (cosangle > 1) cosangle = 1; @@ -385,8 +389,8 @@ Face_Normal(const bsp2_t *bsp, const bsp2_dface_t *f, vec3_t norm) const vec_t *GetSurfaceVertexNormal(const bsp2_t *bsp, const bsp2_dface_t *f, const int vertindex) { - const auto &face_normals_vector = vertex_normals[f]; - return face_normals_vector[vertindex].v; + const auto &face_normals_vector = vertex_normals.at(f); + return face_normals_vector.at(vertindex).v; } static bool diff --git a/light/ltface.c b/light/ltface.c index 392a3a4b..b33224ad 100644 --- a/light/ltface.c +++ b/light/ltface.c @@ -547,6 +547,13 @@ static void CalcPointNormal(const bsp2_t *bsp, const bsp2_dface_t *face, plane_t CalcBarycentric(pointOnPlane, v1, v2, v3, barry); + if (!isfinite(barry[0]) + || !isfinite(barry[1]) + || !isfinite(barry[2])) { + VectorCopy(surfplane.normal, norm); + return; + } + v1 = GetSurfaceVertexNormal(bsp, face, 0); v2 = GetSurfaceVertexNormal(bsp, face, best-1); v3 = GetSurfaceVertexNormal(bsp, face, best);