metamarch
int metamarch(int &index, string filename, vector &p0, vector &p1, float displace_bound)
Takes the ray defined by p0 and p1 and partitions it into zero or more sub-intervals where each interval intersects a cluster of metaballs from filename. The interval may not actually intersect any metaballs, but will provide fairly tight bounds on the cluster.
This allows a ray-marching algorithm to “skip” uninteresting areas and only focus on marching through areas where metaballs might be found.
The first time you call the function, use index=-1 and set p0 and p1 to the endpoints of the ray. If the function finds an interval, it returns 1 and sets p0 and p1 to the endpoints of the interval and increments index. Otherwise it returns 0 and doesn’t alter the arguments.
So, you can repeatedly call the function with variables for the index, index, and index arguments to ray-march through areas of interest, skipping the dead space:
int index;vector p0, p1;// Initialize input valuesindex = -1;p0 = Eye; p1 = P;result = 0;while (metamarch(index, metaball_file, p0, p1, displace_bound)){result += ray_march(metaball_file, p0, p1);}