Skip to content

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 values
index = -1;
p0 = Eye; p1 = P;
result = 0;
while (metamarch(index, metaball_file, p0, p1, displace_bound))
{
result += ray_march(metaball_file, p0, p1);
}