[bb] LOD handling code by Rob [ 1+ years ago ]

Started by BlitzBot, June 29, 2017, 00:28:43

Previous topic - Next topic

BlitzBot

Title : LOD handling code
Author : Rob
Posted : 1+ years ago

Description : Have fun with it.

Code :
Code (blitzbasic) Select
; 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 :


GQ(Posted 1+ years ago)

 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 lodpivotHideEntity 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)   EndIfEnd Function