diff --git a/NewHorizons/Builder/Atmosphere/AtmosphereBuilder.cs b/NewHorizons/Builder/Atmosphere/AtmosphereBuilder.cs index 04baaeca..6ec91e61 100644 --- a/NewHorizons/Builder/Atmosphere/AtmosphereBuilder.cs +++ b/NewHorizons/Builder/Atmosphere/AtmosphereBuilder.cs @@ -6,7 +6,7 @@ namespace NewHorizons.Atmosphere { static class AtmosphereBuilder { - public static void Make(GameObject body, AtmosphereModule atmosphereModule) + public static void Make(GameObject body, AtmosphereModule atmosphereModule, float surfaceSize) { GameObject atmoGO = new GameObject("Atmosphere"); atmoGO.SetActive(false); @@ -14,66 +14,19 @@ namespace NewHorizons.Atmosphere if (atmosphereModule.HasAtmosphere) { - var mat = GameObject.Find("TimberHearth_Body/Atmosphere_TH/AtmoSphere/Atmosphere_LOD0").GetComponent().material; - - GameObject atmo = GameObject.Instantiate(GameObject.Find("Atmosphere_TH/AtmoSphere")); + GameObject atmo = GameObject.Instantiate(GameObject.Find("TimberHearth_Body/Atmosphere_TH/AtmoSphere")); atmo.transform.parent = atmoGO.transform; atmo.transform.localPosition = Vector3.zero; - atmo.transform.localScale = Vector3.one * atmosphereModule.Size; + atmo.transform.localScale = Vector3.one * atmosphereModule.Size * 1.2f; + foreach(var meshRenderer in atmo.GetComponentsInChildren()) + { + meshRenderer.material.SetFloat("_InnerRadius", atmosphereModule.Cloud != null ? atmosphereModule.Size : surfaceSize); + meshRenderer.material.SetFloat("_OuterRadius", atmosphereModule.Size * 1.2f); + if(atmosphereModule.AtmosphereTint != null) + meshRenderer.material.SetColor("_SkyColor", atmosphereModule.AtmosphereTint.ToColor32()); + } + atmo.SetActive(true); - - /* - GameObject lod0 = new GameObject(); - lod0.transform.parent = atmo.transform; - lod0.transform.localPosition = Vector3.zero; - MeshFilter f0 = lod0.AddComponent(); - f0.mesh = GameObject.Find("Atmosphere_LOD0").GetComponent().mesh; - MeshRenderer r0 = lod0.AddComponent(); - r0.material = mat; - - GameObject lod1 = new GameObject(); - lod1.transform.parent = atmo.transform; - lod1.transform.localPosition = Vector3.zero; - MeshFilter f1 = lod1.AddComponent(); - f1.mesh = GameObject.Find("Atmosphere_LOD1").GetComponent().mesh; - MeshRenderer r1 = lod1.AddComponent(); - r1.material = mat; - - GameObject lod2 = new GameObject(); - lod2.transform.parent = atmo.transform; - lod2.transform.localPosition = Vector3.zero; - MeshFilter f2 = lod2.AddComponent(); - f2.mesh = GameObject.Find("Atmosphere_LOD2").GetComponent().mesh; - MeshRenderer r2 = lod2.AddComponent(); - r2.material = mat; - - GameObject lod3 = new GameObject(); - lod3.transform.parent = atmo.transform; - lod3.transform.localPosition = Vector3.zero; - MeshFilter f3 = lod3.AddComponent(); - f3.mesh = GameObject.Find("Atmosphere_LOD3").GetComponent().mesh; - MeshRenderer r3 = lod3.AddComponent(); - r3.material = mat; - - LODGroup lodg = atmo.AddComponent(); - - LOD[] lodlist = new LOD[4]; - Renderer[] t0 = { r0 }; - Renderer[] t1 = { r1 }; - Renderer[] t2 = { r2 }; - Renderer[] t3 = { r3 }; - LOD one = new LOD(1, t0); - LOD two = new LOD(0.7f, t1); - LOD three = new LOD(0.27f, t2); - LOD four = new LOD(0.08f, t3); - lodlist[0] = one; - lodlist[1] = two; - lodlist[2] = three; - lodlist[3] = four; - - lodg.SetLODs(lodlist); - lodg.fadeMode = LODFadeMode.None; - */ } atmoGO.transform.localPosition = Vector3.zero; diff --git a/NewHorizons/Builder/Body/AsteroidBeltBuilder.cs b/NewHorizons/Builder/Body/AsteroidBeltBuilder.cs index d9789960..813e35d3 100644 --- a/NewHorizons/Builder/Body/AsteroidBeltBuilder.cs +++ b/NewHorizons/Builder/Body/AsteroidBeltBuilder.cs @@ -59,8 +59,6 @@ namespace NewHorizons.Builder.Body } }; - Logger.Log($"{config}"); - var asteroid = new NewHorizonsBody(new PlanetConfig(config), assets); Main.NextPassBodies.Add(asteroid); } diff --git a/NewHorizons/Builder/Body/StarBuilder.cs b/NewHorizons/Builder/Body/StarBuilder.cs index 66e0ef2d..b8c77df1 100644 --- a/NewHorizons/Builder/Body/StarBuilder.cs +++ b/NewHorizons/Builder/Body/StarBuilder.cs @@ -14,79 +14,93 @@ namespace NewHorizons.Builder.Body static class StarBuilder { private static Texture2D _colorOverTime; - public static void Make(GameObject body, Sector sector, StarModule starModule) + public static StarController Make(GameObject body, Sector sector, StarModule starModule) { if (_colorOverTime == null) _colorOverTime = Main.Instance.ModHelper.Assets.GetTexture("AssetBundle/StarColorOverTime.png"); - var sunGO = new GameObject("Star"); - sunGO.transform.parent = body.transform; + var starGO = new GameObject("Star"); + starGO.transform.parent = body.transform; - var sunSurface = GameObject.Instantiate(GameObject.Find("Sun_Body/Sector_SUN/Geometry_SUN/Surface"), sunGO.transform); + var sunSurface = GameObject.Instantiate(GameObject.Find("Sun_Body/Sector_SUN/Geometry_SUN/Surface"), starGO.transform); sunSurface.transform.localPosition = Vector3.zero; sunSurface.transform.localScale = Vector3.one; sunSurface.name = "Surface"; //var sunLight = GameObject.Instantiate(GameObject.Find("Sun_Body/Sector_SUN/Effects_SUN/SunLight"), sunGO.transform); var sunLight = new GameObject(); - sunLight.transform.parent = sunGO.transform; + sunLight.transform.parent = starGO.transform; sunLight.transform.localPosition = Vector3.zero; sunLight.transform.localScale = Vector3.one; sunLight.name = "StarLight"; var light = sunLight.AddComponent(); light.CopyPropertiesFrom(GameObject.Find("Sun_Body/Sector_SUN/Effects_SUN/SunLight").GetComponent()); - + light.intensity *= starModule.SolarLuminosity; - var solarFlareEmitter = GameObject.Instantiate(GameObject.Find("Sun_Body/Sector_SUN/Effects_SUN/SolarFlareEmitter"), sunGO.transform); + var faceActiveCamera = sunLight.AddComponent(); + faceActiveCamera.CopyPropertiesFrom(GameObject.Find("Sun_Body/Sector_SUN/Effects_SUN/SunLight").GetComponent()); + var csmTextureCacher = sunLight.AddComponent(); + csmTextureCacher.CopyPropertiesFrom(GameObject.Find("Sun_Body/Sector_SUN/Effects_SUN/SunLight").GetComponent()); + csmTextureCacher._light = light; + var proxyShadowLight = sunLight.AddComponent(); + proxyShadowLight.CopyPropertiesFrom(GameObject.Find("Sun_Body/Sector_SUN/Effects_SUN/SunLight").GetComponent()); + proxyShadowLight._light = light; + + var solarFlareEmitter = GameObject.Instantiate(GameObject.Find("Sun_Body/Sector_SUN/Effects_SUN/SolarFlareEmitter"), starGO.transform); solarFlareEmitter.transform.localPosition = Vector3.zero; solarFlareEmitter.transform.localScale = Vector3.one; solarFlareEmitter.name = "SolarFlareEmitter"; - var sunAudio = GameObject.Instantiate(GameObject.Find("Sun_Body/Sector_SUN/Audio_SUN"), sunGO.transform); + var sunAudio = GameObject.Instantiate(GameObject.Find("Sun_Body/Sector_SUN/Audio_SUN"), starGO.transform); sunAudio.transform.localPosition = Vector3.zero; sunAudio.transform.localScale = Vector3.one; sunAudio.transform.Find("SurfaceAudio_Sun").GetComponent().maxDistance = starModule.Size * 2f; sunAudio.name = "Audio_Star"; - var sunAtmosphere = GameObject.Instantiate(GameObject.Find("Sun_Body/Atmosphere_SUN"), sunGO.transform); + var sunAtmosphere = GameObject.Instantiate(GameObject.Find("Sun_Body/Atmosphere_SUN"), starGO.transform); sunAtmosphere.transform.localPosition = Vector3.zero; sunAtmosphere.transform.localScale = Vector3.one; sunAtmosphere.name = "Atmosphere_Star"; - var ambientLightGO = GameObject.Instantiate(GameObject.Find("Sun_Body/AmbientLight_SUN"), sunGO.transform); + var ambientLightGO = GameObject.Instantiate(GameObject.Find("Sun_Body/AmbientLight_SUN"), starGO.transform); ambientLightGO.transform.localPosition = Vector3.zero; ambientLightGO.name = "AmbientLight_Star"; - var heatVolume = GameObject.Instantiate(GameObject.Find("Sun_Body/Sector_SUN/Volumes_SUN/HeatVolume"), sunGO.transform); + var heatVolume = GameObject.Instantiate(GameObject.Find("Sun_Body/Sector_SUN/Volumes_SUN/HeatVolume"), starGO.transform); heatVolume.transform.localPosition = Vector3.zero; heatVolume.transform.localScale = Vector3.one; heatVolume.GetComponent().radius = 1f; heatVolume.name = "HeatVolume"; - var deathVolume = GameObject.Instantiate(GameObject.Find("Sun_Body/Sector_SUN/Volumes_SUN/ScaledVolumesRoot/DestructionFluidVolume"), sunGO.transform); + var deathVolume = GameObject.Instantiate(GameObject.Find("Sun_Body/Sector_SUN/Volumes_SUN/ScaledVolumesRoot/DestructionFluidVolume"), starGO.transform); deathVolume.transform.localPosition = Vector3.zero; deathVolume.transform.localScale = Vector3.one; deathVolume.GetComponent().radius = 1f; deathVolume.name = "DestructionVolume"; - - PlanetaryFogController fog = sunAtmosphere.transform.Find("FogSphere").GetComponent(); TessellatedSphereRenderer surface = sunSurface.GetComponent(); Light ambientLight = ambientLightGO.GetComponent(); - //GameObject.Destroy(sunLight.GetComponent()); - //GameObject.Destroy(sunLight.GetComponent()); - //GameObject.Destroy(sunLight.GetComponent()); - //SunLightController sunLightController = sunLight.GetComponent(); - //GameObject.Destroy(sunLight.GetComponent()); - //GameObject.Destroy(sunLightController); + Color lightColour = light.color; + if (starModule.LightTint != null) lightColour = starModule.LightTint.ToColor32(); + if (lightColour == null && starModule.Tint != null) + { + // Lighten it a bit + var r = Mathf.Clamp01(starModule.Tint.R * 1.5f / 255f); + var g = Mathf.Clamp01(starModule.Tint.G * 1.5f / 255f); + var b = Mathf.Clamp01(starModule.Tint.B * 1.5f / 255f); + lightColour = new Color(r, g, b); + } + if (lightColour != null) light.color = (Color)lightColour; + + light.color = lightColour; + ambientLight.color = lightColour; fog.fogRadius = starModule.Size * 1.2f; if(starModule.Tint != null) { var colour = starModule.Tint.ToColor32(); //sunLightController.sunColor = colour; - //ambientLight.color = colour; fog.fogTint = colour; var sun = GameObject.Find("Sun_Body"); @@ -94,8 +108,9 @@ namespace NewHorizons.Builder.Body var giantMaterial = sun.GetComponent().GetValue("_endSurfaceMaterial"); surface.sharedMaterial = new Material(starModule.Size >= 3000 ? giantMaterial : mainSequenceMaterial); - surface.sharedMaterial.color = new Color(colour.r * 8f / 255f, colour.g * 8f / 255f, colour.b * 8f / 255f); - surface.sharedMaterial.SetTexture("_ColorRamp", Utility.ImageUtilities.TintImage(_colorOverTime, colour)); + var mod = 8f * starModule.SolarLuminosity / 255f; + surface.sharedMaterial.color = new Color(colour.r * mod, colour.g * mod, colour.b * mod); + surface.sharedMaterial.SetTexture("_ColorRamp", ImageUtilities.TintImage(_colorOverTime, colour)); sunAtmosphere.transform.Find("AtmoSphere").transform.localScale = Vector3.one * (starModule.Size + 1000)/starModule.Size; foreach (var lod in sunAtmosphere.transform.Find("AtmoSphere").GetComponentsInChildren()) @@ -109,8 +124,19 @@ namespace NewHorizons.Builder.Body if(starModule.SolarFlareTint != null) solarFlareEmitter.GetComponent().tint = starModule.SolarFlareTint.ToColor32(); - sunGO.transform.localPosition = Vector3.zero; - sunGO.transform.localScale = starModule.Size * Vector3.one; + starGO.transform.localPosition = Vector3.zero; + starGO.transform.localScale = starModule.Size * Vector3.one; + + var starController = body.AddComponent(); + starController.Light = light; + starController.AmbientLight = ambientLight; + starController.FaceActiveCamera = faceActiveCamera; + starController.CSMTextureCacher = csmTextureCacher; + starController.ProxyShadowLight = proxyShadowLight; + starController.Intensity = starModule.SolarLuminosity; + starController.SunColor = lightColour; + + return starController; } } } diff --git a/NewHorizons/Builder/General/DetectorBuilder.cs b/NewHorizons/Builder/General/DetectorBuilder.cs index c8b05fbf..5e40239a 100644 --- a/NewHorizons/Builder/General/DetectorBuilder.cs +++ b/NewHorizons/Builder/General/DetectorBuilder.cs @@ -181,8 +181,6 @@ namespace NewHorizons.Builder.General secondaryInitialMotion.SetValue("_initLinearDirection", d2); secondaryInitialMotion.SetValue("_initLinearSpeed", -v2); - Logger.Log($"Velocity: {d1}, {v1}, {d2}, {v2}"); - // InitialMotion already set its speed so we overwrite that if (!primaryInitialMotion.GetValue("_isInitVelocityDirty")) { diff --git a/NewHorizons/External/AtmosphereModule.cs b/NewHorizons/External/AtmosphereModule.cs index 5265248d..229f9d5b 100644 --- a/NewHorizons/External/AtmosphereModule.cs +++ b/NewHorizons/External/AtmosphereModule.cs @@ -21,5 +21,6 @@ namespace NewHorizons.External public bool HasSnow { get; set; } public bool HasOxygen { get; set; } public bool HasAtmosphere { get; set; } + public MColor32 AtmosphereTint { get; set; } } } diff --git a/NewHorizons/External/StarModule.cs b/NewHorizons/External/StarModule.cs index d4286081..6288367b 100644 --- a/NewHorizons/External/StarModule.cs +++ b/NewHorizons/External/StarModule.cs @@ -9,10 +9,10 @@ namespace NewHorizons.External { public class StarModule : Module { - public float Size { get; set; } - public MColor32 Tint { get; set; } + public float Size { get; set; } = 2000f; + public MColor32 Tint { get; set; } public MColor32 SolarFlareTint { get; set; } public MColor32 LightTint { get; set; } - public float SolarLuminosity { get; set; } + public float SolarLuminosity { get; set; } = 1f; } } diff --git a/NewHorizons/Main.cs b/NewHorizons/Main.cs index aebe71e3..0f824b28 100644 --- a/NewHorizons/Main.cs +++ b/NewHorizons/Main.cs @@ -32,6 +32,8 @@ namespace NewHorizons public static float FurthestOrbit = 50000f; + private static StarLightController _starLightController; + public override object GetApi() { return new NewHorizonsApi(); @@ -69,6 +71,34 @@ namespace NewHorizons if (scene.name != "SolarSystem") { return; } + // Need to manage this when there are multiple stars + var sun = GameObject.Find("Sun_Body"); + var starController = sun.AddComponent(); + starController.Light = GameObject.Find("Sun_Body/Sector_SUN/Effects_SUN/SunLight").GetComponent(); + starController.AmbientLight = GameObject.Find("Sun_Body/AmbientLight_SUN").GetComponent(); + starController.FaceActiveCamera = GameObject.Find("Sun_Body/Sector_SUN/Effects_SUN/SunLight").GetComponent(); + starController.CSMTextureCacher = GameObject.Find("Sun_Body/Sector_SUN/Effects_SUN/SunLight").GetComponent(); + starController.ProxyShadowLight = GameObject.Find("Sun_Body/Sector_SUN/Effects_SUN/SunLight").GetComponent(); + starController.Intensity = 0.9859f; + starController.SunColor = new Color(1f, 0.8845f, 0.6677f, 1f); + + var starLightGO = GameObject.Instantiate(sun.GetComponentInChildren().gameObject); + foreach(var comp in starLightGO.GetComponents()) + { + if(!(comp is SunLightController) && !(comp is SunLightParamUpdater) && !(comp is Light) && !(comp is Transform)) + { + GameObject.Destroy(comp); + } + } + GameObject.Destroy(starLightGO.GetComponent()); + starLightGO.name = "StarLightController"; + + _starLightController = starLightGO.AddComponent(); + _starLightController.AddStar(starController); + + starLightGO.SetActive(true); + + // TODO: Make this configurable probably Instance.ModHelper.Events.Unity.FireOnNextUpdate(() => Locator.GetPlayerBody().gameObject.AddComponent()); AstroObjectLocator.RefreshList(); @@ -77,7 +107,7 @@ namespace NewHorizons AstroObjectLocator.AddAstroObject(ao); } - // Stars then planets then moons + // Stars then planets then moons (not necessary but probably speeds things up, maybe) var toLoad = BodyList.OrderBy(b => (b.Config.BuildPriority != -1 ? b.Config.BuildPriority : (b.Config.FocalPoint != null ? 0 : @@ -85,10 +115,10 @@ namespace NewHorizons (b.Config.Orbit.IsMoon ? 2 : 1) ))).ToList(); - var count = 0; + var passCount = 0; while (toLoad.Count != 0) { - Logger.Log($"Starting body loading pass #{++count}"); + Logger.Log($"Starting body loading pass #{++passCount}"); var flagNoneLoadedThisPass = true; foreach (var body in toLoad) { @@ -114,7 +144,7 @@ namespace NewHorizons NextPassBodies = new List(); // Infinite loop failsafe - if (count > 10) + if (passCount > 10) { Logger.Log("Something went wrong"); break; @@ -180,7 +210,6 @@ namespace NewHorizons return true; } - public void LoadConfigs(IModBehaviour mod) { var folder = mod.ModHelper.Manifest.ModFolderPath; @@ -278,8 +307,7 @@ namespace NewHorizons if (body.Config.Base.BlackHoleSize != 0) BlackHoleBuilder.Make(go, body.Config.Base, sector); - if (body.Config.Star != null) - StarBuilder.Make(go, sector, body.Config.Star); + if (body.Config.Star != null) _starLightController.AddStar(StarBuilder.Make(go, sector, body.Config.Star)); if (body.Config.FocalPoint != null) FocalPointBuilder.Make(go, body.Config.FocalPoint); @@ -352,7 +380,7 @@ namespace NewHorizons if (body.Config.Atmosphere.FogSize != 0) FogBuilder.Make(go, sector, body.Config.Atmosphere); - AtmosphereBuilder.Make(go, body.Config.Atmosphere); + AtmosphereBuilder.Make(go, body.Config.Atmosphere, body.Config.Base.SurfaceSize); } if (body.Config.Props != null) diff --git a/NewHorizons/Utility/NewHorizonExtensions.cs b/NewHorizons/Utility/NewHorizonExtensions.cs index 7a2e4e27..4a10d5ef 100644 --- a/NewHorizons/Utility/NewHorizonExtensions.cs +++ b/NewHorizons/Utility/NewHorizonExtensions.cs @@ -87,7 +87,14 @@ namespace NewHorizons.Utility continue; } - targetProperty.SetValue(destination, srcProp.GetValue(source, null), null); + try + { + targetProperty.SetValue(destination, srcProp.GetValue(source, null), null); + } catch(Exception) + { + Logger.LogWarning($"Couldn't copy property {targetProperty.Name} from {source} to {destination}"); + } + } } } diff --git a/NewHorizons/Utility/StarController.cs b/NewHorizons/Utility/StarController.cs new file mode 100644 index 00000000..143b8ca4 --- /dev/null +++ b/NewHorizons/Utility/StarController.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using UnityEngine; + +namespace NewHorizons.Utility +{ + public class StarController : MonoBehaviour + { + public Light Light; + public Light AmbientLight; + public FaceActiveCamera FaceActiveCamera; + public CSMTextureCacher CSMTextureCacher; + public ProxyShadowLight ProxyShadowLight; + public float Intensity; + public Color SunColor; + + public void Awake() + { + Disable(); + } + + public void Disable() + { + if (FaceActiveCamera != null) FaceActiveCamera.enabled = false; + if (CSMTextureCacher != null) CSMTextureCacher.enabled = false; + if (ProxyShadowLight != null) ProxyShadowLight.enabled = false; + } + + public void Enable() + { + if (FaceActiveCamera != null) FaceActiveCamera.enabled = true; + if (CSMTextureCacher != null) CSMTextureCacher.enabled = true; + if (ProxyShadowLight != null) ProxyShadowLight.enabled = true; + } + } +} diff --git a/NewHorizons/Utility/StarLightController.cs b/NewHorizons/Utility/StarLightController.cs new file mode 100644 index 00000000..fa53449f --- /dev/null +++ b/NewHorizons/Utility/StarLightController.cs @@ -0,0 +1,80 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using UnityEngine; +using Logger = NewHorizons.Utility.Logger; + +namespace NewHorizons.Utility +{ + [RequireComponent(typeof(SunLightController))] + [RequireComponent(typeof(SunLightParamUpdater))] + public class StarLightController : MonoBehaviour + { + private List _stars = new List(); + private StarController _activeStar; + + private SunLightController _sunLightController; + private SunLightParamUpdater _sunLightParamUpdater; + + public void Awake() + { + _sunLightController = GetComponent(); + _sunLightController.enabled = true; + _sunLightParamUpdater = GetComponent(); + _sunLightParamUpdater._sunLightController = _sunLightController; + } + + public void AddStar(StarController star) + { + Logger.Log($"Adding new star to list: {star.gameObject.name}"); + _stars.Add(star); + } + + public void Update() + { + // Player is always at 0,0,0 more or less + + if (_activeStar == null && _stars.Count > 0) + { + ChangeActiveStar(_stars[0]); + return; + } + + foreach(var star in _stars) + { + if (star != null && star.transform.position.sqrMagnitude < _activeStar.transform.position.sqrMagnitude) + { + ChangeActiveStar(star); + break; + } + } + } + + private void ChangeActiveStar(StarController star) + { + if (_sunLightController == null || _sunLightParamUpdater == null) return; + + if(_activeStar != null) _activeStar.Disable(); + + Logger.Log($"Switching active star: {star.gameObject.name}"); + + _activeStar = star; + + star.Enable(); + + _sunLightController._sunBaseColor = star.SunColor; + _sunLightController._sunBaseIntensity = star.Intensity; + _sunLightController._sunLight = star.Light; + _sunLightController._ambientLight = star.AmbientLight; + + _sunLightParamUpdater.sunLight = star.Light; + _sunLightParamUpdater._sunController = star.transform.GetComponent(); + + // For the param thing to work it wants this to be on the star idk + this.transform.parent = star.transform; + this.transform.localPosition = Vector3.zero; + } + } +}