internal void Apply(Material mat, CelestialBody cb, List <CelestialBody> list, GameObject go, ScreenSpaceShadow scShadow)
 {
     shadowMat           = mat;
     body                = cb;
     shadowList          = list;
     screenSpaceShadowGO = go;
     screenSpaceShadow   = scShadow;
 }
        internal void Apply(CelestialBody celestialBody, Transform scaledCelestialTransform, CloudsMaterial cloudsMaterial, string name, float radius, float arc, Tools.Layer layer = Tools.Layer.Scaled)
        {
            CloudsManager.Log("Applying 2D clouds...");
            Remove();
            this.celestialBody            = celestialBody;
            this.scaledCelestialTransform = scaledCelestialTransform;
            if (arc == 360)
            {
                HalfSphere hp = new HalfSphere(radius, ref CloudMaterial, CloudShader);
                CloudMesh = hp.GameObject;
            }
            else
            {
                UVSphere hp = new UVSphere(radius, arc, ref CloudMaterial, CloudShader);
                CloudMesh = hp.GameObject;
            }
            CloudMesh.name            = name;
            CloudMaterial.name        = "Clouds2D";
            this.radius               = radius;
            this.arc                  = arc;
            macroCloudMaterial.Radius = radius;
            this.cloudsMat            = cloudsMaterial;
            this.scaledLayer          = layer;

            CloudMaterial.SetMatrix(ShaderProperties._ShadowBodies_PROPERTY, Matrix4x4.zero);

            if (shadowMaterial != null)
            {
                ShadowProjectorGO                = new GameObject("EVE ShadowProjector");
                ShadowProjector                  = ShadowProjectorGO.AddComponent <Projector>();
                ShadowProjector.nearClipPlane    = 10;
                ShadowProjector.fieldOfView      = 60;
                ShadowProjector.aspectRatio      = 1;
                ShadowProjector.orthographic     = true;
                ShadowProjector.transform.parent = celestialBody.transform;
                ShadowProjector.material         = new Material(CloudShadowShader);
                shadowMaterial.ApplyMaterialProperties(ShadowProjector.material);

                // Workaround Unity bug (Case 841236)
                ShadowProjector.enabled = false;
                ShadowProjector.enabled = true;

                // Here create the screenSpaceShadowMaterialStuff
                screenSpaceShadowGO = new GameObject("EVE ScreenSpaceShadow");
                screenSpaceShadowGO.transform.parent = celestialBody.transform;
                screenSpaceShadow          = screenSpaceShadowGO.AddComponent <ScreenSpaceShadow>(); //can this be a single class that will handle the mesh, and meshrenderer and everything?
                screenSpaceShadow.material = new Material(ScreenSpaceCloudShadowShader);
                shadowMaterial.ApplyMaterialProperties(screenSpaceShadow.material);
                screenSpaceShadow.Init();
                screenSpaceShadowGO.SetActive(false);
                screenSpaceShadow.SetActive(false);
            }


            Scaled = true;
        }
        public void Apply()
        {
            ShadowManager.Log("Applying to " + body);
            CelestialBody celestialBody = Tools.GetCelestialBody(body);

            Transform transform = Tools.GetScaledTransform(body);

            if (transform != null)
            {
                Renderer mr = transform.GetComponent <Renderer>();
                if (mr != null && hasSurface)
                {
                    shadowMat = new Material(ShadowShader);
                    GameObject go = new GameObject();
                    go.name = "EVE Shadows";

                    localShadowMat = new Material(ScreenSpaceShadowShader);

                    screenSpaceShadowGO = new GameObject("EVE Celestial ScreenSpaceShadow");
                    screenSpaceShadowGO.transform.parent = celestialBody.transform;
                    screenSpaceShadow          = screenSpaceShadowGO.AddComponent <ScreenSpaceShadow>();
                    screenSpaceShadow.material = localShadowMat;
                    screenSpaceShadow.Init();
                    screenSpaceShadowGO.SetActive(false);
                    screenSpaceShadow.SetActive(false);

                    shadowMat.SetFloat(ShaderProperties._SunRadius_PROPERTY, (float)(ScaledSpace.InverseScaleFactor * Sun.Instance.sun.Radius));
                    localShadowMat.SetFloat(ShaderProperties._SunRadius_PROPERTY, (float)(Sun.Instance.sun.Radius));

                    shadowMat.name        = materialName;
                    shadowMat.renderQueue = (int)Tools.Queue.Geometry + 3;

                    localShadowMat.name        = materialName;
                    localShadowMat.renderQueue = (int)Tools.Queue.Geometry + 3;

                    DeferredRenderer.Add(mr.gameObject, shadowMat);
                }

                ScaledShadowComponent sc  = transform.gameObject.AddComponent <ScaledShadowComponent>();
                LocalShadowComponent  lsc = FlightCamera.fetch.mainCamera.gameObject.AddComponent <LocalShadowComponent>();

                List <CelestialBody> casters = new List <CelestialBody>();
                if (caster != null)
                {
                    foreach (String b in caster)
                    {
                        casters.Add(Tools.GetCelestialBody(b));
                    }
                }
                sc.Apply(shadowMat, celestialBody, casters);
                lsc.Apply(localShadowMat, celestialBody, casters, screenSpaceShadowGO, screenSpaceShadow);
            }

            ApplyToMainMenu();

            GameEvents.onGameSceneLoadRequested.Add(SceneLoaded);
            if (HighLogic.LoadedScene == GameScenes.MAINMENU)
            {
                ApplyToMainMenu();
            }
        }