'''
''' A class to handle entity lighting.
'''
Public Class Lighting
Shared LightingColorTexture As Texture2D = TextureManager.GetTexture("SkyDomeResource\LightingColors")
Shared FogColorTexture As Texture2D = TextureManager.GetTexture("SkyDomeResource\FogColors")
#Region "Methods"
Public Shared Function GetEnvironmentColor(TextureType As Integer) As Vector3 '0 = Directional light, 1 = Ambient light, 2 = Fog color
Dim ColorTexture As Texture2D
Dim EnvironmentColor As Vector3 = Nothing
Dim x As Integer = 0
Dim y As Integer = 0
Select Case TextureType
Case 0
x = Screen.Level.DayTime - 1
If x >= 0 AndAlso x <= 3 Then
ColorTexture = LightingColorTexture
Dim ColorData(0) As Color
ColorTexture.GetData(0, New Rectangle(x, 0, 1, 1), ColorData, 0, 1)
Dim DarkOrBrightData(0) As Color
ColorTexture.GetData(0, New Rectangle(x, 1, 1, 1), DarkOrBrightData, 0, 1)
EnvironmentColor = ColorData(0).ToVector3
If DarkOrBrightData(0) = Color.Black Then
EnvironmentColor = New Vector3(0.0F) - EnvironmentColor
End If
Else
EnvironmentColor = New Vector3(0.0F)
End If
Case 1
x = Screen.Level.DayTime - 1
If x >= 0 AndAlso x <= 3 Then
ColorTexture = LightingColorTexture
Dim ColorData(0) As Color
ColorTexture.GetData(0, New Rectangle(x, 2, 1, 1), ColorData, 0, 1)
Dim DarkOrBrightData(0) As Color
ColorTexture.GetData(0, New Rectangle(x, 3, 1, 1), DarkOrBrightData, 0, 1)
EnvironmentColor = ColorData(0).ToVector3
If DarkOrBrightData(0) = Color.Black Then
EnvironmentColor = New Vector3(0.0F) - EnvironmentColor
End If
Else
EnvironmentColor = New Vector3(0.0F)
End If
Case 2
ColorTexture = FogColorTexture
Select Case Screen.Level.EnvironmentType
Case 0
x = Screen.Level.DayTime - 1
If x > 2 Then
x = 0
y += 1
End If
Case 1
x = 1
y = 1
Case 2
x = 2
y = 1
Case 3
x = 0
y = 2
Case 4
x = 1
y = 2
Case 5
x = 2
y = 2
End Select
Dim ColorData(0) As Color
ColorTexture.GetData(0, New Rectangle(x, y, 1, 1), ColorData, 0, 1)
EnvironmentColor = ColorData(0).ToVector3
End Select
Return EnvironmentColor
End Function
'''
''' Updates the lighting values of a BasicEffect instance.
'''
''' A reference to the BasicEffect that should receive the lighting update.
''' Checks, if the lighting update on the effect should be forced.
Public Shared Sub UpdateLighting(ByRef refEffect As BasicEffect, Optional ByVal ForceLighting As Boolean = False)
If Core.GameOptions.LightingEnabled = True OrElse ForceLighting = True Then ' Only update the lighting if either the currently loaded level instance allows this, or it's getting forced.
' Set default parameters:
refEffect.LightingEnabled = True ' Enable lighting (gets disabled later, if not used)
refEffect.PreferPerPixelLighting = True ' Yes. Please.
refEffect.SpecularPower = 2000.0F
' LightType results:
' 0 = Night
' 1 = Morning
' 2 = Day
' 3 = Evening
' Anything higher than 3 = No Lighting
Select Case GetLightingType()
Case 0 ' Night
refEffect.AmbientLightColor = GetEnvironmentColor(1)
refEffect.DirectionalLight0.DiffuseColor = GetEnvironmentColor(0)
refEffect.DirectionalLight0.Direction = Vector3.Normalize(New Vector3(1.0F, 1.0F, -1.0F))
refEffect.DirectionalLight0.SpecularColor = New Vector3(0.0F)
refEffect.DirectionalLight0.Enabled = True
Case 1 ' Morning
refEffect.AmbientLightColor = GetEnvironmentColor(1)
refEffect.DirectionalLight0.DiffuseColor = GetEnvironmentColor(0)
refEffect.DirectionalLight0.Direction = Vector3.Normalize(New Vector3(-1.0F, 0.0F, 1.0F))
refEffect.DirectionalLight0.SpecularColor = New Vector3(0.0F)
refEffect.DirectionalLight0.Enabled = True
Case 2 ' Day
refEffect.AmbientLightColor = GetEnvironmentColor(1)
refEffect.DirectionalLight0.DiffuseColor = GetEnvironmentColor(0)
refEffect.DirectionalLight0.Direction = Vector3.Normalize(New Vector3(-1.0F, 0.0F, 1.0F))
refEffect.DirectionalLight0.SpecularColor = New Vector3(0.0F)
refEffect.DirectionalLight0.Enabled = True
Case 3 ' Evening
refEffect.AmbientLightColor = GetEnvironmentColor(1)
refEffect.DirectionalLight0.DiffuseColor = GetEnvironmentColor(0)
refEffect.DirectionalLight0.Direction = Vector3.Normalize(New Vector3(1.0F, 1.0F, -1.0F))
refEffect.DirectionalLight0.SpecularColor = New Vector3(0.0F)
refEffect.DirectionalLight0.Enabled = True
Case Else 'Disable lighting on the effect
refEffect.LightingEnabled = False
End Select
Else
' Disable lighting if the effect isn't supposed to have light.
refEffect.LightingEnabled = False
End If
End Sub
'''
''' Updates the lighting values of a BasicEffect instance.
'''
''' A reference to the BasicEffect that should receive the lighting update.
''' Checks, if the lighting update on the effect should be forced.
Public Shared Sub UpdateLighting(ByRef refEffect As BasicEffectWithAlphaTest, Optional ByVal ForceLighting As Boolean = False)
If Core.GameOptions.LightingEnabled = True OrElse ForceLighting = True Then ' Only update the lighting if either the currently loaded level instance allows this, or it's getting forced.
' Set default parameters:
refEffect.LightingEnabled = True ' Enable lighting (gets disabled later, if not used)
refEffect.PreferPerPixelLighting = True ' Yes. Please.
refEffect.SpecularPower = 2000.0F
' LightType results:
' 0 = Night
' 1 = Morning
' 2 = Day
' 3 = Evening
' Anything higher than 3 = No Lighting
Select Case GetLightingType()
Case 0 ' Night
refEffect.AmbientLightColor = GetEnvironmentColor(1)
refEffect.DirectionalLight0.DiffuseColor = GetEnvironmentColor(0)
refEffect.DirectionalLight0.Direction = Vector3.Normalize(New Vector3(1.0F, 1.0F, -1.0F))
refEffect.DirectionalLight0.SpecularColor = New Vector3(0.0F)
refEffect.DirectionalLight0.Enabled = True
Case 1 ' Morning
refEffect.AmbientLightColor = GetEnvironmentColor(1)
refEffect.DirectionalLight0.DiffuseColor = GetEnvironmentColor(0)
refEffect.DirectionalLight0.Direction = Vector3.Normalize(New Vector3(-1.0F, 0.0F, 1.0F))
refEffect.DirectionalLight0.SpecularColor = New Vector3(0.0F)
refEffect.DirectionalLight0.Enabled = True
Case 2 ' Day
refEffect.AmbientLightColor = GetEnvironmentColor(1)
refEffect.DirectionalLight0.DiffuseColor = GetEnvironmentColor(0)
refEffect.DirectionalLight0.Direction = Vector3.Normalize(New Vector3(-1.0F, 0.0F, 1.0F))
refEffect.DirectionalLight0.SpecularColor = New Vector3(0.0F)
refEffect.DirectionalLight0.Enabled = True
Case 3 ' Evening
refEffect.AmbientLightColor = GetEnvironmentColor(1)
refEffect.DirectionalLight0.DiffuseColor = GetEnvironmentColor(0)
refEffect.DirectionalLight0.Direction = Vector3.Normalize(New Vector3(1.0F, 1.0F, -1.0F))
refEffect.DirectionalLight0.SpecularColor = New Vector3(0.0F)
refEffect.DirectionalLight0.Enabled = True
Case Else 'Disable lighting on the effect
refEffect.LightingEnabled = False
End Select
Else
' Disable lighting if the effect isn't supposed to have light.
refEffect.LightingEnabled = False
End If
End Sub
Public Shared Function GetLightingType() As Integer
Dim LightType As Integer = CInt(World.GetTime()) ' Determine default lighting type by the world time.
' Level's lighttype values:
' 0 = Get lighting from the current time of day.
' 1 = Disable lighting
' 2 = Always Night
' 3 = Always Morning
' 4 = Always Day
' 5 = Always Evening
If Screen.Level.EnvironmentType = World.EnvironmentTypes.Outside Then
Select Case Screen.Level.DayTime
Case 1
LightType = 0
Case 2
LightType = 1
Case 3
LightType = 2
Case 4
LightType = 3
End Select
End If
If Screen.Level.LightingType = 1 Then ' If the level lighting type is 1, disable lighting (set index to 99).
LightType = 99
End If
If Screen.Level.LightingType > 1 And Screen.Level.LightingType < 6 Then ' If the level's lighting type is 2, 3, 4 or 5, set to the respective LightType (set time of day).
LightType = Screen.Level.LightingType - 2
End If
If Screen.Level.LightingType = 6 AndAlso Screen.Level.EnvironmentType = 1 OrElse Screen.Level.LightingType > 6 Then
LightType = 99
End If
Return LightType
End Function
#End Region
End Class