Remove the Random() function and use a fixed table of arbitrary vectors in raycast.cpp

This also fixes issue #666.
pull/668/head
phkahler 2020-08-02 19:24:53 -04:00
parent fd2dfe87f6
commit 3c2f82b7f1
2 changed files with 8 additions and 6 deletions

View File

@ -122,10 +122,6 @@ static constexpr double LENGTH_EPS = 1e-6;
static constexpr double VERY_POSITIVE = 1e10;
static constexpr double VERY_NEGATIVE = -1e10;
inline double Random(double vmax) {
return (vmax*rand()) / RAND_MAX;
}
#include "platform/platform.h"
#include "platform/gui.h"
#include "resource.h"

View File

@ -419,6 +419,11 @@ SShell::Class SShell::ClassifyRegion(Vector edge_n, Vector inter_surf_n,
// using the closest intersection point. If the ray hits a surface on edge,
// then just reattempt in a different random direction.
//-----------------------------------------------------------------------------
// table of vectors in 6 arbitrary directions covering 4 of the 8 octants.
// use overlapping sets of 3 to reduce memory usage.
static const double Random[8] = {1.278, 5.0103, 9.427, -2.331, 7.13, 2.954, 5.034, -4.777};
bool SShell::ClassifyEdge(Class *indir, Class *outdir,
Vector ea, Vector eb,
Vector p,
@ -549,7 +554,7 @@ bool SShell::ClassifyEdge(Class *indir, Class *outdir,
// Cast a ray in a random direction (two-sided so that we test if
// the point lies on a surface, but use only one side for in/out
// testing)
Vector ray = Vector::From(Random(1), Random(1), Random(1));
Vector ray = Vector::From(Random[cnt], Random[cnt+1], Random[cnt+2]);
AllPointsIntersecting(
p.Minus(ray), p.Plus(ray), &l,
@ -598,7 +603,8 @@ bool SShell::ClassifyEdge(Class *indir, Class *outdir,
// then our ray always lies on edge, and that's okay. Otherwise
// try again in a different random direction.
if(!onEdge) break;
if(cnt++ > 5) {
cnt++;
if(cnt > 5) {
dbp("can't find a ray that doesn't hit on edge!");
dbp("on edge = %d, edge_inters = %d", onEdge, edge_inters);
SS.nakedEdges.AddEdge(ea, eb);