Ejemplo n.º 1
0
        /// <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;
        }
Ejemplo n.º 2
0
        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);
                    }
                }
            }
        }
Ejemplo n.º 3
0
        /// <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;
        }
Ejemplo n.º 4
0
        // 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);
        }
Ejemplo n.º 5
0
        // 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);
        }