Code archives/3D Graphics - Misc/LOD handling code
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
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
| ||
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