aboutsummaryrefslogtreecommitdiff
path: root/dep/g3dlite/source/MeshAlg.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'dep/g3dlite/source/MeshAlg.cpp')
-rw-r--r--dep/g3dlite/source/MeshAlg.cpp98
1 files changed, 51 insertions, 47 deletions
diff --git a/dep/g3dlite/source/MeshAlg.cpp b/dep/g3dlite/source/MeshAlg.cpp
index 626fed92920..75dee727464 100644
--- a/dep/g3dlite/source/MeshAlg.cpp
+++ b/dep/g3dlite/source/MeshAlg.cpp
@@ -50,7 +50,7 @@ void MeshAlg::generateGrid(
texCoord.append(t);
- if (height.notNull()) {
+ if (height) {
v.y = height->nearest(v.x * (height->width() - 1), v.z * (height->height() - 1)).value;
}
if (spaceCentered) {
@@ -253,7 +253,7 @@ void MeshAlg::identifyBackfaces(
backface.resize(faceArray.size());
- if (fuzzyEq(HP.w, 0.0)) {
+ if (fuzzyEq(HP.w, 0.0f)) {
// Infinite case
for (int f = faceArray.size() - 1; f >= 0; --f) {
const MeshAlg::Face& face = faceArray[f];
@@ -294,7 +294,7 @@ void MeshAlg::identifyBackfaces(
backface.resize(faceArray.size());
- if (fuzzyEq(HP.w, 0.0)) {
+ if (fuzzyEq(HP.w, 0.0f)) {
// Infinite case
for (int f = faceArray.size() - 1; f >= 0; --f) {
const Vector3& N = faceNormals[f];
@@ -417,6 +417,7 @@ void MeshAlg::computeBounds(
AABox& box,
Sphere& sphere) {
+ // Makes a copy so as to re-use the existing computebounds code
Array<Vector3> newArray;
newArray.resize(indexArray.size());
for (int i = 0; i < indexArray.size(); ++i) {
@@ -441,54 +442,54 @@ void MeshAlg::computeBounds(
const Vector3& vertex = vertexArray[v];
if (vertex.x < xmin.x) {
- xmin = vertex;
+ xmin = vertex;
}
if (vertex.x > xmax.x) {
- xmax = vertex;
+ xmax = vertex;
}
if (vertex.y < ymin.y) {
- ymin = vertex;
+ ymin = vertex;
}
if (vertex.y > ymax.y) {
- ymax = vertex;
+ ymax = vertex;
}
if (vertex.z < zmin.z) {
- zmin = vertex;
+ zmin = vertex;
}
if (vertex.z > zmax.z) {
- zmax = vertex;
+ zmax = vertex;
}
- }
+ }
// Set points dia1 & dia2 to the maximally separated pair
Vector3 dia1 = xmin;
Vector3 dia2 = xmax;
{
// Set xspan = distance between the 2 points xmin & xmax (squared)
- double xspan = (xmax - xmin).squaredMagnitude();
+ float xspan = (xmax - xmin).squaredMagnitude();
// Same for y & z spans
- double yspan = (ymax - ymin).squaredMagnitude();
- double zspan = (zmax - zmin).squaredMagnitude();
+ float yspan = (ymax - ymin).squaredMagnitude();
+ float zspan = (zmax - zmin).squaredMagnitude();
- double maxspan = xspan;
+ float maxspan = xspan;
if (yspan > maxspan) {
- maxspan = yspan;
- dia1 = ymin;
+ maxspan = yspan;
+ dia1 = ymin;
dia2 = ymax;
- }
+ }
if (zspan > maxspan) {
maxspan = zspan;
- dia1 = zmin;
+ dia1 = zmin;
dia2 = zmax;
- }
+ }
}
@@ -500,52 +501,52 @@ void MeshAlg::computeBounds(
// calculate initial radius^2 and radius
Vector3 d = dia2 - sphere.center;
- double radSq = d.squaredMagnitude();
- double rad = sqrt(radSq);
+ float radSq = d.squaredMagnitude();
+ float rad = sqrt(radSq);
// SECOND PASS: increment current sphere
- double old_to_p, old_to_new;
+ float old_to_p, old_to_new;
for (int v = 0; v < vertexArray.size(); ++v) {
const Vector3& vertex = vertexArray[v];
d = vertex - center;
- double old_to_p_sq = d.squaredMagnitude();
+ float old_to_p_sq = d.squaredMagnitude();
- // do r^2 test first
+ // do r^2 test first
if (old_to_p_sq > radSq) {
- // this point is outside of current sphere
- old_to_p = sqrt(old_to_p_sq);
+ // this point is outside of current sphere
+ old_to_p = sqrt(old_to_p_sq);
- // calc radius of new sphere
- rad = (rad + old_to_p) / 2.0;
+ // calc radius of new sphere
+ rad = (rad + old_to_p) / 2.0f;
// for next r^2 compare
- radSq = rad * rad;
- old_to_new = old_to_p - rad;
+ radSq = rad * rad;
+ old_to_new = old_to_p - rad;
- // calc center of new sphere
+ // calc center of new sphere
center = (rad * center + old_to_new * vertex) / old_to_p;
- }
- }
+ }
+ }
- const Vector3 min(xmin.x, ymin.y, zmin.z);
- const Vector3 max(xmax.x, ymax.y, zmax.z);
+ const Vector3 min(xmin.x, ymin.y, zmin.z);
+ const Vector3 max(xmax.x, ymax.y, zmax.z);
- box = AABox(min, max);
+ box = AABox(min, max);
- const float boxRadSq = (max - min).squaredMagnitude() * 0.25f;
+ const float boxRadSq = (max - min).squaredMagnitude() * 0.25f;
- if (boxRadSq >= radSq){
- if (isNaN(center.x) || ! isFinite(rad)) {
- sphere = Sphere(Vector3::zero(), finf());
- } else {
- sphere = Sphere(center, rad);
- }
- } else {
- sphere = Sphere((max + min) * 0.5f, sqrt(boxRadSq));
- }
+ if (boxRadSq >= radSq){
+ if (isNaN(center.x) || ! isFinite(rad)) {
+ sphere = Sphere(Vector3::zero(), finf());
+ } else {
+ sphere = Sphere(center, rad);
+ }
+ } else {
+ sphere = Sphere((max + min) * 0.5f, sqrt(boxRadSq));
+ }
}
void MeshAlg::computeTangentSpaceBasis(
@@ -600,7 +601,10 @@ void MeshAlg::computeTangentSpaceBasis(
float r = te1.x * te2.y - te1.y * te2.x;
if (r == 0.0) {
// degenerate case
- Vector3::generateOrthonormalBasis(t, b, n, true);
+ if (! n.isFinite() || n.isZero()) {
+ n = Vector3::unitY();
+ }
+ n.getTangents(t, b);
} else {
r = 1.0f / r;
t = (te2.y * ve1 - te1.y * ve2) * r;