diff --git a/P3D/Content/SkyDomeResource/FogColors.png b/P3D/Content/SkyDomeResource/FogColors.png new file mode 100644 index 000000000..d6cc72a4b Binary files /dev/null and b/P3D/Content/SkyDomeResource/FogColors.png differ diff --git a/P3D/Content/SkyDomeResource/Inside.png b/P3D/Content/SkyDomeResource/Inside.png new file mode 100644 index 000000000..cf41e904b Binary files /dev/null and b/P3D/Content/SkyDomeResource/Inside.png differ diff --git a/P3D/Content/SkyDomeResource/LightingColors.png b/P3D/Content/SkyDomeResource/LightingColors.png new file mode 100644 index 000000000..e9c553186 Binary files /dev/null and b/P3D/Content/SkyDomeResource/LightingColors.png differ diff --git a/P3D/P3D.vbproj b/P3D/P3D.vbproj index e735b6fd1..1f97f6d0c 100644 --- a/P3D/P3D.vbproj +++ b/P3D/P3D.vbproj @@ -14095,6 +14095,15 @@ PreserveNewest + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + PreserveNewest diff --git a/P3D/World/Lighting.vb b/P3D/World/Lighting.vb index cb43e1143..cd5b382bc 100644 --- a/P3D/World/Lighting.vb +++ b/P3D/World/Lighting.vb @@ -3,28 +3,84 @@ ''' Public Class Lighting -#Region "Enums" - -#End Region - -#Region "Fields and Constants" - -#End Region - -#Region "Properties" - -#End Region - -#Region "Delegates" - -#End Region - -#Region "Constructors" - -#End Region + 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 = GetLightingType() + 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. ''' @@ -38,39 +94,39 @@ Public Class Lighting refEffect.SpecularPower = 2000.0F ' LightType results: - ' 0 = Night - ' 1 = Morning - ' 2 = Day + ' 0 = Day + ' 1 = Night + ' 2 = Morning ' 3 = Evening ' Anything higher than 3 = No Lighting Select Case GetLightingType() - Case 0 ' Night - refEffect.AmbientLightColor = New Vector3(0.8F) + Case 0 ' Day + refEffect.AmbientLightColor = GetEnvironmentColor(1) - refEffect.DirectionalLight0.DiffuseColor = New Vector3(-0.2F) + 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 1 ' Morning - refEffect.AmbientLightColor = New Vector3(0.8F) + Case 1 ' Night + refEffect.AmbientLightColor = GetEnvironmentColor(1) - refEffect.DirectionalLight0.DiffuseColor = New Vector3(-0.45F) - refEffect.DirectionalLight0.Direction = Vector3.Normalize(New Vector3(1.0F, -1.0F, -1.0F)) + 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 2 ' Day - refEffect.AmbientLightColor = New Vector3(1.0F) + Case 2 ' Morning + refEffect.AmbientLightColor = GetEnvironmentColor(1) - refEffect.DirectionalLight0.DiffuseColor = New Vector3(-0.3F) - refEffect.DirectionalLight0.Direction = Vector3.Normalize(New Vector3(1.0F, 1.0F, 1.0F)) + 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 = New Vector3(0.8F) + refEffect.AmbientLightColor = GetEnvironmentColor(1) - refEffect.DirectionalLight0.DiffuseColor = New Vector3(-0.45F) - refEffect.DirectionalLight0.Direction = Vector3.Normalize(New Vector3(-1.0F, 0.0F, 1.0F)) + 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 @@ -88,9 +144,9 @@ Public Class Lighting ' 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 + ' 2 = Always Day + ' 3 = Always Night + ' 4 = Always Morning ' 5 = Always Evening If Screen.Level.LightingType = 1 Then ' If the level lighting type is 1, disable lighting (set index to 99). @@ -99,11 +155,11 @@ Public Class Lighting If Screen.Level.EnvironmentType = World.EnvironmentTypes.Outside Then Select Case Screen.Level.DayTime Case 1 - LightType = 2 - Case 2 LightType = 0 - Case 3 + Case 2 LightType = 1 + Case 3 + LightType = 2 Case 4 LightType = 3 End Select @@ -111,23 +167,9 @@ Public Class Lighting 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 - Return LightType End Function - Public Shared Function GetLightingColor(ByVal LightType As Integer) As Vector3 - Select Case LightType - Case 0 - Return New Vector3(0.4F, 0.4F, 0.6F) - Case 1 - Return Color.Orange.ToVector3() - Case 2 - Return New Vector3(-0.3F) - Case 3 - Return New Vector3(-0.45F) - End Select - End Function - #End Region End Class \ No newline at end of file diff --git a/P3D/World/World.vb b/P3D/World/World.vb index 23a415f04..258eb4c61 100644 --- a/P3D/World/World.vb +++ b/P3D/World/World.vb @@ -40,9 +40,9 @@ Public Class World End Enum Public Enum DayTimes As Integer - Night = 0 - Morning = 1 - Day = 2 + Day = 0 + Night = 1 + Morning = 2 Evening = 3 End Enum @@ -594,50 +594,35 @@ endsub: Private Sub ChangeEnvironment() Select Case Me.EnvironmentType Case EnvironmentTypes.Outside - Dim _fogColor As Color - Dim v As Single = 1.0F - Dim nightFog As Integer = 64 - Dim dayFog As Integer = 168 + Dim multiplier As Vector3 = New Vector3(1.0F) Select Case CurrentMapWeather Case World.Weathers.Clear, Weathers.Sunny - v = 1.0F + multiplier = New Vector3(1.0F) Case World.Weathers.Rain, Weathers.Thunderstorm, World.Weathers.Fog - v = 0.7F + multiplier = New Vector3(0.7F) Case World.Weathers.Snow - v = 0.8F + multiplier = New Vector3(0.8F) End Select - Select Case Screen.Level.DayTime - Case 1, 3 - _fogColor = New Color(CInt(v * dayFog), CInt(v * dayFog), CInt(v * dayFog)) - Case 2, 4 - _fogColor = New Color(CInt(v * nightFog), CInt(v * nightFog), CInt(v * nightFog)) - End Select - Core.BackgroundColor = GetWeatherBackgroundColor(SkyDome.GetDaytimeColor(False)) - Screen.Effect.FogColor = _fogColor.ToVector3() + Screen.Effect.FogColor = Lighting.GetEnvironmentColor(2) * multiplier Screen.SkyDome.TextureDown = TextureManager.GetTexture("SkyDomeResource\Stars") Case EnvironmentTypes.Inside - Core.BackgroundColor = New Color(57, 57, 57) - Screen.Effect.FogColor = Core.BackgroundColor.ToVector3() - Screen.SkyDome.TextureUp = Nothing + Screen.Effect.FogColor = Lighting.GetEnvironmentColor(2) + Screen.SkyDome.TextureUp = TextureManager.GetTexture("SkyDomeResource\Inside") Screen.SkyDome.TextureDown = Nothing Case EnvironmentTypes.Dark - Core.BackgroundColor = GetWeatherBackgroundColor(New Color(29, 29, 50)) - Screen.Effect.FogColor = Core.BackgroundColor.ToVector3() + Screen.Effect.FogColor = Lighting.GetEnvironmentColor(2) Screen.SkyDome.TextureUp = TextureManager.GetTexture("SkyDomeResource\Dark") Screen.SkyDome.TextureDown = Nothing Case EnvironmentTypes.Cave - Core.BackgroundColor = GetWeatherBackgroundColor(New Color(72, 64, 64)) - Screen.Effect.FogColor = Core.BackgroundColor.ToVector3() + Screen.Effect.FogColor = Lighting.GetEnvironmentColor(2) Screen.SkyDome.TextureUp = TextureManager.GetTexture("SkyDomeResource\Cave") Screen.SkyDome.TextureDown = Nothing Case EnvironmentTypes.Underwater - Core.BackgroundColor = GetWeatherBackgroundColor(New Color(40, 88, 128)) - Screen.Effect.FogColor = Core.BackgroundColor.ToVector3() + Screen.Effect.FogColor = Lighting.GetEnvironmentColor(2) Screen.SkyDome.TextureUp = TextureManager.GetTexture("SkyDomeResource\Underwater") Screen.SkyDome.TextureDown = Nothing Case EnvironmentTypes.Forest - Core.BackgroundColor = GetWeatherBackgroundColor(New Color(48, 80, 48)) - Screen.Effect.FogColor = Core.BackgroundColor.ToVector3() + Screen.Effect.FogColor = Lighting.GetEnvironmentColor(2) Screen.SkyDome.TextureUp = TextureManager.GetTexture("SkyDomeResource\Forest") Screen.SkyDome.TextureDown = Nothing End Select