Esempio n. 1
0
        private void SetupSkyKight()
        {
            Material skyMat = RenderSettings.skybox;

            GameObject     skyKight       = new GameObject();
            BakerySkyLight bakerySkyLight = skyKight.AddComponent <BakerySkyLight>();

            skyKight.name = "Skylight";

            if (skyMat.HasProperty("_Tex") && skyMat.HasProperty("_Exposure") && skyMat.HasProperty("_Tint"))
            {
                bakerySkyLight.cubemap = skyMat.GetTexture("_Tex") as Cubemap;
                float exposure     = skyMat.GetFloat("_Exposure");
                bool  exposureSRGB = skyMat.shader.name == "Skybox/Cubemap";
                if (exposureSRGB)
                {
                    exposure  = Mathf.Pow(exposure, 2.2f);                                  // can't detect [Gamma] keyword...
                    exposure *= PlayerSettings.colorSpace == ColorSpace.Linear ? 4.59f : 2; // weird unity constant
                }
                bakerySkyLight.intensity = exposure;
                bakerySkyLight.color     = skyMat.GetColor("_Tint");

                float matAngle = 0;
                if (skyMat.HasProperty("_Rotation"))
                {
                    matAngle = skyMat.GetFloat("_Rotation");
                }
                var matQuat = Quaternion.Euler(0, matAngle, 0);
                bakerySkyLight.transform.rotation = matQuat;
            }
            skyKight.tag = "EditorOnly";
        }
Esempio n. 2
0
    static public void BuildSkyLight(BakerySkyLight obj, bool texDirty, string outName = "sky.bin")
    {
        if (!allowOverwrite && lightSaved.ContainsKey(outName))
        {
            return;
        }
        lightSaved[outName] = true;

        var folder = ftBuildGraphics.scenePath;//Directory.GetParent(Application.dataPath).FullName + "/frender";

        if (!Directory.Exists(folder))
        {
            Directory.CreateDirectory(folder);
        }
        var f = new BinaryWriter(File.Open(folder + "/" + outName, FileMode.Create));

        #if SRGBCONVERT
        f.Write(obj.color.linear.r * obj.intensity);
        f.Write(obj.color.linear.g * obj.intensity);
        f.Write(obj.color.linear.b * obj.intensity);
        #else
        f.Write(obj.color.r * obj.intensity);
        f.Write(obj.color.g * obj.intensity);
        f.Write(obj.color.b * obj.intensity);
        #endif

        f.Write(obj.samples);
        f.Write(obj.hemispherical);

        f.Write("sky" + obj.UID + ".dds");

        f.Close();

        if (texDirty)
        {
            /*
             * // Disable cubemap compression, so texture is half-float
             * var importer = AssetImporter.GetAtPath(AssetDatabase.GetAssetPath(obj.cubemap)) as TextureImporter;
             * if (importer.textureCompression != TextureImporterCompression.Uncompressed)
             * {
             *  importer.textureCompression = TextureImporterCompression.Uncompressed;
             *  importer.SaveAndReimport();
             * }
             */

            ftBuildGraphics.InitShaders();
            ftBuildGraphics.SaveSky(obj.cubemap.GetNativeTexturePtr(),
                                    obj.transform.right.x,
                                    obj.transform.right.y,
                                    obj.transform.right.z,
                                    obj.transform.up.x,
                                    obj.transform.up.y,
                                    obj.transform.up.z,
                                    obj.transform.forward.x,
                                    obj.transform.forward.y,
                                    obj.transform.forward.z,
                                    folder + "/sky" + obj.UID + ".dds"
                                    );
            GL.IssuePluginEvent(3); // convert cubemap to small lat/lon DDS
        }
    }
Esempio n. 3
0
        private void SetupScenes()
        {
            if (modScene == null)
            {
                Debug.LogWarning("[BakeryAutoSetup] SceneAsset is null.");
                return;
            }
            Scene scene = SceneManager.GetSceneByPath(AssetDatabase.GetAssetPath(modScene));

            if (scene == null)
            {
                Debug.LogWarning("[BakeryAutoSetup] Scene cannot load.");
                return;
            }

            Light[]          pointLights       = new Light[] { };
            Light[]          areaLights        = new Light[] { };
            Light[]          directionalLights = new Light[] { };
            BakerySkyLight[] skyLights         = new BakerySkyLight[] { };
            GameObject[]     rootObjects       = scene.GetRootGameObjects();
            Transform[]      transforms        = new Transform[] { };

            foreach (GameObject gameObject in rootObjects)
            {
                transforms = transforms.Concat(new Transform[] { }).Concat(gameObject.GetComponentsInChildren <Transform>()).ToArray();
            }

            foreach (Transform transform in transforms)
            {
                Light light = transform.GetComponent <Light>();
                if (light != null && light.enabled && light.lightmapBakeType == LightmapBakeType.Baked && light.gameObject.activeInHierarchy)
                {
                    if (light.type == LightType.Point || light.type == LightType.Spot)
                    {
                        pointLights = pointLights.Concat(new Light[] { light }).ToArray();
                    }
                    if (light.type == LightType.Area)
                    {
                        areaLights = areaLights.Concat(new Light[] { light }).ToArray();
                    }
                    if (light.type == LightType.Directional)
                    {
                        directionalLights = directionalLights.Concat(new Light[] { light }).ToArray();
                    }
                }
                BakerySkyLight bakerySkyLight = transform.GetComponent <BakerySkyLight>();
                if (bakerySkyLight != null)
                {
                    skyLights = skyLights.Concat(new BakerySkyLight[] { bakerySkyLight }).ToArray();
                }
            }
            foreach (Light pointLight in pointLights)
            {
                SetupPointLight(pointLight);
                pointLight.enabled = false;
                pointLight.tag     = "EditorOnly";
            }
            foreach (Light areaLight in areaLights)
            {
                SetupAreaLight(areaLight);
                areaLight.enabled = false;
                areaLight.tag     = "EditorOnly";
            }
            foreach (Light directionalLight in directionalLights)
            {
                SetupDirectionalLight(directionalLight);
                directionalLight.enabled = false;
                directionalLight.tag     = "EditorOnly";
            }
            if (skyLights.Length == 0)
            {
                SetupSkyKight();
            }
            EditorSceneManager.MarkSceneDirty(scene);
        }