/// <summary> /// Creates a new ScaledVersion Loader from a spawned CelestialBody. /// </summary> public ScaledVersionLoader(CelestialBody body) { // Is this a spawned body? if (body.scaledBody == null || Injector.IsInPrefab) { throw new InvalidOperationException("The body must be already spawned by the PSystemManager."); } // Get the scaled version object Value = body; Coronas = Value.scaledBody.GetComponentsInChildren <SunCoronas>(true).Select(c => new CoronaLoader(c)) .ToList(); if (!Coronas.Any()) { Coronas = null; } if (Type != ScaledMaterialType.Star) { ScaledSpaceFader fader = Value.scaledBody.GetComponent <ScaledSpaceFader>(); if (!(fader is SharedScaledSpaceFader)) { Utility.CopyObjectFields(fader, Value.scaledBody.AddComponent <SharedScaledSpaceFader>()); Object.Destroy(fader); } } else { SunShaderController controller = Value.scaledBody.GetComponent <SunShaderController>(); if (controller != null && !(controller is SharedSunShaderController)) { Utility.CopyObjectFields(controller, Value.scaledBody.AddComponent <SharedSunShaderController>()); Object.Destroy(controller); } } if (Options != null) { return; } Options = new PlanetTextureExporter.TextureOptions(); if (body.pqsController == null) { return; } Options.Resolution = body.pqsController.mapFilesize; Options.TextureDelta = body.pqsController.mapMaxHeight; }
public static void SetTransformed(bool transformed) { Debug.Log("JoolNova - SetTransformed = " + transformed); // Initialize static variables if (jool == null) { Debug.Log("JoolNova - Doing one-time setup"); jool = PSystemManager.Instance.localBodies.Find(b => b.name == "Jool"); sun = PSystemManager.Instance.localBodies.Find(b => b.name == "Sun"); // Setup materials MeshRenderer sunRenderer = sun.scaledBody.GetComponent <MeshRenderer>(); MeshRenderer joolRenderer = jool.scaledBody.GetComponent <MeshRenderer>(); joolMaterial = joolRenderer.material; sunMaterial = Instantiate(sunRenderer.material) as Material; sunMaterial.SetColor(Shader.PropertyToID("_EmitColor0"), newSunColor); sunMaterial.SetColor(Shader.PropertyToID("_EmitColor1"), newSunColor2); sunMaterial.SetColor(Shader.PropertyToID("_RimColor"), newSunColor3); // Add in sun shader SunShaderController sunShader = sun.scaledBody.gameObject.GetComponent <SunShaderController>(); SunShaderController joolSunShader = jool.scaledBody.gameObject.AddComponent <SunShaderController>(); foreach (FieldInfo field in typeof(SunShaderController).GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)) { field.SetValue(joolSunShader, field.GetValue(sunShader)); } joolSunShader.enabled = false; // Add in the coronas foreach (Transform t in sun.scaledBody.transform) { if (t != null && t.gameObject != null) { GameObject corona = (GameObject)Instantiate(t.gameObject); corona.name = "Corona"; corona.transform.parent = jool.scaledBody.transform; corona.SetActive(false); corona.transform.localPosition = Vector3.zero; MeshRenderer coronaRenderer = corona.GetComponent <MeshRenderer>(); Texture2D coronaTex = GameDatabase.Instance.GetTexture("ContractPacks/JoolianEncounter/Images/redsuncorona", false); coronaRenderer.material = Instantiate(coronaRenderer.material) as Material; coronaRenderer.material.SetColor(Shader.PropertyToID("_TintColor"), newSunColor); coronaRenderer.material.SetTexture(Shader.PropertyToID("_MainTex"), coronaTex); } } } // Remove the sun object if (secondSun != null && !transformed) { Destroy(secondSun.gameObject); secondSun = null; } // Do the transform if (JoolNova.transformed != transformed) { JoolNova.transformed = transformed; MeshRenderer joolRenderer = jool.scaledBody.GetComponent <MeshRenderer>(); // Set the material joolRenderer.material = transformed ? sunMaterial : joolMaterial; // Turn components on/off joolRenderer.GetComponent <SunShaderController>().enabled = transformed; joolRenderer.GetComponent <ScaledSpaceFader>().enabled = !transformed; joolRenderer.GetComponent <MaterialSetDirection>().enabled = !transformed; joolRenderer.GetComponent <MeshRenderer>().enabled = true; // Turn gameObjects on/off foreach (Transform t in joolRenderer.transform) { if (t != null && t.gameObject != null) { t.gameObject.SetActive((t.gameObject.name == "Atmosphere") ^ transformed); } } } }
/// <summary> /// Creates a new ScaledVersion Loader from a spawned CelestialBody. /// </summary> public ScaledVersionLoader(CelestialBody body) { // Is this a spawned body? if (body.scaledBody == null || Injector.IsInPrefab) { throw new InvalidOperationException("The body must be already spawned by the PSystemManager."); } // Get the scaled version object Value = body; Coronas = Value.scaledBody.GetComponentsInChildren <SunCoronas>(true).Select(c => new CoronaLoader(c)) .ToList(); if (!Coronas.Any()) { Coronas = null; } // Figure out what kind of body we are if (Value.scaledBody.GetComponentsInChildren <SunShaderController>(true).Length > 0) { Type = BodyType.Star; } else if (Value.atmosphere) { Type = BodyType.Atmospheric; } else { Type = BodyType.Vacuum; } if (Type != BodyType.Star) { ScaledSpaceFader fader = Value.scaledBody.GetComponent <ScaledSpaceFader>(); if (!(fader is SharedScaledSpaceFader)) { Utility.CopyObjectFields(fader, Value.scaledBody.AddComponent <SharedScaledSpaceFader>()); Object.Destroy(fader); } } else { SunShaderController controller = Value.scaledBody.GetComponent <SunShaderController>(); if (controller != null && !(controller is SharedSunShaderController)) { Utility.CopyObjectFields(controller, Value.scaledBody.AddComponent <SharedSunShaderController>()); Object.Destroy(controller); } } // Assign the proper scaled space loaders if (Material == null) { return; } if (ScaledPlanetSimple.UsesSameShader(Material)) { Material = new ScaledPlanetSimpleLoader(Material); } if (ScaledPlanetRimAerial.UsesSameShader(Material)) { Material = new ScaledPlanetRimAerialLoader(Material); } if (EmissiveMultiRampSunspots.UsesSameShader(Material)) { Material = new EmissiveMultiRampSunspotsLoader(Material); } if (Options != null) { return; } Options = new PlanetTextureExporter.TextureOptions(); if (body.pqsController == null) { return; } Options.Resolution = body.pqsController.mapFilesize; Options.TextureDelta = body.pqsController.mapMaxHeight; }
// Parser apply event void IParserEventSubscriber.Apply(ConfigNode node) { // Get any existing material we might have on this scaled version ConfigNode data = node.GetNode(MATERIAL_NODE_NAME); // Check for bad condition (no material, no new material) if (Material == null && data == null) { throw new Exception("Scaled version has no material information"); } // Are we a planet or moon? if (Type.Value != BodyType.Star) { // If we are not a star, we need a scaled space fader and a sphere collider ScaledSpaceFader fader = Value.scaledBody.GetComponent <ScaledSpaceFader>(); if (fader == null) { fader = Value.scaledBody.AddComponent <SharedScaledSpaceFader>(); fader.floatName = "_Opacity"; fader.celestialBody = Value; } else if (!(fader is SharedScaledSpaceFader)) { Utility.CopyObjectFields(fader, Value.scaledBody.AddComponent <SharedScaledSpaceFader>()); Object.DestroyImmediate(fader); } // Add a sphere collider if we need one if (Value.scaledBody.GetComponent <SphereCollider>() == null) { SphereCollider collider = Value.scaledBody.AddComponent <SphereCollider>(); collider.center = Vector3.zero; collider.radius = 1000.0f; } // Generate new atmospheric body material if (Type.Value == BodyType.Atmospheric) { if (Material != null && ScaledPlanetRimAerial.UsesSameShader(Material)) { Material = new ScaledPlanetRimAerialLoader(Material); } else { Material = new ScaledPlanetRimAerialLoader(); } Material.name = Guid.NewGuid().ToString(); } // Generate new vacuum body material else { if (Material != null && ScaledPlanetSimple.UsesSameShader(Material)) { Material = new ScaledPlanetSimpleLoader(Material); } else { Material = new ScaledPlanetSimpleLoader(); } Material.name = Guid.NewGuid().ToString(); } } // Otherwise we are a star else { // Add the SunShaderController behavior SunShaderController controller = Value.scaledBody.GetComponent <SunShaderController>(); if (controller == null) { Value.scaledBody.AddComponent <SharedSunShaderController>(); } else if (!(controller is SharedSunShaderController)) { Utility.CopyObjectFields(controller, Value.scaledBody.AddComponent <SharedSunShaderController>()); Object.DestroyImmediate(controller); } // Add the ScaledSun behavior // TODO - apparently there can only be one of these (or it destroys itself) if (Value.scaledBody.GetComponent <ScaledSun>() == null) { Value.scaledBody.AddComponent <ScaledSun>(); } // Add the Kopernicus star component Value.scaledBody.AddComponent <StarComponent>(); // Generate a new material for the star if (Material != null && EmissiveMultiRampSunspots.UsesSameShader(Material)) { Material = new EmissiveMultiRampSunspotsLoader(Material); } else { Material = new EmissiveMultiRampSunspotsLoader(); } Material.name = Guid.NewGuid().ToString(); // Backup existing coronas foreach (SunCoronas corona in Value.scaledBody.GetComponentsInChildren <SunCoronas>(true)) { corona.transform.parent = Utility.Deactivator; } } // Event Events.OnScaledVersionLoaderApply.Fire(this, node); }
// Parser apply event void IParserEventSubscriber.Apply(ConfigNode node) { // Are we a planet or moon? if (Type != ScaledMaterialType.Star) { // If we are not a star, we need a scaled space fader and a sphere collider ScaledSpaceFader fader = Value.scaledBody.GetComponent <ScaledSpaceFader>(); if (fader == null) { fader = Value.scaledBody.AddComponent <SharedScaledSpaceFader>(); fader.floatName = "_Opacity"; fader.celestialBody = Value; } else if (!(fader is SharedScaledSpaceFader)) { Utility.CopyObjectFields(fader, Value.scaledBody.AddComponent <SharedScaledSpaceFader>()); Object.DestroyImmediate(fader); } // Add a sphere collider if we need one if (Value.scaledBody.GetComponent <SphereCollider>() == null) { SphereCollider collider = Value.scaledBody.AddComponent <SphereCollider>(); collider.center = Vector3.zero; collider.radius = 1000.0f; } } // Otherwise we are (likely) a star else if (Type == ScaledMaterialType.Star) { // Add the SunShaderController behavior SunShaderController controller = Value.scaledBody.GetComponent <SunShaderController>(); if (controller == null) { Value.scaledBody.AddComponent <SharedSunShaderController>(); } else if (!(controller is SharedSunShaderController)) { Utility.CopyObjectFields(controller, Value.scaledBody.AddComponent <SharedSunShaderController>()); Object.DestroyImmediate(controller); } // Add the ScaledSun behavior // TODO - apparently there can only be one of these (or it destroys itself) if (Value.scaledBody.GetComponent <ScaledSun>() == null) { Value.scaledBody.AddComponent <ScaledSun>(); } // Add the Kopernicus star component Value.scaledBody.AddComponent <StarComponent>(); // Backup existing coronas foreach (SunCoronas corona in Value.scaledBody.GetComponentsInChildren <SunCoronas>(true)) { corona.transform.parent = Utility.Deactivator; } } // Event Events.OnScaledVersionLoaderApply.Fire(this, node); }