Files
Legacy-Projects/BlitzBasic/Blitz3D/Level of Detail/LevelOfDetail.bb
T
2014-11-24 18:18:24 +01:00

164 lines
6.2 KiB
BlitzBasic

Global LoD_Dist_Lv0# = 32, LoD_Dist_Lv1# = 64, LoD_Dist_Lv2# = 128, LoD_Dist_Lv3# = 256, LoD_Dist_Lv4# = 512
Global LoD_Range# = 8
Type LoDEntity
Field Pivot% = 0
; Levels
Field LoDs%[5]
; Temporary Values
Field Visible%[5]
Field Fade#[5]
End Type
Function LoD_Initialize(Dist_Range# = 8, Dist_Lv0# = 32, Dist_Lv1# = 64, Dist_Lv2# = 128, Dist_Lv3# = 256, Dist_Lv4# = 512)
LoD_Range = Dist_Range
; Distance Limits
LoD_Dist_Lv0 = Dist_Lv0
LoD_Dist_Lv1 = Dist_Lv1
LoD_Dist_Lv2 = Dist_Lv2
LoD_Dist_Lv3 = Dist_Lv3
LoD_Dist_Lv4 = Dist_Lv4
End Function
Function LoD_Create.LoDEntity(Lv0, Lv1, Lv2, Lv3, Lv4)
Local tInstance.LoDEntity = New LoDEntity
tInstance\Pivot = CreatePivot()
; Copy Entities
tInstance\LoDs[0] = CopyEntity(Lv0, tInstance\Pivot):HideEntity tInstance\LoDs[0]
tInstance\LoDs[1] = CopyEntity(Lv1, tInstance\Pivot):HideEntity tInstance\LoDs[1]
tInstance\LoDs[2] = CopyEntity(Lv2, tInstance\Pivot):HideEntity tInstance\LoDs[2]
tInstance\LoDs[3] = CopyEntity(Lv3, tInstance\Pivot):HideEntity tInstance\LoDs[3]
tInstance\LoDs[4] = CopyEntity(Lv4, tInstance\Pivot):HideEntity tInstance\LoDs[4]
Return tInstance
End Function
Function LoD_EntityAlpha(tInstance.LoDEntity, Alpha#, Level=-1)
If (Level = -1) Then
EntityAlpha tInstance\LoDs[0], Alpha
EntityAlpha tInstance\LoDs[1], Alpha
EntityAlpha tInstance\LoDs[2], Alpha
EntityAlpha tInstance\LoDs[3], Alpha
EntityAlpha tInstance\LoDs[4], Alpha
Else
EntityAlpha tInstance\LoDs[Level], Alpha
EndIf
End Function
Function LoD_EntityBlend(tInstance.LoDEntity, Mode%, Level=-1)
If (Level = -1) Then
EntityBlend tInstance\LoDs[0], Mode
EntityBlend tInstance\LoDs[1], Mode
EntityBlend tInstance\LoDs[2], Mode
EntityBlend tInstance\LoDs[3], Mode
EntityBlend tInstance\LoDs[4], Mode
Else
EntityBlend tInstance\LoDs[Level], Mode
EndIf
End Function
Function LoD_EntityColor(tInstance.LoDEntity, Red#, Green#, Blue#, Level=-1)
If (Level = -1) Then
EntityColor tInstance\LoDs[0], Red, Green, Blue
EntityColor tInstance\LoDs[1], Red, Green, Blue
EntityColor tInstance\LoDs[2], Red, Green, Blue
EntityColor tInstance\LoDs[3], Red, Green, Blue
EntityColor tInstance\LoDs[4], Red, Green, Blue
Else
EntityColor tInstance\LoDs[Level], Red, Green, Blue
EndIf
End Function
Function LoD_EntityFX(tInstance.LoDEntity, FX%, Level=-1)
If (Level = -1) Then
EntityFX tInstance\LoDs[0], FX
EntityFX tInstance\LoDs[1], FX
EntityFX tInstance\LoDs[2], FX
EntityFX tInstance\LoDs[3], FX
EntityFX tInstance\LoDs[4], FX
Else
EntityFX tInstance\LoDs[Level], FX
EndIf
End Function
Function LoD_EntityShininess(tInstance.LoDEntity, Shininess#, Level=-1)
If (Level = -1) Then
EntityShininess tInstance\LoDs[0], Shininess
EntityShininess tInstance\LoDs[1], Shininess
EntityShininess tInstance\LoDs[2], Shininess
EntityShininess tInstance\LoDs[3], Shininess
EntityShininess tInstance\LoDs[4], Shininess
Else
EntityShininess tInstance\LoDs[Level], Shininess
EndIf
End Function
Function LoD_EntityTexture(tInstance.LoDEntity, Texture%, Frame%=0, Index%=0, Level=-1)
If (Level = -1) Then
EntityTexture tInstance\LoDs[0], Texture, Frame, Index
EntityTexture tInstance\LoDs[1], Texture, Frame, Index
EntityTexture tInstance\LoDs[2], Texture, Frame, Index
EntityTexture tInstance\LoDs[3], Texture, Frame, Index
EntityTexture tInstance\LoDs[4], Texture, Frame, Index
Else
EntityTexture tInstance\LoDs[Level], Texture, Frame, Index
EndIf
End Function
Function LoD_EntityLoD(tInstance.LoDEntity)
For Level = 0 To 4
If (tInstance\Visible[Level]) Then Return Level
Next
Return 5
End Function
Function LoD_Update(eCamera, bDoFadeOut=False)
For tInstance.LoDEntity = Each LoDEntity
Local Dist# = EntityDistance(eCamera, tInstance\Pivot)
; LoD Level 1 (Very High)
If (Dist > 0) And ((bDoFadeOut And (Dist < LoD_Dist_Lv0 + LoD_Range)) Or (bDoFadeOut = False And (Dist < LoD_Dist_Lv0))) Then
If tInstance\Visible[0] = False Then tInstance\Visible[0] = True:ShowEntity tInstance\LoDs[0]
If bDoFadeOut = True And (Dist > LoD_Dist_Lv0) Then EntityAlpha tInstance\LoDs[0], 1.0 - (Dist - LoD_Dist_Lv0) / LoD_Range
Else
If tInstance\Visible[0] = True Then tInstance\Visible[0] = False:HideEntity tInstance\LoDs[0]
EndIf
; LoD Level 2 (High)
If (Dist > LoD_Dist_Lv0) And ((bDoFadeOut And (Dist < LoD_Dist_Lv1 + LoD_Range)) Or (bDoFadeOut = False And (Dist < LoD_Dist_Lv1))) Then
If tInstance\Visible[1] = False Then tInstance\Visible[1] = True:ShowEntity tInstance\LoDs[1]
If bDoFadeOut = True And (Dist > LoD_Dist_Lv1) Then EntityAlpha tInstance\LoDs[1], 1.0 - (Dist - LoD_Dist_Lv1) / LoD_Range
Else
If tInstance\Visible[1] = True Then tInstance\Visible[1] = False:HideEntity tInstance\LoDs[1]
EndIf
; LoD Level 3 (Normal)
If (Dist > LoD_Dist_Lv1) And ((bDoFadeOut And (Dist < LoD_Dist_Lv2 + LoD_Range)) Or (bDoFadeOut = False And (Dist < LoD_Dist_Lv2))) Then
If tInstance\Visible[2] = False Then tInstance\Visible[2] = True:ShowEntity tInstance\LoDs[2]
If bDoFadeOut = True And (Dist > LoD_Dist_Lv2) Then EntityAlpha tInstance\LoDs[2], 1.0 - (Dist - LoD_Dist_Lv2) / LoD_Range
Else
If tInstance\Visible[2] = True Then tInstance\Visible[2] = False:HideEntity tInstance\LoDs[2]
EndIf
; LoD Level 4 (Low)
If (Dist > LoD_Dist_Lv2) And ((bDoFadeOut And (Dist < LoD_Dist_Lv3 + LoD_Range)) Or (bDoFadeOut = False And (Dist < LoD_Dist_Lv3))) Then
If tInstance\Visible[3] = False Then tInstance\Visible[3] = True:ShowEntity tInstance\LoDs[3]
If bDoFadeOut = True And (Dist > LoD_Dist_Lv3) Then EntityAlpha tInstance\LoDs[3], 1.0 - (Dist - LoD_Dist_Lv3) / LoD_Range
Else
If tInstance\Visible[3] = True Then tInstance\Visible[3] = False:HideEntity tInstance\LoDs[3]
EndIf
; LoD Level 5 (Very Low) (Usually a Sprite)
If (Dist > LoD_Dist_Lv3) And ((bDoFadeOut And (Dist < LoD_Dist_Lv4 + LoD_Range)) Or (bDoFadeOut = False And (Dist < LoD_Dist_Lv4))) Then
If tInstance\Visible[4] = False Then tInstance\Visible[4] = True:ShowEntity tInstance\LoDs[4]
If bDoFadeOut = True And (Dist > LoD_Dist_Lv4) Then EntityAlpha tInstance\LoDs[4], 1.0 - (Dist - LoD_Dist_Lv4) / LoD_Range
Else
If tInstance\Visible[4] = True Then tInstance\Visible[4] = False:HideEntity tInstance\LoDs[4]
EndIf
Next
End Function