Type TBox

	Field mini#[3]
	Field maxi#[3]
	
	' MiniB3D functions
	
	' Extra - offers extra functionality that Blitz3D does not
	
	Function CreateFromTri:TBox(v0:TVector,v1:TVector,v2:TVector)
	
		Local box:TBox=New TBox

		box.mini[0]=1000000;box.mini[1]=1000000;box.mini[2]=1000000
		box.maxi[0]=-1000000;box.maxi[1]=-1000000;box.maxi[2]=-1000000

		If v0.x<box.mini[0] Then box.mini[0]=v0.x
		If v0.y<box.mini[1] Then box.mini[1]=v0.y
		If v0.z<box.mini[2] Then box.mini[2]=v0.z

		If v1.x<box.mini[0] Then box.mini[0]=v1.x
		If v1.y<box.mini[1] Then box.mini[1]=v1.y
		If v1.z<box.mini[2] Then box.mini[2]=v1.z
		
		If v2.x<box.mini[0] Then box.mini[0]=v2.x
		If v2.y<box.mini[1] Then box.mini[1]=v2.y
		If v2.z<box.mini[2] Then box.mini[2]=v2.z

		If v0.x>box.maxi[0] Then box.maxi[0]=v0.x
		If v0.y>box.maxi[1] Then box.maxi[1]=v0.y
		If v0.z>box.maxi[2] Then box.maxi[2]=v0.z

		If v1.x>box.maxi[0] Then box.maxi[0]=v1.x
		If v1.y>box.maxi[1] Then box.maxi[1]=v1.y
		If v1.z>box.maxi[2] Then box.maxi[2]=v1.z
		
		If v2.x>box.maxi[0] Then box.maxi[0]=v2.x
		If v2.y>box.maxi[1] Then box.maxi[1]=v2.y
		If v2.z>box.maxi[2] Then box.maxi[2]=v2.z
		
		Return box
	
	End Function
	
	Function TBoxTBoxIntersection(a:TBox,b:TBox)

		If a.maxi[0]<b.mini[0] Or a.mini[0]>b.maxi[0] Return 0
		If a.maxi[1]<b.mini[1] Or a.mini[1]>b.maxi[1] Return 0
		If a.maxi[2]<b.mini[2] Or a.mini[2]>b.maxi[2] Return 0
		
		Return True

	End Function
	
	Function SphereTBoxIntersection(s:TSphere,a:TBox)
	
		Local sx#=s.c.x#
		Local sy#=s.c.y#
		Local sz#=s.c.z#
		Local sr#=s.r#
		Local bx#=a.mini#[0]
		Local by#=a.mini#[1]
		Local bz#=a.mini#[2]
		Local bw#=a.maxi#[0]-bx#
		Local bh#=a.maxi#[1]-by#
		Local bd#=a.maxi#[2]-bz#
	
		Local dmin#=0
		Local sr2#=sr*sr
		
		' x axis
		If sx < bx
	
			dmin=dmin+((sx-bx)*(sx-bx))
			
		Else If sx>(bx+bw)
	
			dmin=dmin+(((sx-(bx+bw)))*((sx-(bx+bw))))
	
		EndIf
	
		' y axis
		If sy < by
	
			dmin=dmin+((sy-by)*(sy-by))
			
		Else If sy>(by+bh)
	
			dmin=dmin+(((sy-(by+bh)))*((sy-(by+bh))))
	
		EndIf
	
		' z axis
		If sz < bz
	
			dmin=dmin+((sz-bz)*(sz-bz))
	
		Else If sz>(bz+bd)
	
			dmin=dmin+(((sz-(bz+bd)))*((sz-(bz+bd))))
	
		EndIf
	
		If dmin#<=sr2# Then Return True Else Return False
	
	End Function

End Type
