Code archives/3D Graphics - Misc/Get 2D entity Size

This code has been declared by its author to be Public Domain code.

Download source code

Get 2D entity Size by Rob 2002
Speed up by using a polygon box proxy (only 8 checks verses num verts in mesh).
; Get 2D entity size! Rob Cummings
;
; perfect bounding box detection for entities - ideal for
; huds, cameras, and more! targetting squares... endless uses!



Global mxspd#,myspd#,campitch#,vx#,vz#,temp#
Global camera

Graphics3D 800,600,16,2
SetBuffer BackBuffer()

camera=CreateCamera()
PositionEntity camera,0,500,0
light=CreateLight()
RotateEntity light,45,45,0

; setup a small world to play within
plane=CreatePlane()
EntityColor plane,100,100,200
For i=0 To 10
	temp=CreateSphere(8)
	ScaleEntity temp,Rnd(-100,100),Rnd(-100,100),Rnd(-100,100)
	PositionEntity temp,Rnd(-500,500),Rnd(500),Rnd(-500,500)
	EntityPickMode temp,2
Next	

Color 0,255,0

;small test app
While Not KeyHit(1)
	picked=CameraPick(camera,GraphicsWidth()/2,GraphicsHeight()/2)
	freelook
	UpdateWorld
	RenderWorld
	targetbox(picked)
	Flip
Wend
End


;-------------------------------------------------------

Function targetbox(ent)
	If ent=0 Return 0
	If EntityInView(ent,camera)=0 Return 0
	CameraProject camera,EntityX(ent),EntityY(ent),EntityZ(ent)
	leftmost#=ProjectedX()
	rightmost#=ProjectedX()
	topmost#=ProjectedY()
	bottommost#=ProjectedY()
	For i=1 To CountSurfaces(ent)
		s=GetSurface(ent,1)
		For v=0 To CountVertices(s)-1
			TFormPoint VertexX(s,v),VertexY(s,v),VertexZ(s,v),ent,0
			CameraProject camera,TFormedX(),TFormedY(),TFormedZ()
			If ProjectedX()<leftmost leftmost=ProjectedX()
			If ProjectedX()>rightmost rightmost=ProjectedX()
			If ProjectedY()<topmost topmost=ProjectedY()
			If ProjectedY()>bottommost bottommost=ProjectedY()
		Next
	Next
	Rect leftmost,topmost,rightmost-leftmost,bottommost-topmost,0
End Function

;-------------------------------------------------------

Function freelook()
	mxspd#=MouseXSpeed()*0.4
	myspd#=MouseYSpeed()*0.4
	MoveMouse GraphicsWidth()/2,GraphicsHeight()/2

	campitch=campitch+myspd
	If campitch<-85 Then campitch=-85
	If campitch>85 Then campitch=85
	RotateEntity camera,campitch,EntityYaw(camera)-mxspd,0
	
	If KeyDown(203) Then vx=vx-.1
	If KeyDown(205) Then vx=vx+.1	
	If KeyDown(200) Then vz=vz+.1
	If KeyDown(208) Then vz=vz-.1
	vx=vx/1.05
	vz=vz/1.05
	MoveEntity camera,vx,vy,vz
End Function

Comments

None.

Code Archives Forum