First of all, please forgive me, as my C++ is really quite rusty. It's been... seven years or so since I've really had to use it.
I"m in the process of converting some C++ code to C# (in particular some code for checking an axis-aligned bounding box against a triangle, in 3D). The original source in question can be found here.
The particular portion that I'm having a bit of trouble is this:
#define AXISTEST_X01(a, b, fa, fb) \
p0 = a*v0[Y] - b*v0[Z]; \
p2 = a*v2[Y] - b*v2[Z]; \
if(p0<p2) {min=p0; max=p2;} else {min=p2; max=p0;} \
rad = fa * boxhalfsize[Y] + fb * boxhalfsize[Z]; \
if(min>rad || max<-rad) return 0;
Now from what I remember, I thought C++ macros were basically pre-processor bits that get substituted in at compile time. The thing I'm perplexed at is the return statement in the macro. In this case, what happens if min < rad? Does the statement still return any sort of value, or is there some sort of default return value on a macro that I'm not aware of?
Here's what the rough C# equivalent is, as far as I have been able to figure:
//Assume variables are declared/initialized properly. Unlike what I've done here...
float p0;
float p2;
Vector3 v0;
Vector3 v1;
Vector3 v2;
Vector3 boxHalfSize;
float min;
float max;
private int AXISTEST_X01(float a, float b, float fa, float fb)
{
p0 = a * v0.Y - b * v0.Z;
p2 = a * v2.Y - b * v2.Z;
if (p0 > p2)
{
min = p0;
max = p2;
}
else
{
min = p2;
max = p2;
}
float rad = fa * boxHalfSize.Y + fb * boxHalfSize.Z;
if (min > rad || max < -rad)
{
return 0;
}
//Otherwise... return something else?
return 0;
}
Any thoughts/ideas on how it should actually look? I can't say I've ever dealt much with macros, and this one has me a bit stumped.