VisibleEntityRadius()

Blitz3D Forums/Blitz3D Programming/VisibleEntityRadius()

Well, since I grew up with B2d, I was always able to tell exactly what the collidable objects looks like, but in B3d, they are but instead invisible sphere's in the spherical collision mode.

Since I liked knowing exactly when the objects would collide in B2d, I recently started work on my VisibleEntityRadius() function that'll throw in a visible collision sphere for your objects......

Problem is, I'm doin this at high school durin' lunch, so I only have access to the demo version, so I cant make it work with the ellipsoid stuff yet.....

Well, here's the code so far :

<See the updated form of the code below>


Only thing I'm unsure so far is the way I'm resizin' the visible radius, is it fine as it is, or is there something I should touch up on?

Also, on B3d v1.66 here, when I move my sphere directly right into the other sphere, then let go, and press either up or down, the sphere disappears into thin air leavin a NAN for its co-ords....anyone getting this in the latest version?

Other than that, I cant seem to find any other problems with it, and since it seems to work...I'm kinda proud of myself...I aint usually too good at doing these things on my own :-/

It's seems very useful Thanks Genexi2

Hi,

I don't see the bug you're talking about here, I have v1.85 here. But about the way you're resizing the radius, there's one problem with it. That's that you're using an Integer instead of a Float. That means that you can't have a radius of 0.5, it'll be rounded up to 1. Just add a '#' to the 'radius' varible where you declare your function and that should fix it. Other than that it's a pretty useful function, thanks. Now you just need to do VisibleEntityBox :)

Todd, I already noticed the float thing there, already I've added alot more, and its more of a library now than a single function. :-/

Here's the example code :
;----------------------------------;
;VisibleRadius Library Function Ex.;
;----------------------------------;

Graphics3D 640,480,0,2


cam = CreateCamera()
light = CreateLight()

Global sphere2radius# = 4

CameraViewport cam, 0,0,640,480


; 1 of 2 little spheres to test the collisions on
sphere = CreateSphere()
EntityColor sphere, 255,0,0
EntityType sphere, 2 
UpdateNormals sphere
PositionEntity sphere, 5,0,10


; 2 of 2 little spheres to test the collisions on
sphere2 = CreateSphere()
EntityColor sphere2, 0,255,0
EntityType sphere2, 2 
UpdateNormals sphere2
PositionEntity sphere2, -5,0,10


; our type to hold the visible EntityRadius's
Type VisRad
	Field sphere, radius#
End Type	

;Create our visible EntityRadius's
VisRadius(sphere,  3)
VisRadius(sphere2, sphere2radius)

; Set the collisions to slide
Collisions 2,2,1,2

While Not KeyHit(1)
Flip
Cls


;Sphere2 and Camera movement lines
If KeyDown(205)
	TranslateEntity sphere2, 0.2,0,0
ElseIf KeyDown(203)
	TranslateEntity sphere2, -0.2,0,0
EndIf	

If KeyDown(200)
	TranslateEntity sphere2, 0,0.2,0
ElseIf KeyDown(208)
	TranslateEntity sphere2, 0,-0.2,0		
EndIf

If KeyDown(32)
	TranslateEntity cam, 0.2,0,0
ElseIf KeyDown(30)
	TranslateEntity cam, -0.2,0,0
EndIf	

If KeyDown(17)
	TranslateEntity cam, 0,0.2,0
ElseIf KeyDown(31)
	TranslateEntity cam, 0,-0.2,0		
EndIf

If KeyHit(16)
	HideAllVisRadius()
ElseIf KeyHit(18)
	ShowAllVisRadius()
EndIf	

If KeyDown(12)
	sphere2radius = sphere2radius - 0.05
	
	ChangeVisRadius(sphere, sphere2radius)
ElseIf KeyDown(13)
	sphere2radius = sphere2radius + 0.05
	
	ChangeVisRadius(sphere, sphere2radius)
EndIf 	
	
If KeyHit(2)
	HideVisRadius(sphere)
ElseIf KeyHit(3)
	ShowVisRadius(sphere)
EndIf 

If KeyHit(41)
	WireFrame (-WireFrame + 1)
EndIf	 			

UpdateWorld
RenderWorld

Text 0,0, "Press Up\Down\Left\Right Arrow Keys to move the green sphere"
Text 0,15, "Or WASD to move the camera"

Text 0,30, "Q to hide all, E to show all"
Text 300,60, "EntityRadius of Sphere2 (red sphere) : " +ReturnVisRadius(sphere2)

Wend
End

Include "visrad.bb"


And the library :
;-------------------------;
;  VisibleRadius Library  ;
;-------------------------;
;  Author : Genexi2       ;
;-------------------------;
;Use this however ya like,;
; no need to gimmy credit ;
;       either            ;
;-------------------------;


Function VisRadius#(theobject, radius#)
	EntityRadius theobject, radius

	v.visrad = New visrad

	v.visrad\sphere = CreateSphere(16,theobject)
	v.visrad\radius = radius
	EntityColor v.visrad\sphere , 190,190,255
	

	EntityAlpha v.visrad\sphere , 0.5
	ScaleEntity v.visrad\sphere, radius, radius, radius 
	UpdateNormals v.visrad\sphere
End Function


Function ShowVisRadius(theobject)
	For v.visrad = Each visrad
		If GetParent(v.visrad\sphere) = theobject
			ShowEntity v.visrad\sphere
		EndIf
	Next	  
End Function


Function HideVisRadius(theobject)
	For v.visrad = Each visrad
		If GetParent(v.visrad\sphere) = theobject
			HideEntity v.visrad\sphere
			Exit
		EndIf
	Next	
End Function


Function ShowAllVisRadius()
	For v.visrad= Each visrad
		ShowEntity v.visrad\sphere 
	Next	
End Function


Function HideAllVisRadius()
	For v.visrad= Each visrad
		HideEntity v.visrad\sphere 
	Next
End Function


Function ChangeVisRadius(theobject, radius#)
	For v.visrad = Each visrad
		If GetParent(v.visrad\sphere) = theobject
			EntityRadius theobject, radius
			
			ScaleEntity v.visrad\sphere, -v.visrad\radius, -v.visrad\radius, -v.visrad\radius
			ScaleEntity v.visrad\sphere, radius, radius, radius
			
			v.visrad\radius = radius
			Exit
		EndIf
	Next
End Function


Function ReturnVisRadius(theobject)
	For v.visrad = Each visrad
		If GetParent(v.visrad\sphere) = theobject
			Return v.visrad\radius
			Exit
		EndIf
	Next
End Function


Currently I'm seeming to have a problem with returning the correct size of the entity's radius using the "Return" command in my ReturnVisRadius() function.....

Looks good, but the problem with ReturnVisRadius() is that it's returning an Integer. Add the '#' sign to the end of the function, so it looks like this:
Function ReturnVisRadius#(theobject)...

You have to specify the type to return if it's not an integer, the same goes for strings.