Code archives/Algorithms/Starfox's LOD Mesh System
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
| This LOD Mesh system supports multiple camera's and unlimited amounts of lod | |||||
;Lod(Level Of Detail) Mesh System By Starfox (aka David Dawkins)
;What is an Lod mesh?
;A mesh that changes when you get closer or farther to the mesh, it is
;sufficent when you have lots of this meshes displayed.
;This system support unlimited levels of lod
;and unlimited number of cameras
;Put the meshes in order from most detail to least detail
;Only one thing is required if you use this system: credit
;Have fun
;The Types
Type lodmesh
Field piv,tparts,cloc
Field curpart,active
End Type
Type lodpart
Field mesh,nrange,par
Field frange,index
End Type
Type lodcam
Field cam
End Type
;Functions For Camera's
Function ActivateLodCamera(cam)
l.lodcam = New lodcam
l\cam = cam
End Function
Function DeactivateLodCamera(cam)
For l.lodcam = Each lodcam
If l\cam = cam Then Delete l : Exit
Next
End Function
;Lod Mesh Functions
Function CreateLodMesh()
l.lodmesh = New lodmesh
l\piv = CreatePivot()
l\active = 1
Return l\piv
End Function
Function AddToLodMesh.lodpart(entity,lodpiv,nrang,frang,index)
For l.lodmesh = Each lodmesh
If l\piv = lodpiv
lo.lodpart = New lodpart
lo\par = l\piv
lo\mesh = entity
lo\nrange = nrang : lo\frange = frang
lo\index = index
EntityParent lo\mesh,lo\par,0
l\tparts = l\tparts + 1
If l\curpart > 0
HideEntity l\curpart
EndIf
ShowEntity lo\mesh
l\curpart = lo\mesh
Return lo
EndIf
Next
End Function
Function ToggleLodActivation(lodpiv)
For l.lodmesh = Each lodmesh
If l\piv = lodpiv
l\active = 1 - l\active
Exit
EndIf
Next
End Function
Function UpdateLod()
For l.lodcam = Each lodcam
For lv.lodmesh = Each lodmesh
If lv\active = 1
If lv\cloc = 0
lv\cloc = l\cam
EndIf
If EntityDistance(l\cam,lv\piv) < EntityDistance(lv\piv,lv\cloc)
lv\cloc = l\cam
EndIf
EndIf
Next
Next
For l.lodcam = Each lodcam
For lv.lodmesh = Each lodmesh
If lv\active = 1
If lv\cloc = l\cam
dist = EntityDistance(lv\cloc,lv\piv)
For lm.lodpart = Each lodpart
If lm\par = lv\piv
If dist => lm\nrange And dist <= lm\frange
If lv\curpart <> lm\mesh
HideEntity lv\curpart
ShowEntity lm\mesh
lv\curpart = lm\mesh
EndIf
EndIf
If dist >= lm\nrange
If lm\index = lv\tparts
If lv\curpart <> lm\mesh
HideEntity lv\curpart
ShowEntity lm\mesh
lv\curpart = lm\mesh
EndIf
EndIf
EndIf
EndIf
Next
lv\cloc = 0
EndIf
ElseIf lv\active = 0
For lm.lodpart = Each lodpart
If lm\par = lv\piv
If lm\index = 1
If lv\curpart <> lm\mesh
HideEntity lv\curpart
ShowEntity lm\mesh
lv\curpart = lm\mesh
EndIf
EndIf
lv\cloc = 0
EndIf
Next
EndIf
Next
Next
End Function
;Example
Graphics3D 640,480
light = CreateLight() : TurnEntity light,45,45,0
SetBuffer FrontBuffer()
Print "Loading"
SetBuffer BackBuffer()
cam = CreateCamera()
CameraViewport cam,0,0,640,480/2-1
cam2 = CreateCamera()
CameraViewport cam2,0,480/2+1,640,480/2-1
MoveEntity cam,0,0,-100
MoveEntity cam2,-2000,0,100
CameraRange cam,1,5000
CameraRange cam2,1,5000
Local lodon = 1
Local ship[8]
For e = 1 To 8
ship[e] = LoadMesh("tran0"+e+".x")
RotateMesh ship[e],0,180,0
FitMesh ship[e],-1.5,-1,-3,3,2,6
ScaleEntity ship[e],20,20,20
Next
;Activate Both Cameras
activatelodcamera(cam)
activatelodcamera(cam2)
;Create the actuall lodmesh
piv = createlodmesh()
;Add all models to lodmesh and set boundries
addtolodmesh(ship[1],piv,0,200,1)
addtolodmesh(ship[2],piv,201,400,2)
addtolodmesh(ship[3],piv,401,600,3)
addtolodmesh(ship[4],piv,601,800,4)
addtolodmesh(ship[5],piv,801,1000,5)
addtolodmesh(ship[6],piv,1001,1200,6)
addtolodmesh(ship[7],piv,1201,1400,7)
addtolodmesh(ship[8],piv,1401,1600,8)
;Make sure none of them overlap
PositionEntity piv,3000,0,0 : TurnEntity piv,0,90,0
While Not KeyHit(1)
PointEntity cam,piv
PointEntity cam2,piv
MoveEntity piv,0,0,5
;Update LOD
updatelod()
UpdateWorld
RenderWorld
Text 0,0,"Tris:"+TrisRendered()
Text 640/2,480/2,"Starfox's Dynamic LOD System",1,1
If lodon = 1 Then lodt$ = "On"
If lodon = 0 Then lodt$ = "Off"
Text 640/2,480/2+10,"Space To Toggle LOD: "+lodt,1,1
If KeyHit(57)
togglelodactivation(piv)
lodon = 1 - lodon
EndIf
Flip
Wend
End |
Comments
None.
Code Archives Forum