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"; }
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 } }
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); }