Code archives/3D Graphics - Misc/LOD handling code

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

Download source code

LOD handling code by Rob 2002
Have fun with it.
; Lod handling code. Loads three meshes and dynamically 
; swaps between all three depending on the distance.
; Useful For games containing high polygon objects.
; (Use up/down arrow to move camera.)
;
; By Rob Cummings


Graphics3D 640,480,16,2
camera=CreateCamera()
light=CreateLight(2)
PositionEntity light,1000,1000,1000
PositionEntity camera,0,0,-20

; For the purposes of code archives, I have provided a simple function to mimic
; LoadLodMesh (createlodmesh)

;player = LoadLodMesh("lowdetail.3ds","mediumdetail.3ds","highdetail.3ds")
player = CreateLodMesh()


While Not KeyHit(1)

	If KeyDown(200) Then MoveEntity camera,0,0,1
	If KeyDown(208) Then MoveEntity camera,0,0,-1
	If KeyHit(17) Then wire=1-wire : WireFrame wire

	UpdateWorld
	updatelod(player,camera,100) ;<< disbias (last parameter) controls lod changes.
	RenderWorld
	Text 0,0,"Polycount: "+TrisRendered()
	Text 0,16,"Press W to toggle wireframe."
	Text 0,32,"Up/Down arrows to move camera."
	Flip
Wend
End


;lod "distbias" controls the amount of distance between each lod. Divide your
;camerarange by three in order to get a useful approximation, but you may want to
;use a lot less. Experiment!

Function UpdateLod(lodpivot,lodcamera,distbias#=250)
	If Not EntityInView(lodpivot,lodcamera) Return 0
	distlod#=EntityDistance(lodpivot,lodcamera)
	HideEntity lodpivot
	If distlod<1*distbias
		ShowEntity GetChild(lodpivot,1)
	ElseIf distlod<2*distbias
		ShowEntity GetChild(lodpivot,2)
	ElseIf distlod<3*distbias
		ShowEntity GetChild(lodpivot,3)
	EndIf
End Function

Function LoadLodMesh(lodfile1$,lodfile2$,lodfile3$)
	temppivot=CreatePivot()
	templod=LoadAnimMesh(lodfile3$):EntityParent templod,temppivot
	templod=LoadAnimMesh(lodfile2$):EntityParent templod,temppivot
	templod=LoadAnimMesh(lodfile1$):EntityParent templod,temppivot
	Return temppivot
End Function

Function CreateLodMesh() ; for testing purposes
	temppivot=CreatePivot()
	templod=CreateSphere(32):EntityParent templod,temppivot
	templod=CreateSphere(16):EntityParent templod,temppivot
	templod=CreateSphere(8):EntityParent templod,temppivot
	ScaleEntity temppivot,10,10,10
	Return temppivot
End Function

Comments

GQ2005
This no longer works as is in v1.88
(due to changes in showentity behavior?)
Showentity will not do anything if
the parent entity is not visible.

Function UpdateLod(lodpivot,lodcamera,distbias#=250)
If Not EntityInView(lodpivot,lodcamera) Return 0
distlod#=EntityDistance(lodpivot,lodcamera)
;HideEntity lodpivot

HideEntity GetChild(lodpivot,1)
HideEntity GetChild(lodpivot,2)
HideEntity GetChild(lodpivot,3)

If distlod<1*distbias
ShowEntity GetChild(lodpivot,1)
ElseIf distlod<2*distbias
ShowEntity GetChild(lodpivot,2)
ElseIf distlod<3*distbias
ShowEntity GetChild(lodpivot,3)
EndIf
End Function


Code Archives Forum