diff --git a/NewHorizons/Builder/StarSystem/SkyboxBuilder.cs b/NewHorizons/Builder/StarSystem/SkyboxBuilder.cs index d447fe69..f3557854 100644 --- a/NewHorizons/Builder/StarSystem/SkyboxBuilder.cs +++ b/NewHorizons/Builder/StarSystem/SkyboxBuilder.cs @@ -1,12 +1,63 @@ using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; +using NewHorizons.External.Configs; +using NewHorizons.Utility; +using OWML.Common; +using UnityEngine; +using Logger = NewHorizons.Utility.Logger; +using Object = System.Object; namespace NewHorizons.Builder.StarSystem { - class SkyboxBuilder + internal class SkyboxBuilder { + public static Material LoadMaterial(string assetBundle, string path, string uniqueModName, IModBehaviour mod) + { + string key = uniqueModName + "." + assetBundle; + AssetBundle bundle; + Material cubemap; + + try + { + if (Main.AssetBundles.ContainsKey(key)) bundle = Main.AssetBundles[key]; + else + { + bundle = mod.ModHelper.Assets.LoadBundle(assetBundle); + Main.AssetBundles[key] = bundle; + } + } + catch (Exception e) + { + Logger.LogError($"Couldn't load AssetBundle {assetBundle} : {e.Message}"); + return null; + } + + try + { + cubemap = bundle.LoadAsset(path); + } + catch (Exception e) + { + Logger.Log($"Couldn't load asset {path} from AssetBundle {assetBundle} : {e.Message}"); + return null; + } + + return cubemap; + } + + public static void Make(StarSystemConfig.SkyboxConfig info, IModBehaviour mod) + { + Logger.Log("Building Skybox"); + Material skyBoxMaterial = LoadMaterial(info.assetBundle, info.path, mod.ModHelper.Manifest.UniqueName, mod); + RenderSettings.skybox = skyBoxMaterial; + DynamicGI.UpdateEnvironment(); + Main.Instance.ModHelper.Events.Unity.FireOnNextUpdate(() => + { + foreach (var camera in Resources.FindObjectsOfTypeAll()) + { + camera.clearFlags = CameraClearFlags.Skybox; + } + }); + } + } } diff --git a/NewHorizons/External/Configs/StarSystemConfig.cs b/NewHorizons/External/Configs/StarSystemConfig.cs index 29f117ce..f0c2be3a 100644 --- a/NewHorizons/External/Configs/StarSystemConfig.cs +++ b/NewHorizons/External/Configs/StarSystemConfig.cs @@ -14,6 +14,7 @@ namespace NewHorizons.External.Configs public bool destroyStockPlanets = true; public string factRequiredForWarp; public NomaiCoordinates coords; + public SkyboxConfig skybox; public class NomaiCoordinates { @@ -22,6 +23,14 @@ namespace NewHorizons.External.Configs public int[] z; } + public class SkyboxConfig + { + public string assetBundle = null; + public string path = null; + public bool destroyStarField = false; + } + public StarSystemConfig(Dictionary dict) : base(dict) { } + } } diff --git a/NewHorizons/Handlers/SystemCreationHandler.cs b/NewHorizons/Handlers/SystemCreationHandler.cs index 8465ba9f..ad50a626 100644 --- a/NewHorizons/Handlers/SystemCreationHandler.cs +++ b/NewHorizons/Handlers/SystemCreationHandler.cs @@ -5,7 +5,10 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using NewHorizons.Builder.StarSystem; using UnityEngine; +using Logger = NewHorizons.Utility.Logger; +using Object = UnityEngine.Object; namespace NewHorizons.Handlers { @@ -17,23 +20,15 @@ namespace NewHorizons.Handlers var skybox = GameObject.Find("Skybox/Starfield"); - /* - skybox.GetComponent().material.shader = Shader.Find("Standard"); - */ + if (system.Config.skybox?.destroyStarField ?? false) + { + Object.Destroy(skybox); + } - /* - var sphere = GameObject.CreatePrimitive(PrimitiveType.Sphere); - GameObject.Destroy(sphere.GetComponent()); - - sphere.transform.parent = skybox.transform; - sphere.transform.localPosition = Vector3.zero; - - var meshFilter = sphere.GetComponent(); - meshFilter.mesh.triangles = meshFilter.mesh.triangles.Reverse().ToArray(); - - var meshRenderer = sphere.GetComponent(); - meshRenderer.material.color = Color.green; - */ + if (system.Config.skybox?.assetBundle != null && system.Config.skybox?.path != null) + { + SkyboxBuilder.Make(system.Config.skybox, system.Mod); + } } } diff --git a/NewHorizons/Main.cs b/NewHorizons/Main.cs index b5098122..9303e800 100644 --- a/NewHorizons/Main.cs +++ b/NewHorizons/Main.cs @@ -95,6 +95,30 @@ namespace NewHorizons _wasConfigured = true; } + public static void ResetConfigs(bool resetTranslation = true) + { + BodyDict.Clear(); + SystemDict.Clear(); + + BodyDict["SolarSystem"] = new List(); + BodyDict["EyeOfTheUniverse"] = new List(); // Keep this empty tho fr + SystemDict["SolarSystem"] = new NewHorizonsSystem("SolarSystem", new StarSystemConfig(null), Instance) + { + Config = + { + destroyStockPlanets = false + } + }; + foreach (AssetBundle bundle in AssetBundles.Values) + { + bundle.Unload(true); + } + AssetBundles.Clear(); + if (!resetTranslation) return; + TranslationHandler.ClearTables(); + TextTranslation.Get().SetLanguage(TextTranslation.Get().GetLanguage()); + } + public void Start() { // Patches @@ -111,12 +135,8 @@ namespace NewHorizons GlobalMessenger.AddListener("WakeUp", new Callback(OnWakeUp)); ShaderBundle = Main.Instance.ModHelper.Assets.LoadBundle("AssetBundle/shader"); - BodyDict["SolarSystem"] = new List(); - BodyDict["EyeOfTheUniverse"] = new List(); // Keep this empty tho fr - - SystemDict["SolarSystem"] = new NewHorizonsSystem("SolarSystem", new StarSystemConfig(null), this); - SystemDict["SolarSystem"].Config.destroyStockPlanets = false; - + ResetConfigs(resetTranslation: false); + Logger.Log("Begin load of config files...", Logger.LogType.Log); try diff --git a/NewHorizons/Utility/DebugReload.cs b/NewHorizons/Utility/DebugReload.cs index 60feb96b..ecbfb00d 100644 --- a/NewHorizons/Utility/DebugReload.cs +++ b/NewHorizons/Utility/DebugReload.cs @@ -31,20 +31,9 @@ namespace NewHorizons.Utility private static void ReloadConfigs() { - Main.BodyDict.Clear(); - Main.SystemDict.Clear(); - - Main.BodyDict["SolarSystem"] = new List(); - Main.SystemDict["SolarSystem"] = new NewHorizonsSystem("SolarSystem", new StarSystemConfig(null), Main.Instance); - foreach (AssetBundle bundle in Main.AssetBundles.Values) - { - bundle.Unload(true); - } - Main.AssetBundles.Clear(); - TranslationHandler.ClearTables(); - TextTranslation.Get().SetLanguage(TextTranslation.Get().GetLanguage()); - Logger.Log("Begin reload of config files...", Logger.LogType.Log); + + Main.ResetConfigs(); try { diff --git a/NewHorizons/manifest.json b/NewHorizons/manifest.json index cd50ba7e..f75b1a65 100644 --- a/NewHorizons/manifest.json +++ b/NewHorizons/manifest.json @@ -3,7 +3,7 @@ "author": "xen, Bwc9876, & Book", "name": "New Horizons", "uniqueName": "xen.NewHorizons", - "version": "0.13.0", + "version": "0.13.1", "owmlVersion": "2.1.0", "conflicts": [ "Raicuparta.QuantumSpaceBuddies", "Vesper.AutoResume" ], "pathsToPreserve": [ "planets", "systems", "translations" ] diff --git a/NewHorizons/star_system_schema.json b/NewHorizons/star_system_schema.json index b31179ed..be3573b1 100644 --- a/NewHorizons/star_system_schema.json +++ b/NewHorizons/star_system_schema.json @@ -19,6 +19,25 @@ "destroyStockPlanets": { "type": "bool", "description": "Do you want a clean slate for this star system? Or will it be a modified version of the original." + }, + "skybox": { + "type": "object", + "description": "Options for the skybox of your system", + "properties": { + "destroyStarField": { + "type": "boolean", + "description": "Whether to destroy the star field around the player (always set to true if `assetBundle` and `path` is set)", + "default": false + }, + "assetBundle": { + "type": "string", + "description": "Path to the Unity asset bundle to load the skybox material from" + }, + "path": { + "type": "string", + "description": "Path to the material within the asset bundle specified by `assetBundle` to use for the skybox" + } + } } } }