I'm interested by your function Jasu.
During your post I have try to convert the link but i have problem with the define function.
this is my first step of my translation to bmax code without testing.
Function FINDMINMAX(x0:Float, x1:Float, x2:Float, p_fmin:Float var, p_fmax:Float var)
p_fmin = x0
p_fmax = x0
If(x1 < p_fmin) Then p_fmin = x1
If(x1 > p_fmax) Then p_fmax = x1
If(x2 < p_fmin) Then p_fmin = x2
If(x2 > p_fmax) Then p_fmax = x2
EndFunction
Function planeBoxOverlap:Int(normal:Vector var, d:Float, maxbox:Vector var)
Local vmin:Vector = Vector.Create()
Local vmax:Vector = Vector.Create()
If(normal.x > 0.0)
vmin.x = -maxbox.x
vmax.x = maxbox.x
Else
vmin.x = maxbox.x
vmax.x = -maxbox.x
EndIf
If(normal.y > 0.0)
vmin.y = -maxbox.y
vmax.y = maxbox.y
Else
vmin.y = maxbox.y
vmax.y = -maxbox.y
EndIf
If(normal.z > 0.0)
vmin.z = -maxbox.z
vmax.z = maxbox.z
Else
vmin.z = maxbox.z
vmax.z = -maxbox.z
EndIf
If(normal.DotP(vmin) + d > 0.0) Then Return 0
If(normal.DotP(vmax) + d >= 0.0) Then Return 1
Return 0
EndFunction
'======================== X-tests ========================
'#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;
Function AXISTEST_X01:Int(a:Float, b:Float, fa:Float, fb:Float, p0:Float, p2:Float, v0:vector, v2:vector, p_fMin:Float, p_fMax:Float, boxhalfsize:Vector)
p0 = a * v0.y - b * v0.z
p2 = a * v2.y - b * v2.z
If(p0 < p2)
p_fMin = p0
p_fMax = p2
Else
p_fMin = p2
p_fMax = p0
EndIf
Local rad:Float = fa * boxhalfsize.y + fb * boxhalfsize.z
If(p_fMin > rad Or p_fMax < - rad) Then Return 0
EndFunction
'#define AXISTEST_X2(a, b, fa, fb) \
' p0 = a * v0[Y] - b * v0[Z] ; \
' p1 = a*v1[Y] - b*v1[Z]; \
' if(p0<p1) {min=p0; max=p1;} else {min=p1; max=p0;} \
' rad = fa * boxhalfsize[Y] + fb * boxhalfsize[Z]; \
' if(min>rad || max<-rad) return 0;
Function AXISTEST_X2:Int(a:Float, b:Float, fa:Float, fb:Float, p0:Float, p1:Float, v0:vector var, v1:vector var, p_fMin:Float, p_fMax:Float, boxhalfsize:vector var)
p0 = a * v0.y - b * v0.z
p1 = a * v1.y - b * v1.z
If(p0 < p1)
p_fMin = p0
p_fMax = p1
Else
p_fMin = p1
p_fMax = p0
EndIf
Local rad:Float = fa * boxhalfsize.y + fb * boxhalfsize.z
If(p_fMin > rad Or p_fMax < - rad) Return 0
EndFunction
'======================== Y-tests ========================
'#define AXISTEST_Y02(a, b, fa, fb) \
' p0 = -a*v0[X] + b*v0[Z]; \
' p2 = -a*v2[X] + b*v2[Z]; \
' if(p0<p2) {min=p0; max=p2;} else {min=p2; max=p0;} \
' rad = fa * boxhalfsize[X] + fb * boxhalfsize[Z]; \
' if(min>rad || max<-rad) return 0;
Function AXISTEST_Y02:Int(a:Float, b:Float, fa:Float, fb:Float, p0:Float, p2:Float, v0:vector var, v2:vector var, p_fMin:Float, p_fMax:Float, boxhalfsize:vector var)
p0 = -a * v0.x + b * v0.z
p2 = -a * v2.x + b * v2.z
If(p0 < p2)
p_fMin = p0
p_fMax = p2
Else
p_fMin = p2
p_fMax = p0
EndIf
Local rad:Float = fa * boxhalfsize.x + fb * boxhalfsize.z
If(p_fMin > rad Or p_fMax < - rad) Return 0
EndFunction
'#define AXISTEST_Y1(a, b, fa, fb) \
' p0 = -a*v0[X] + b*v0[Z]; \
' p1 = -a*v1[X] + b*v1[Z]; \
' if(p0<p1) {min=p0; max=p1;} else {min=p1; max=p0;} \
' rad = fa * boxhalfsize[X] + fb * boxhalfsize[Z]; \
' if(min>rad || max<-rad) return 0;
Function AXISTEST_Y1:Int(a:Float, b:Float, fa:Float, fb:Float, p0:Float, p1:Float, v0:vector var, v1:vector var, p_fMin:Float, p_fMax:Float, boxhalfsize:vector var)
p0 = -a * v0.x + b * v0.z
p1 = -a * v1.x + b * v1.z
If(p0 < p1)
p_fMin = p0
p_fMax = p1
Else
p_fMin = p1
p_fMax = p0
EndIf
Local rad:Float = fa * boxhalfsize.x + fb * boxhalfsize.z
If(p_fMin > rad Or p_fMax < - rad) Then Return 0
EndFunction
'======================== Z-tests ========================
'#define AXISTEST_Z12(a, b, fa, fb) \
' p1 = a*v1[X] - b*v1[Y]; \
' p2 = a*v2[X] - b*v2[Y]; \
' if(p2<p1) {min=p2; max=p1;} else {min=p1; max=p2;} \
' rad = fa * boxhalfsize[X] + fb * boxhalfsize[Y]; \
' if(min>rad || max<-rad) return 0;
Function AXISTEST_Z12:Int(a:Float, b:Float, fa:Float, fb:Float, p1:Float, p2:Float, v1:vector var, v2:vector var, p_fMin:Float, p_fMax:Float, boxhalfsize:vector var)
p1 = a * v1.x - b * v1.y
p2 = a * v2.x - b * v2.y
If(p2 < p1)
p_fMin = p2
p_fMax = p1
Else
p_fMin = p1
p_fMax = p2
EndIf
Local rad:Float = fa * boxhalfsize.x + fb * boxhalfsize.y
If(p_fMin > rad Or p_fMax < - rad) Then Return 0
EndFunction
'#define AXISTEST_Z0(a, b, fa, fb) \
' p0 = a*v0[X] - b*v0[Y]; \
' p1 = a*v1[X] - b*v1[Y]; \
' if(p0<p1) {min=p0; max=p1;} else {min=p1; max=p0;} \
' rad = fa * boxhalfsize[X] + fb * boxhalfsize[Y]; \
' if(min>rad || max<-rad) return 0;
Function AXISTEST_Z0:Int(a:Float, b:Float, fa:Float, fb:Float, p0:Float, p1:Float, v0:vector var, v1:vector var, p_fMin:Float, p_fMax:Float, boxhalfsize:vector var)
p0 = a * v0.x - b * v0.y
p1 = a * v1.x - b * v1.y
If(p0 < p1)
p_fMin = p0
p_fMax = p1
Else
p_fMin = p1
p_fMax = p0
EndIf
local rad:Float = fa * boxhalfsize.x + fb * boxhalfsize.y
If(p_fMin > rad Or p_fMax < - rad) Then Return 0
EndFunction
Function isTriangleBoxOverlap(p_vBoxcenter:Vector, p_vBoxHalfSize:Vector, p_v0:Vector, p_v1:Vector, p_v2:Vector)
' use separating axis theorem To test overlap between triangle And box
' need to test for overlap in these directions:
' 1) the {x,y,z}-directions (actually, since we use the AABB of the triangle
' we do not even need to test these)
' 2) normal of the triangle
' 3) crossproduct(edge from tri, {x,y,z}-directin)
' this gives 3x3=9 more tests
Local l_v0:Vector = Vector.Create()
Local l_v1:Vector = Vector.Create()
Local l_v2:Vector = Vector.Create()
Local l_fMin:Float
Local l_fMax:Float
Local d:Float
Local p0:Float
Local p1:Float
Local p2:Float
Local fex:Float
Local fey:Float
Local fez:Float
Local normal:Vector = Vector.Create()
Local e0:Vector = Vector.Create()
Local e1:Vector = Vector.Create()
Local e2:Vector = Vector.Create()
' This is the fastest branch on Sun
' move everything so that the boxcenter is in (0,0,0)
l_v0 = p_v0.Sub(p_vboxcenter)
l_v1 = p_v1.Sub(p_vboxcenter)
l_v2 = p_v2.Sub(p_vboxcenter)
'compute triangle edges
e0 = l_v1.sub(l_v0) ' tri edge 0
e1 = l_v2.sub(l_v1) ' tri edge 1
e2 = l_v0.sub(l_v2) 'tri edge 2
' Bullet 3: '
' test the 9 tests first (this was faster)
fex = Abs(e0.x)
fey = Abs(e0.y)
fez = Abs(e0.z)
AXISTEST_X01(e0.z, e0.y, fez, fey, p0, p2, l_v0, l_v2, l_fMin, l_fMax, p_vBoxHalfSize)
AXISTEST_Y02(e0.z, e0.x, fez, fex, p0, p2, l_v0, l_v2, l_fMin, l_fMax, p_vBoxHalfSize)
AXISTEST_Z12(e0.y, e0.x, fey, fex, p1, p2, l_v1, l_v2, l_fMin, l_fMax, p_vBoxHalfSize)
fex = Abs(e1.x)
fey = Abs(e1.y)
fez = Abs(e1.z)
AXISTEST_X01(e1.z, e1.y, fez, fey, p0, p2, l_v0, l_v2, l_fMin, l_fMax, p_vBoxHalfSize)
AXISTEST_Y02(e1.z, e1.x, fez, fex, p0, p2, l_v0, l_v2, l_fMin, l_fMax, p_vBoxHalfSize)
AXISTEST_Z0(e1.y, e1.X, fey, fex, p0, p1, l_v0, l_v1, l_fMin, l_fMax, p_vBoxHalfSize)
fex = Abs(e2.X)
fey = Abs(e2.Y)
fez = Abs(e2.Z)
AXISTEST_X2(e2.z, e2.y, fez, fey, p0, p1, l_v0, l_v1, l_fMin, l_fMax, p_vBoxHalfSize)
AXISTEST_Y1(e2.z, e2.x, fez, fex, p0, p1, l_v0, l_v1, l_fMin, l_fMax, p_vBoxHalfSize)
AXISTEST_Z12(e2.y, e2.x, fey, fex, p1, p2, l_v1, l_v2, l_fMin, l_fMax, p_vBoxHalfSize)
' Bullet 1:
' first test overlap in the {x,y,z}-directions
' find min, max of the triangle each direction, and test for overlap in
' that direction -- this is equivalent to testing a minimal AABB around
' the triangle against the AABB
' test in X-direction
FINDMINMAX(l_v0.x, l_v1.X, l_v2.X, l_fMin, l_fMax) ;
If(l_fMin > p_vBoxhalfsize.x Or l_fMax < - p_vBoxhalfsize.x) Then Return 0
' test in Y-direction
FINDMINMAX(l_v0.y, l_v1.y, l_v2.y, l_fMin, l_fMax) ;
If(l_fMin > p_vBoxhalfsize.y Or l_fMax < - p_vBoxhalfsize.y) Then Return 0
' test in Z-direction
FINDMINMAX(l_v0.z, l_v1.z, l_v2.z, l_fMin, l_fMax) ;
If(l_fMin > p_vBoxhalfsize.z Or l_fMax < - p_vBoxhalfsize.z) Then Return 0
' Bullet 2:
' test if the box intersects the plane of the triangle
' compute plane equation of triangle: normal*x+d=0
normal = e0.CrossP(e1)
d = -normal.DotP(l_v0) ' plane eq: normal.x+d=0
If(planeBoxOverlap(normal, d, p_vBoxhalfsize) = False) Then Return 0
Return 1 ' box and triangle overlaps
End Function
here the vector class
http://www.blitzmax.com/codearcs/codearcs.php?code=1550