From 414f9ff62a055eef0ea6fa720f898ceca1309992 Mon Sep 17 00:00:00 2001 From: Luis Gonzalez Date: Thu, 9 Jul 2026 20:37:50 -0700 Subject: [PATCH] =?UTF-8?q?Feel:=20Phase=201.5=20lighting/atmosphere=20pas?= =?UTF-8?q?s=20=E2=80=94=20dark=20ambient=20+=20dynamic=20lights?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Dark-ambient, dynamic-light-first look (RoR2/Death Scourges reference), built filter-agnostic so the pixel style composes on top: - New DynamicLightSystem (client-only, PresentationSystemGroup): pooled point lights follow projectile ghosts; pulsing portal light during RoomExplore (same ExpeditionPortalPos authority as the beacon); soft resource-node glow that fades with harvest-shrink; short impact FLASHES fed by CombatFeedbackSystem's burst funnel (EmitColored + SpawnVfx -> RequestFlash). Knobs in DynamicLightConfig (scene object, code defaults when absent). - Atmosphere darkened: WorldAtmosphereConfig/System palettes moved to the dark set (base cool dusk, arid burnt dusk, per-room biome consts darkened); scene fog switched Linear -> ExponentialSquared (the system's per-region DENSITY writes were dead in Linear mode); trilight ambient lowered; directional 1.9 -> 1.05 slightly warm. - 6 landmark mood lights (warpgate cyan, artefact violet x2, survey camp warm x2, cabin warm); URP additional-lights-per-object 4 -> 8 (was starving the existing Aether lights). - Art-look gate material: Assets/Screenshots/artlook_{base,room}_ pixel{ON,OFF}.png over the lit scene. Verified: lights live in Play (20 static at base incl. new landmarks; pooled dynamics active in-room: node glows + impact flashes), fog/ ambient values confirmed live, 466/466 EditMode, console clean. Co-Authored-By: Claude Fable 5 --- Assets/Scenes/Game.unity | 712 +++++++++++++++++- Assets/Screenshots/artlook_base_pixelOFF.png | 3 + .../artlook_base_pixelOFF.png.meta | 117 +++ Assets/Screenshots/artlook_base_pixelON.png | 3 + .../Screenshots/artlook_base_pixelON.png.meta | 117 +++ Assets/Screenshots/artlook_room_pixelOFF.png | 3 + .../artlook_room_pixelOFF.png.meta | 117 +++ Assets/Screenshots/artlook_room_pixelON.png | 3 + .../Screenshots/artlook_room_pixelON.png.meta | 117 +++ Assets/Settings/PC_RPAsset.asset | 2 +- .../Presentation/CombatFeedbackSystem.cs | 4 + .../Client/Presentation/DynamicLightConfig.cs | 51 ++ .../Presentation/DynamicLightConfig.cs.meta | 2 + .../Client/Presentation/DynamicLightSystem.cs | 206 +++++ .../Presentation/DynamicLightSystem.cs.meta | 2 + .../Presentation/WorldAtmosphereConfig.cs | 14 +- .../Presentation/WorldAtmosphereSystem.cs | 28 +- 17 files changed, 1466 insertions(+), 35 deletions(-) create mode 100644 Assets/Screenshots/artlook_base_pixelOFF.png create mode 100644 Assets/Screenshots/artlook_base_pixelOFF.png.meta create mode 100644 Assets/Screenshots/artlook_base_pixelON.png create mode 100644 Assets/Screenshots/artlook_base_pixelON.png.meta create mode 100644 Assets/Screenshots/artlook_room_pixelOFF.png create mode 100644 Assets/Screenshots/artlook_room_pixelOFF.png.meta create mode 100644 Assets/Screenshots/artlook_room_pixelON.png create mode 100644 Assets/Screenshots/artlook_room_pixelON.png.meta create mode 100644 Assets/_Project/Scripts/Client/Presentation/DynamicLightConfig.cs create mode 100644 Assets/_Project/Scripts/Client/Presentation/DynamicLightConfig.cs.meta create mode 100644 Assets/_Project/Scripts/Client/Presentation/DynamicLightSystem.cs create mode 100644 Assets/_Project/Scripts/Client/Presentation/DynamicLightSystem.cs.meta diff --git a/Assets/Scenes/Game.unity b/Assets/Scenes/Game.unity index 55655010d..706f90a1a 100644 --- a/Assets/Scenes/Game.unity +++ b/Assets/Scenes/Game.unity @@ -15,14 +15,14 @@ RenderSettings: m_ObjectHideFlags: 0 serializedVersion: 10 m_Fog: 1 - m_FogColor: {r: 0.07, g: 0.09, b: 0.1, a: 1} - m_FogMode: 1 - m_FogDensity: 0.006 + m_FogColor: {r: 0.09, g: 0.13, b: 0.14, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 m_LinearFogStart: 55 m_LinearFogEnd: 180 - m_AmbientSkyColor: {r: 0.2, g: 0.24, b: 0.29, a: 1} - m_AmbientEquatorColor: {r: 0.36, g: 0.4, b: 0.44, a: 1} - m_AmbientGroundColor: {r: 0.26, g: 0.28, b: 0.3, a: 1} + m_AmbientSkyColor: {r: 0.32, g: 0.38, b: 0.48, a: 1} + m_AmbientEquatorColor: {r: 0.22, g: 0.24, b: 0.27, a: 1} + m_AmbientGroundColor: {r: 0.13, g: 0.14, b: 0.15, a: 1} m_AmbientIntensity: 1 m_AmbientMode: 1 m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} @@ -3442,6 +3442,69 @@ Transform: m_CorrespondingSourceObject: {fileID: 3382370562072349170, guid: be29130b15f5d6b4782a79790d86b12c, type: 3} m_PrefabInstance: {fileID: 70139539} m_PrefabAsset: {fileID: 0} +--- !u!1 &70737664 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 70737666} + - component: {fileID: 70737665} + m_Layer: 0 + m_Name: DynamicLights + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &70737665 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 70737664} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 29d6b79f028929744bebd1580378691c, type: 3} + m_Name: + m_EditorClassIdentifier: ProjectM.Client::ProjectM.Client.DynamicLightConfig + Enabled: 1 + MaxProjectileLights: 24 + ProjectileColor: {r: 0.45, g: 0.85, b: 1, a: 1} + ProjectileIntensity: 2.6 + ProjectileRange: 7 + PortalColor: {r: 0.55, g: 0.95, b: 1, a: 1} + PortalIntensity: 3.5 + PortalPulseAmp: 1.2 + PortalRange: 13 + NodeGlow: 1 + MaxNodeLights: 12 + NodeColor: {r: 0.4, g: 1, b: 0.75, a: 1} + NodeIntensity: 1.3 + NodeRange: 4.5 + MaxFlashLights: 8 + FlashDefaultColor: {r: 1, g: 0.85, b: 0.55, a: 1} + FlashIntensity: 3.2 + FlashRange: 6.5 + FlashDuration: 0.18 +--- !u!4 &70737666 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 70737664} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1001 &71716685 PrefabInstance: m_ObjectHideFlags: 0 @@ -7951,6 +8014,103 @@ MeshFilter: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 203489229} m_Mesh: {fileID: -8892877181006153405, guid: 60c2fa501544e6a47ab77906245d80db, type: 3} +--- !u!1 &205208180 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 205208181} + - component: {fileID: 205208182} + m_Layer: 0 + m_Name: SurveyCampLight_S1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &205208181 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 205208180} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1538, y: 2.5, z: 23} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1276835916} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!108 &205208182 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 205208180} + m_Enabled: 1 + serializedVersion: 13 + m_Type: 2 + m_Color: {r: 1, g: 0.72, b: 0.4, a: 1} + m_Intensity: 3.5 + m_Range: 12 + m_SpotAngle: 30 + m_InnerSpotAngle: 21.80208 + m_CookieSize2D: {x: 0.5, y: 0.5} + m_Shadows: + m_Type: 0 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_CullingMatrixOverride: + e00: 1 + e01: 0 + e02: 0 + e03: 0 + e10: 0 + e11: 1 + e12: 0 + e13: 0 + e20: 0 + e21: 0 + e22: 1 + e23: 0 + e30: 0 + e31: 0 + e32: 0 + e33: 1 + m_UseCullingMatrixOverride: 0 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingLayerMask: 1 + m_Lightmapping: 4 + m_LightShadowCasterMode: 0 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} + m_UseBoundingSphereOverride: 0 + m_UseViewFrustumForShadowCasterCull: 1 + m_ForceVisible: 0 + m_ShapeRadius: 0.025 + m_ShadowAngle: 0 + m_LightUnit: 1 + m_LuxAtDistance: 1 + m_EnableSpotReflector: 1 --- !u!1001 &207855813 PrefabInstance: m_ObjectHideFlags: 0 @@ -15467,8 +15627,8 @@ Light: m_Enabled: 1 serializedVersion: 13 m_Type: 1 - m_Color: {r: 0.92, g: 0.94, b: 1, a: 1} - m_Intensity: 1.9 + m_Color: {r: 0.93, g: 0.91, b: 0.88, a: 1} + m_Intensity: 1.05 m_Range: 10 m_SpotAngle: 30 m_InnerSpotAngle: 21.80208 @@ -26884,6 +27044,103 @@ Transform: m_CorrespondingSourceObject: {fileID: 3865605783607592755, guid: f3ab8793d314fa84793c1c2086c914df, type: 3} m_PrefabInstance: {fileID: 663552286} m_PrefabAsset: {fileID: 0} +--- !u!1 &663963125 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 663963126} + - component: {fileID: 663963127} + m_Layer: 0 + m_Name: ArtefactLight + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &663963126 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 663963125} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1030, y: 3.5, z: -8} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1276835916} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!108 &663963127 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 663963125} + m_Enabled: 1 + serializedVersion: 13 + m_Type: 2 + m_Color: {r: 0.75, g: 0.45, b: 1, a: 1} + m_Intensity: 4.5 + m_Range: 14 + m_SpotAngle: 30 + m_InnerSpotAngle: 21.80208 + m_CookieSize2D: {x: 0.5, y: 0.5} + m_Shadows: + m_Type: 0 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_CullingMatrixOverride: + e00: 1 + e01: 0 + e02: 0 + e03: 0 + e10: 0 + e11: 1 + e12: 0 + e13: 0 + e20: 0 + e21: 0 + e22: 1 + e23: 0 + e30: 0 + e31: 0 + e32: 0 + e33: 1 + m_UseCullingMatrixOverride: 0 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingLayerMask: 1 + m_Lightmapping: 4 + m_LightShadowCasterMode: 0 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} + m_UseBoundingSphereOverride: 0 + m_UseViewFrustumForShadowCasterCull: 1 + m_ForceVisible: 0 + m_ShapeRadius: 0.025 + m_ShadowAngle: 0 + m_LightUnit: 1 + m_LuxAtDistance: 1 + m_EnableSpotReflector: 1 --- !u!1001 &667197736 PrefabInstance: m_ObjectHideFlags: 0 @@ -44050,6 +44307,103 @@ Transform: m_CorrespondingSourceObject: {fileID: 5826526793267013502, guid: 1649a4e629b575d458a0b13e637a7468, type: 3} m_PrefabInstance: {fileID: 1118540215} m_PrefabAsset: {fileID: 0} +--- !u!1 &1120306465 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1120306466} + - component: {fileID: 1120306467} + m_Layer: 0 + m_Name: SurveyCampLight + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1120306466 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1120306465} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1038, y: 2.5, z: 23} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1276835916} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!108 &1120306467 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1120306465} + m_Enabled: 1 + serializedVersion: 13 + m_Type: 2 + m_Color: {r: 1, g: 0.72, b: 0.4, a: 1} + m_Intensity: 3.5 + m_Range: 12 + m_SpotAngle: 30 + m_InnerSpotAngle: 21.80208 + m_CookieSize2D: {x: 0.5, y: 0.5} + m_Shadows: + m_Type: 0 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_CullingMatrixOverride: + e00: 1 + e01: 0 + e02: 0 + e03: 0 + e10: 0 + e11: 1 + e12: 0 + e13: 0 + e20: 0 + e21: 0 + e22: 1 + e23: 0 + e30: 0 + e31: 0 + e32: 0 + e33: 1 + m_UseCullingMatrixOverride: 0 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingLayerMask: 1 + m_Lightmapping: 4 + m_LightShadowCasterMode: 0 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} + m_UseBoundingSphereOverride: 0 + m_UseViewFrustumForShadowCasterCull: 1 + m_ForceVisible: 0 + m_ShapeRadius: 0.025 + m_ShadowAngle: 0 + m_LightUnit: 1 + m_LuxAtDistance: 1 + m_EnableSpotReflector: 1 --- !u!1001 &1120488715 PrefabInstance: m_ObjectHideFlags: 0 @@ -49423,6 +49777,43 @@ Transform: m_CorrespondingSourceObject: {fileID: 2231112379584141163, guid: bd945678d6dae86468a64e5a59496b5b, type: 3} m_PrefabInstance: {fileID: 1276569853} m_PrefabAsset: {fileID: 0} +--- !u!1 &1276835915 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1276835916} + m_Layer: 0 + m_Name: LandmarkLights + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1276835916 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1276835915} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1915626474} + - {fileID: 663963126} + - {fileID: 1501947283} + - {fileID: 1120306466} + - {fileID: 205208181} + - {fileID: 2045829909} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1001 &1280065368 PrefabInstance: m_ObjectHideFlags: 0 @@ -56243,6 +56634,103 @@ Transform: m_CorrespondingSourceObject: {fileID: 591573043354113928, guid: bafd1387c024a3a459afa35dd24cec25, type: 3} m_PrefabInstance: {fileID: 1492696656} m_PrefabAsset: {fileID: 0} +--- !u!1 &1501947282 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1501947283} + - component: {fileID: 1501947284} + m_Layer: 0 + m_Name: ArtefactLight_S1 + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1501947283 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1501947282} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1530, y: 3.5, z: -8} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1276835916} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!108 &1501947284 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1501947282} + m_Enabled: 1 + serializedVersion: 13 + m_Type: 2 + m_Color: {r: 0.75, g: 0.45, b: 1, a: 1} + m_Intensity: 4.5 + m_Range: 14 + m_SpotAngle: 30 + m_InnerSpotAngle: 21.80208 + m_CookieSize2D: {x: 0.5, y: 0.5} + m_Shadows: + m_Type: 0 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_CullingMatrixOverride: + e00: 1 + e01: 0 + e02: 0 + e03: 0 + e10: 0 + e11: 1 + e12: 0 + e13: 0 + e20: 0 + e21: 0 + e22: 1 + e23: 0 + e30: 0 + e31: 0 + e32: 0 + e33: 1 + m_UseCullingMatrixOverride: 0 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingLayerMask: 1 + m_Lightmapping: 4 + m_LightShadowCasterMode: 0 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} + m_UseBoundingSphereOverride: 0 + m_UseViewFrustumForShadowCasterCull: 1 + m_ForceVisible: 0 + m_ShapeRadius: 0.025 + m_ShadowAngle: 0 + m_LightUnit: 1 + m_LuxAtDistance: 1 + m_EnableSpotReflector: 1 --- !u!1001 &1502093507 PrefabInstance: m_ObjectHideFlags: 0 @@ -63364,12 +63852,12 @@ MonoBehaviour: m_EditorClassIdentifier: ProjectM.Client::ProjectM.Client.WorldAtmosphereConfig BoundaryX: 500 BlendHalfWidth: 80 - BaseFogColor: {r: 0.4, g: 0.5, b: 0.54, a: 1} - BaseFogDensity: 0.006 - BaseAmbientSky: {r: 0.46, g: 0.52, b: 0.6, a: 1} - ExpeditionFogColor: {r: 0.8509804, g: 0.54901963, b: 0.22745098, a: 1} - ExpeditionFogDensity: 0.01 - ExpeditionAmbientSky: {r: 0.91, g: 0.769, b: 0.604, a: 1} + BaseFogColor: {r: 0.09, g: 0.13, b: 0.14, a: 1} + BaseFogDensity: 0.01 + BaseAmbientSky: {r: 0.32, g: 0.38, b: 0.48, a: 1} + ExpeditionFogColor: {r: 0.24, g: 0.13, b: 0.06, a: 1} + ExpeditionFogDensity: 0.016 + ExpeditionAmbientSky: {r: 0.45, g: 0.31, b: 0.2, a: 1} --- !u!4 &1709609454 Transform: m_ObjectHideFlags: 0 @@ -72274,6 +72762,103 @@ Transform: - {fileID: 397367818} m_Father: {fileID: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1915626473 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1915626474} + - component: {fileID: 1915626475} + m_Layer: 0 + m_Name: WarpgateLight + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1915626474 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1915626473} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 3, z: -21.5} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1276835916} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!108 &1915626475 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1915626473} + m_Enabled: 1 + serializedVersion: 13 + m_Type: 2 + m_Color: {r: 0.35, g: 0.85, b: 1, a: 1} + m_Intensity: 4 + m_Range: 14 + m_SpotAngle: 30 + m_InnerSpotAngle: 21.80208 + m_CookieSize2D: {x: 0.5, y: 0.5} + m_Shadows: + m_Type: 0 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_CullingMatrixOverride: + e00: 1 + e01: 0 + e02: 0 + e03: 0 + e10: 0 + e11: 1 + e12: 0 + e13: 0 + e20: 0 + e21: 0 + e22: 1 + e23: 0 + e30: 0 + e31: 0 + e32: 0 + e33: 1 + m_UseCullingMatrixOverride: 0 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingLayerMask: 1 + m_Lightmapping: 4 + m_LightShadowCasterMode: 0 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} + m_UseBoundingSphereOverride: 0 + m_UseViewFrustumForShadowCasterCull: 1 + m_ForceVisible: 0 + m_ShapeRadius: 0.025 + m_ShadowAngle: 0 + m_LightUnit: 1 + m_LuxAtDistance: 1 + m_EnableSpotReflector: 1 --- !u!1001 &1920089972 PrefabInstance: m_ObjectHideFlags: 0 @@ -76591,6 +77176,103 @@ Transform: m_CorrespondingSourceObject: {fileID: 7730081809800521909, guid: 8de936dd6b78d5d409ee63fa6cb9d111, type: 3} m_PrefabInstance: {fileID: 2045499181} m_PrefabAsset: {fileID: 0} +--- !u!1 &2045829908 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2045829909} + - component: {fileID: 2045829910} + m_Layer: 0 + m_Name: CabinLight + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2045829909 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2045829908} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 22, y: 2.5, z: 14} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1276835916} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!108 &2045829910 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2045829908} + m_Enabled: 1 + serializedVersion: 13 + m_Type: 2 + m_Color: {r: 1, g: 0.75, b: 0.45, a: 1} + m_Intensity: 3 + m_Range: 10 + m_SpotAngle: 30 + m_InnerSpotAngle: 21.80208 + m_CookieSize2D: {x: 0.5, y: 0.5} + m_Shadows: + m_Type: 0 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_CullingMatrixOverride: + e00: 1 + e01: 0 + e02: 0 + e03: 0 + e10: 0 + e11: 1 + e12: 0 + e13: 0 + e20: 0 + e21: 0 + e22: 1 + e23: 0 + e30: 0 + e31: 0 + e32: 0 + e33: 1 + m_UseCullingMatrixOverride: 0 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingLayerMask: 1 + m_Lightmapping: 4 + m_LightShadowCasterMode: 0 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} + m_UseBoundingSphereOverride: 0 + m_UseViewFrustumForShadowCasterCull: 1 + m_ForceVisible: 0 + m_ShapeRadius: 0.025 + m_ShadowAngle: 0 + m_LightUnit: 1 + m_LuxAtDistance: 1 + m_EnableSpotReflector: 1 --- !u!1001 &2047680188 PrefabInstance: m_ObjectHideFlags: 0 @@ -80609,3 +81291,5 @@ SceneRoots: - {fileID: 433101879} - {fileID: 1709609454} - {fileID: 1851179016} + - {fileID: 70737666} + - {fileID: 1276835916} diff --git a/Assets/Screenshots/artlook_base_pixelOFF.png b/Assets/Screenshots/artlook_base_pixelOFF.png new file mode 100644 index 000000000..b956f94d3 --- /dev/null +++ b/Assets/Screenshots/artlook_base_pixelOFF.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9687be7f3790467fe91a099e95a85bd908809e0e582ee66257dd785280a51c65 +size 207564 diff --git a/Assets/Screenshots/artlook_base_pixelOFF.png.meta b/Assets/Screenshots/artlook_base_pixelOFF.png.meta new file mode 100644 index 000000000..22641936d --- /dev/null +++ b/Assets/Screenshots/artlook_base_pixelOFF.png.meta @@ -0,0 +1,117 @@ +fileFormatVersion: 2 +guid: 6f3266883d21bd64bbf1e3e2186714c0 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Screenshots/artlook_base_pixelON.png b/Assets/Screenshots/artlook_base_pixelON.png new file mode 100644 index 000000000..d8a93fa6d --- /dev/null +++ b/Assets/Screenshots/artlook_base_pixelON.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:434da82f50cb148c71e22bfc078c2f677683a58ef965a3c9b9867f63be11d8e9 +size 210876 diff --git a/Assets/Screenshots/artlook_base_pixelON.png.meta b/Assets/Screenshots/artlook_base_pixelON.png.meta new file mode 100644 index 000000000..5e439ed6f --- /dev/null +++ b/Assets/Screenshots/artlook_base_pixelON.png.meta @@ -0,0 +1,117 @@ +fileFormatVersion: 2 +guid: 3421ac579188db74e8c5395631b3e5d1 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Screenshots/artlook_room_pixelOFF.png b/Assets/Screenshots/artlook_room_pixelOFF.png new file mode 100644 index 000000000..7903d372c --- /dev/null +++ b/Assets/Screenshots/artlook_room_pixelOFF.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0590a73aaebcd22d59f1c7ba9aa216a0627eb6762c8693beb4512798853e1348 +size 330578 diff --git a/Assets/Screenshots/artlook_room_pixelOFF.png.meta b/Assets/Screenshots/artlook_room_pixelOFF.png.meta new file mode 100644 index 000000000..a07140cbb --- /dev/null +++ b/Assets/Screenshots/artlook_room_pixelOFF.png.meta @@ -0,0 +1,117 @@ +fileFormatVersion: 2 +guid: ec34d2abf204a2241b3308a818f8d92d +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Screenshots/artlook_room_pixelON.png b/Assets/Screenshots/artlook_room_pixelON.png new file mode 100644 index 000000000..3aabd4584 --- /dev/null +++ b/Assets/Screenshots/artlook_room_pixelON.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cc962d88b30c65988ab47f444dbc47bc1daa21f059a0e4e48994dee0794b5b0a +size 393866 diff --git a/Assets/Screenshots/artlook_room_pixelON.png.meta b/Assets/Screenshots/artlook_room_pixelON.png.meta new file mode 100644 index 000000000..62a7c459c --- /dev/null +++ b/Assets/Screenshots/artlook_room_pixelON.png.meta @@ -0,0 +1,117 @@ +fileFormatVersion: 2 +guid: 752448759c514e74aa9613130eb8f8d4 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 4 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 4 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + customData: + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spriteCustomMetadata: + entries: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Settings/PC_RPAsset.asset b/Assets/Settings/PC_RPAsset.asset index ada02541f..4325d3aaa 100644 --- a/Assets/Settings/PC_RPAsset.asset +++ b/Assets/Settings/PC_RPAsset.asset @@ -45,7 +45,7 @@ MonoBehaviour: m_MainLightShadowsSupported: 1 m_MainLightShadowmapResolution: 2048 m_AdditionalLightsRenderingMode: 1 - m_AdditionalLightsPerObjectLimit: 4 + m_AdditionalLightsPerObjectLimit: 8 m_AdditionalLightShadowsSupported: 1 m_AdditionalLightsShadowmapResolution: 2048 m_AdditionalLightsShadowResolutionTierLow: 256 diff --git a/Assets/_Project/Scripts/Client/Presentation/CombatFeedbackSystem.cs b/Assets/_Project/Scripts/Client/Presentation/CombatFeedbackSystem.cs index b4907e845..337b735a8 100644 --- a/Assets/_Project/Scripts/Client/Presentation/CombatFeedbackSystem.cs +++ b/Assets/_Project/Scripts/Client/Presentation/CombatFeedbackSystem.cs @@ -517,6 +517,8 @@ namespace ProjectM.Client if (ps == null || count <= 0) return; var ep = new ParticleSystem.EmitParams { position = pos, startColor = color }; ps.Emit(ep, count); + // Phase 1.5 lighting: every colored burst also throws a short point-light flash (dark-ambient look). + DynamicLightSystem.RequestFlash(pos, color, Mathf.Clamp(count / 18f, 0.4f, 1.4f)); } void Burst(ParticleSystem fallback, GameObject prefab, Vector3 pos, int count) @@ -535,6 +537,8 @@ namespace ProjectM.Client var systems = go.GetComponentsInChildren(); for (int i = 0; i < systems.Length; i++) systems[i].Play(); _activeVfx.Add(new TimedVfx { Go = go, Kill = SystemAPI.Time.ElapsedTime + VfxLifetime(go) }); + // Phase 1.5 lighting: authored VFX impacts flash too (a==0 -> config default colour). + DynamicLightSystem.RequestFlash(pos, new Color(0f, 0f, 0f, 0f), 1f); } void PruneVfx() diff --git a/Assets/_Project/Scripts/Client/Presentation/DynamicLightConfig.cs b/Assets/_Project/Scripts/Client/Presentation/DynamicLightConfig.cs new file mode 100644 index 000000000..46e4b4bcf --- /dev/null +++ b/Assets/_Project/Scripts/Client/Presentation/DynamicLightConfig.cs @@ -0,0 +1,51 @@ +using UnityEngine; + +namespace ProjectM.Client +{ + /// + /// Live-tunable knobs for — the Phase 1.5 "dynamic-light-first" layer + /// (RoR2 trick: dark ambient + moving point lights carry the readability). Mirrors the + /// bridge idiom: a MonoBehaviour placed in the gameplay scene with a + /// static the client presentation system reads (falling back to these same + /// defaults when absent). Pure presentation — never touches the simulation. Colours are sRGB. + /// + public sealed class DynamicLightConfig : MonoBehaviour + { + public static DynamicLightConfig Instance; + + [Header("Master")] + public bool Enabled = true; + + [Header("Projectile lights (pooled, follow every live projectile ghost)")] + [Min(0)] public int MaxProjectileLights = 24; + public Color ProjectileColor = new Color(0.45f, 0.85f, 1f, 1f); + [Min(0f)] public float ProjectileIntensity = 2.6f; + [Min(0.5f)] public float ProjectileRange = 7f; + + [Header("Portal light (RoomExplore loot window — same position authority as the beacon)")] + public Color PortalColor = new Color(0.55f, 0.95f, 1f, 1f); + [Min(0f)] public float PortalIntensity = 3.5f; + [Min(0f)] public float PortalPulseAmp = 1.2f; + [Min(0.5f)] public float PortalRange = 13f; + + [Header("Resource-node glow (soft pickup readability)")] + public bool NodeGlow = true; + [Min(0)] public int MaxNodeLights = 12; + public Color NodeColor = new Color(0.40f, 1f, 0.75f, 1f); + [Min(0f)] public float NodeIntensity = 1.3f; + [Min(0.5f)] public float NodeRange = 4.5f; + + [Header("Impact flashes (fed by CombatFeedbackSystem's burst funnel)")] + [Min(0)] public int MaxFlashLights = 8; + public Color FlashDefaultColor = new Color(1f, 0.85f, 0.55f, 1f); + [Min(0f)] public float FlashIntensity = 3.2f; + [Min(0.5f)] public float FlashRange = 6.5f; + [Min(0.02f)] public float FlashDuration = 0.18f; + + void OnEnable() { Instance = this; } + void OnDisable() { if (Instance == this) Instance = null; } + + [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)] + static void ResetStatics() { Instance = null; } + } +} diff --git a/Assets/_Project/Scripts/Client/Presentation/DynamicLightConfig.cs.meta b/Assets/_Project/Scripts/Client/Presentation/DynamicLightConfig.cs.meta new file mode 100644 index 000000000..9093b9f13 --- /dev/null +++ b/Assets/_Project/Scripts/Client/Presentation/DynamicLightConfig.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 29d6b79f028929744bebd1580378691c \ No newline at end of file diff --git a/Assets/_Project/Scripts/Client/Presentation/DynamicLightSystem.cs b/Assets/_Project/Scripts/Client/Presentation/DynamicLightSystem.cs new file mode 100644 index 000000000..59e5cf612 --- /dev/null +++ b/Assets/_Project/Scripts/Client/Presentation/DynamicLightSystem.cs @@ -0,0 +1,206 @@ +using System.Collections.Generic; +using ProjectM.Simulation; +using Unity.Entities; +using Unity.Transforms; +using UnityEngine; + +namespace ProjectM.Client +{ + /// + /// Client-only DYNAMIC LIGHT layer (Phase 1.5 lighting pass — dark ambient, dynamic-light-first): pooled + /// point lights that follow projectile ghosts, a pulsing portal light during the RoomExplore loot window + /// (same authority the beacon + HUD prompt use), a soft glow + /// on resource nodes, and short impact FLASHES fed by CombatFeedbackSystem's burst funnel via + /// . Observe-only in + /// (once per frame, no rollback double-fire); never mutates the sim; + /// Entity keys are pruned every frame (a pruned ghost = despawn); lights are pooled GameObjects under a + /// private root, NEVER scene-saved. Knobs live in (defaults when absent). + /// Wall-clock time is fine here (presentation only). URP: point lights, shadows off. + /// + [WorldSystemFilter(WorldSystemFilterFlags.ClientSimulation)] + [UpdateInGroup(typeof(PresentationSystemGroup))] + public partial class DynamicLightSystem : SystemBase + { + struct FlashRequest { public Vector3 Pos; public Color Color; public float Scale; } + struct ActiveFlash { public Light Light; public float EndTime; public float BaseIntensity; public float Duration; } + + // Static request queue: CombatFeedbackSystem (same thread, PresentationSystemGroup) enqueues, we drain. + static readonly List Pending = new List(); + + [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.SubsystemRegistration)] + static void ResetStatics() { Pending.Clear(); } + + /// Queue a short impact flash. with a==0 means "use the config + /// default colour"; scales intensity+range (clamped by the drainer). + public static void RequestFlash(Vector3 pos, Color color, float scale) + { + if (Pending.Count < 64) Pending.Add(new FlashRequest { Pos = pos, Color = color, Scale = scale }); + } + + GameObject _root; + readonly Dictionary _projectileLights = new Dictionary(); + readonly Dictionary _nodeLights = new Dictionary(); + readonly HashSet _seen = new HashSet(); + readonly List _dead = new List(); + readonly Stack _pool = new Stack(); + readonly List _flashes = new List(); + Light _portalLight; + + protected override void OnDestroy() + { + if (_root != null) Object.Destroy(_root); + } + + protected override void OnUpdate() + { + if (UnityEngine.SceneManagement.SceneManager.GetActiveScene().name != "Game") return; + var cfg = DynamicLightConfig.Instance; + bool enabled = cfg == null || cfg.Enabled; + if (!enabled) + { + Pending.Clear(); + if (_root != null && _root.activeSelf) _root.SetActive(false); + return; + } + if (_root == null) + { + _root = new GameObject("~DynamicLights"); + Object.DontDestroyOnLoad(_root); + } + if (!_root.activeSelf) _root.SetActive(true); + + // ---- projectile lights (pooled follow-lights) ---- + int projCap = cfg != null ? cfg.MaxProjectileLights : 24; + Color projColor = cfg != null ? cfg.ProjectileColor : new Color(0.45f, 0.85f, 1f, 1f); + float projIntensity = cfg != null ? cfg.ProjectileIntensity : 2.6f; + float projRange = cfg != null ? cfg.ProjectileRange : 7f; + _seen.Clear(); + foreach (var (lt, entity) in SystemAPI.Query>().WithAll().WithEntityAccess()) + { + _seen.Add(entity); + if (!_projectileLights.TryGetValue(entity, out var light)) + { + if (_projectileLights.Count >= projCap) continue; + light = Rent(); + _projectileLights[entity] = light; + } + light.color = projColor; + light.intensity = projIntensity; + light.range = projRange; + var p = lt.ValueRO.Position; + light.transform.position = new Vector3(p.x, p.y + 0.4f, p.z); + } + PruneUnseen(_projectileLights); + + // ---- resource-node glow ---- + bool nodeGlow = cfg == null || cfg.NodeGlow; + int nodeCap = cfg != null ? cfg.MaxNodeLights : 12; + Color nodeColor = cfg != null ? cfg.NodeColor : new Color(0.40f, 1f, 0.75f, 1f); + float nodeIntensity = cfg != null ? cfg.NodeIntensity : 1.3f; + float nodeRange = cfg != null ? cfg.NodeRange : 4.5f; + _seen.Clear(); + if (nodeGlow) + { + foreach (var (lt, entity) in SystemAPI.Query>().WithAll().WithEntityAccess()) + { + _seen.Add(entity); + if (!_nodeLights.TryGetValue(entity, out var light)) + { + if (_nodeLights.Count >= nodeCap) continue; + light = Rent(); + _nodeLights[entity] = light; + } + light.color = nodeColor; + // scale the glow with the node's harvest-shrink so it fades as the node depletes + light.intensity = nodeIntensity * Mathf.Clamp01(lt.ValueRO.Scale); + light.range = nodeRange; + var p = lt.ValueRO.Position; + light.transform.position = new Vector3(p.x, p.y + 1.1f, p.z); + } + } + PruneUnseen(_nodeLights); + + // ---- portal light (RoomExplore only) ---- + bool portalOn = false; + if (SystemAPI.TryGetSingleton(out var runInfo) + && runInfo.Lifecycle == RunLifecycle.RoomExplore + && SystemAPI.TryGetSingleton(out var anchor)) + { + portalOn = true; + var pos = RegionMath.ExpeditionPortalPos(BaseGridMath.PlotCenter(anchor), (byte)(runInfo.CurrentRoom & 1)); + if (_portalLight == null) _portalLight = Rent(); + float baseI = cfg != null ? cfg.PortalIntensity : 3.5f; + float amp = cfg != null ? cfg.PortalPulseAmp : 1.2f; + _portalLight.color = cfg != null ? cfg.PortalColor : new Color(0.55f, 0.95f, 1f, 1f); + _portalLight.range = cfg != null ? cfg.PortalRange : 13f; + _portalLight.intensity = baseI + amp * Mathf.Sin(UnityEngine.Time.time * 4f); + _portalLight.transform.position = new Vector3(pos.x, pos.y + 2.2f, pos.z); + } + if (!portalOn && _portalLight != null) { Return(_portalLight); _portalLight = null; } + + // ---- impact flashes ---- + float now = UnityEngine.Time.time; + int flashCap = cfg != null ? cfg.MaxFlashLights : 8; + Color flashDefault = cfg != null ? cfg.FlashDefaultColor : new Color(1f, 0.85f, 0.55f, 1f); + float flashIntensity = cfg != null ? cfg.FlashIntensity : 3.2f; + float flashRange = cfg != null ? cfg.FlashRange : 6.5f; + float flashDur = cfg != null ? cfg.FlashDuration : 0.18f; + for (int i = 0; i < Pending.Count; i++) + { + if (_flashes.Count >= flashCap) break; + var req = Pending[i]; + float scale = Mathf.Clamp(req.Scale, 0.3f, 1.6f); + var light = Rent(); + light.color = req.Color.a > 0f ? req.Color : flashDefault; + light.intensity = flashIntensity * scale; + light.range = flashRange * Mathf.Sqrt(scale); + light.transform.position = req.Pos + new Vector3(0f, 0.6f, 0f); + _flashes.Add(new ActiveFlash { Light = light, EndTime = now + flashDur, BaseIntensity = light.intensity, Duration = flashDur }); + } + Pending.Clear(); + for (int i = _flashes.Count - 1; i >= 0; i--) + { + var f = _flashes[i]; + float remain = f.EndTime - now; + if (remain <= 0f) { Return(f.Light); _flashes.RemoveAt(i); continue; } + f.Light.intensity = f.BaseIntensity * (remain / f.Duration); + } + } + + void PruneUnseen(Dictionary map) + { + _dead.Clear(); + foreach (var kv in map) + if (!_seen.Contains(kv.Key)) _dead.Add(kv.Key); + for (int i = 0; i < _dead.Count; i++) + { + Return(map[_dead[i]]); + map.Remove(_dead[i]); + } + } + + Light Rent() + { + while (_pool.Count > 0) + { + var pooled = _pool.Pop(); + if (pooled == null) continue; // scene reload can null pooled objects + pooled.gameObject.SetActive(true); + return pooled; + } + var go = new GameObject("PointLight"); + go.transform.SetParent(_root.transform, false); + var light = go.AddComponent(); + light.type = LightType.Point; + light.shadows = LightShadows.None; + return light; + } + + void Return(Light light) + { + if (light == null) return; + light.gameObject.SetActive(false); + _pool.Push(light); + } + } +} diff --git a/Assets/_Project/Scripts/Client/Presentation/DynamicLightSystem.cs.meta b/Assets/_Project/Scripts/Client/Presentation/DynamicLightSystem.cs.meta new file mode 100644 index 000000000..2b98439bf --- /dev/null +++ b/Assets/_Project/Scripts/Client/Presentation/DynamicLightSystem.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 7387d0b5b23709a45bc7032dfe336bbb \ No newline at end of file diff --git a/Assets/_Project/Scripts/Client/Presentation/WorldAtmosphereConfig.cs b/Assets/_Project/Scripts/Client/Presentation/WorldAtmosphereConfig.cs index 70e876b21..e2cef0927 100644 --- a/Assets/_Project/Scripts/Client/Presentation/WorldAtmosphereConfig.cs +++ b/Assets/_Project/Scripts/Client/Presentation/WorldAtmosphereConfig.cs @@ -19,15 +19,15 @@ namespace ProjectM.Client [Tooltip("Half-width of the smooth transition band around BoundaryX, in world units.")] public float BlendHalfWidth = 80f; - [Header("Base (meadow) atmosphere")] - public Color BaseFogColor = new Color(0.784f, 0.878f, 0.824f, 1f); // #C8E0D2 - public float BaseFogDensity = 0.006f; - public Color BaseAmbientSky = new Color(0.725f, 0.831f, 0.949f, 1f); // #B9D4F2 + [Header("Base (meadow) atmosphere — Phase 1.5 dark-ambient set (dynamic-light-first)")] + public Color BaseFogColor = new Color(0.09f, 0.13f, 0.14f, 1f); + public float BaseFogDensity = 0.010f; + public Color BaseAmbientSky = new Color(0.32f, 0.38f, 0.48f, 1f); [Header("Expedition (arid desert) atmosphere")] - public Color ExpeditionFogColor = new Color(0.851f, 0.549f, 0.227f, 1f); // #D98C3A - public float ExpeditionFogDensity = 0.010f; - public Color ExpeditionAmbientSky = new Color(0.910f, 0.769f, 0.604f, 1f); // #E8C49A + public Color ExpeditionFogColor = new Color(0.24f, 0.13f, 0.06f, 1f); + public float ExpeditionFogDensity = 0.016f; + public Color ExpeditionAmbientSky = new Color(0.45f, 0.31f, 0.20f, 1f); void OnEnable() { Instance = this; } void OnDisable() { if (Instance == this) Instance = null; } diff --git a/Assets/_Project/Scripts/Client/Presentation/WorldAtmosphereSystem.cs b/Assets/_Project/Scripts/Client/Presentation/WorldAtmosphereSystem.cs index a69deb415..77118b660 100644 --- a/Assets/_Project/Scripts/Client/Presentation/WorldAtmosphereSystem.cs +++ b/Assets/_Project/Scripts/Client/Presentation/WorldAtmosphereSystem.cs @@ -31,37 +31,39 @@ namespace ProjectM.Client float boundary = cfg != null ? cfg.BoundaryX : 500f; float half = cfg != null ? Mathf.Max(1f, cfg.BlendHalfWidth) : 80f; - Color baseFog = cfg != null ? cfg.BaseFogColor : new Color(0.784f, 0.878f, 0.824f, 1f); - float baseDen = cfg != null ? cfg.BaseFogDensity : 0.006f; - Color baseAmb = cfg != null ? cfg.BaseAmbientSky : new Color(0.725f, 0.831f, 0.949f, 1f); - Color expFog = cfg != null ? cfg.ExpeditionFogColor : new Color(0.851f, 0.549f, 0.227f, 1f); - float expDen = cfg != null ? cfg.ExpeditionFogDensity : 0.010f; - Color expAmb = cfg != null ? cfg.ExpeditionAmbientSky : new Color(0.910f, 0.769f, 0.604f, 1f); + Color baseFog = cfg != null ? cfg.BaseFogColor : new Color(0.09f, 0.13f, 0.14f, 1f); + float baseDen = cfg != null ? cfg.BaseFogDensity : 0.010f; + Color baseAmb = cfg != null ? cfg.BaseAmbientSky : new Color(0.32f, 0.38f, 0.48f, 1f); + Color expFog = cfg != null ? cfg.ExpeditionFogColor : new Color(0.24f, 0.13f, 0.06f, 1f); + float expDen = cfg != null ? cfg.ExpeditionFogDensity : 0.016f; + Color expAmb = cfg != null ? cfg.ExpeditionAmbientSky : new Color(0.45f, 0.31f, 0.20f, 1f); // Step 14 (expedition redesign): the EXPEDITION-side palette keys on the replicated per-room biome // (RunInfo.CurrentBiome) so every room re-themes — the camera-X blend still owns the base↔run fade. // Palettes are code consts (cosmetic; per-biome config knobs can layer on later without churn). + // Phase 1.5: all palettes moved to the dark-ambient set (dynamic lights carry readability). if (SystemAPI.TryGetSingleton(out var runInfo) && runInfo.Lifecycle != ProjectM.Simulation.RunLifecycle.Staging) { switch (runInfo.CurrentBiome) { case ProjectM.Simulation.RoomBiomeId.Meadow: - expFog = new Color(0.62f, 0.82f, 0.62f, 1f); expDen = 0.008f; - expAmb = new Color(0.68f, 0.88f, 0.70f, 1f); + expFog = new Color(0.10f, 0.16f, 0.10f, 1f); expDen = 0.012f; + expAmb = new Color(0.30f, 0.42f, 0.32f, 1f); break; case ProjectM.Simulation.RoomBiomeId.Cavern: - expFog = new Color(0.42f, 0.48f, 0.60f, 1f); expDen = 0.014f; - expAmb = new Color(0.50f, 0.56f, 0.72f, 1f); + expFog = new Color(0.06f, 0.08f, 0.12f, 1f); expDen = 0.020f; + expAmb = new Color(0.24f, 0.28f, 0.38f, 1f); break; case ProjectM.Simulation.RoomBiomeId.Blight: - expFog = new Color(0.55f, 0.42f, 0.62f, 1f); expDen = 0.016f; - expAmb = new Color(0.62f, 0.50f, 0.70f, 1f); + expFog = new Color(0.13f, 0.07f, 0.15f, 1f); expDen = 0.022f; + expAmb = new Color(0.32f, 0.24f, 0.38f, 1f); break; - // Arid keeps the config/default orange above. + // Arid keeps the config/default burnt-dusk orange above. } } + float x = _cam.transform.position.x; float t = Mathf.Clamp01((x - (boundary - half)) / (2f * half)); t = t * t * (3f - 2f * t); // smoothstep