From 78825f0c4d92266ef2f3f3e5b480f4b2a64772d5 Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Fri, 3 Oct 2014 13:52:50 -0700 Subject: [PATCH] Fix for normalization crash. --- interface/src/MetavoxelSystem.cpp | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/interface/src/MetavoxelSystem.cpp b/interface/src/MetavoxelSystem.cpp index 1e235b6116..f82fba98a0 100644 --- a/interface/src/MetavoxelSystem.cpp +++ b/interface/src/MetavoxelSystem.cpp @@ -1551,6 +1551,11 @@ public: AxisIndex(int x = -1, int y = -1, int z = -1) : x(x), y(y), z(z) { } }; +static glm::vec3 safeNormalize(const glm::vec3& vector) { + float length = glm::length(vector); + return (length > 0.0f) ? (vector / length) : vector; +} + int VoxelAugmentVisitor::visit(MetavoxelInfo& info) { if (!info.isLeaf) { return DEFAULT_ORDER; @@ -1879,7 +1884,7 @@ int VoxelAugmentVisitor::visit(MetavoxelInfo& info) { } } } - glm::vec3 normal = glm::normalize(axisNormals[0] + axisNormals[1] + axisNormals[2]); + glm::vec3 normal = safeNormalize(axisNormals[0] + axisNormals[1] + axisNormals[2]); center /= crossingCount; // use a sequence of Givens rotations to perform a QR decomposition @@ -1967,12 +1972,12 @@ int VoxelAugmentVisitor::visit(MetavoxelInfo& info) { vertices.append(point); } else { - axisNormals[0] = glm::normalize(axisNormals[0]); - axisNormals[1] = glm::normalize(axisNormals[1]); - axisNormals[2] = glm::normalize(axisNormals[2]); - glm::vec3 normalXY(glm::normalize(axisNormals[0] + axisNormals[1])); - glm::vec3 normalXZ(glm::normalize(axisNormals[0] + axisNormals[2])); - glm::vec3 normalYZ(glm::normalize(axisNormals[1] + axisNormals[2])); + axisNormals[0] = safeNormalize(axisNormals[0]); + axisNormals[1] = safeNormalize(axisNormals[1]); + axisNormals[2] = safeNormalize(axisNormals[2]); + glm::vec3 normalXY(safeNormalize(axisNormals[0] + axisNormals[1])); + glm::vec3 normalXZ(safeNormalize(axisNormals[0] + axisNormals[2])); + glm::vec3 normalYZ(safeNormalize(axisNormals[1] + axisNormals[2])); if (glm::dot(axisNormals[0], normalXY) > CREASE_COS_NORMAL && glm::dot(axisNormals[1], normalXY) > CREASE_COS_NORMAL) { point.setNormal(normalXY);