示例#1
0
        private static void LoadXML(XmlElement materialEditorElement)
        {
            if (materialEditorElement == null)
            {
                return;
            }
            var shaderElements = materialEditorElement.GetElementsByTagName("Shader");

            foreach (var shaderElementObj in shaderElements)
            {
                if (shaderElementObj != null)
                {
                    var    shaderElement = (XmlElement)shaderElementObj;
                    string shaderName    = shaderElement.GetAttribute("Name");

                    if (LoadedShaders.ContainsKey(shaderName))
                    {
                        Destroy(LoadedShaders[shaderName].Shader);
                        LoadedShaders.Remove(shaderName);
                    }
                    var shader = LoadShader(shaderName, shaderElement.GetAttribute("AssetBundle"), shaderElement.GetAttribute("Asset"));
                    LoadedShaders[shaderName] = new ShaderData(shader, shaderName, shaderElement.GetAttribute("RenderQueue"), shaderElement.GetAttribute("ShaderOptimization"));

                    XMLShaderProperties[shaderName] = new Dictionary <string, ShaderPropertyData>();
                    var shaderPropertyElements = shaderElement.GetElementsByTagName("Property");
                    foreach (var shaderPropertyElementObj in shaderPropertyElements)
                    {
                        if (shaderPropertyElementObj != null)
                        {
                            var shaderPropertyElement = (XmlElement)shaderPropertyElementObj;

                            string             propertyName   = shaderPropertyElement.GetAttribute("Name");
                            ShaderPropertyType propertyType   = (ShaderPropertyType)Enum.Parse(typeof(ShaderPropertyType), shaderPropertyElement.GetAttribute("Type"));
                            string             defaultValue   = shaderPropertyElement.GetAttribute("DefaultValue");
                            string             defaultValueAB = shaderPropertyElement.GetAttribute("DefaultValueAssetBundle");
                            string             range          = shaderPropertyElement.GetAttribute("Range");
                            string             min            = null;
                            string             max            = null;
                            if (!range.IsNullOrWhiteSpace())
                            {
                                var rangeSplit = range.Split(',');
                                if (rangeSplit.Length == 2)
                                {
                                    min = rangeSplit[0];
                                    max = rangeSplit[1];
                                }
                            }
                            ShaderPropertyData shaderPropertyData = new ShaderPropertyData(propertyName, propertyType, defaultValue, defaultValueAB, min, max);

                            XMLShaderProperties["default"][propertyName]  = shaderPropertyData;
                            XMLShaderProperties[shaderName][propertyName] = shaderPropertyData;
                        }
                    }
                }
            }
        }
示例#2
0
        /**
         * Post-load initialisation.
         */

        public void load()
        {
            Texture2D[] envMapFaces = new Texture2D[6];

            foreach (GameDatabase.TextureInfo texInfo in GameDatabase.Instance.databaseTexture)
            {
                Texture2D texture = texInfo.texture;

                if (texture == null || !texture.name.StartsWith(DIR_ENVMAP, System.StringComparison.Ordinal))
                {
                    continue;
                }

                string originalName = texture.name.Substring(DIR_ENVMAP.Length);

                switch (originalName)
                {
                case "PositiveX":
                    envMapFaces[0] = texture;
                    break;

                case "NegativeX":
                    envMapFaces[1] = texture;
                    break;

                case "PositiveY":
                    envMapFaces[2] = texture;
                    break;

                case "NegativeY":
                    envMapFaces[3] = texture;
                    break;

                case "PositiveZ":
                    envMapFaces[4] = texture;
                    break;

                case "NegativeZ":
                    envMapFaces[5] = texture;
                    break;

                default:
                    Util.log("Invalid enironment map texture name {0}", texture.name);
                    break;
                }
            }

            // Generate generic reflection cube map texture.
            if (envMapFaces.Contains(null))
            {
                Util.log("Some environment map faces are missing. Static reflections disabled.");
            }
            else
            {
                int envMapSize = envMapFaces[0].width;

                if (envMapFaces.Any(t => t.width != envMapSize || t.height != envMapSize) ||
                    envMapFaces.Any(t => !Util.isPow2(t.width) || !Util.isPow2(t.height)))
                {
                    Util.log("Invalid environment map faces. Static reflections disabled.");
                }
                else
                {
                    try
                    {
                        staticEnvMap           = new Cubemap(envMapSize, TextureFormat.RGB24, true);
                        staticEnvMap.hideFlags = HideFlags.HideAndDontSave;
                        staticEnvMap.wrapMode  = TextureWrapMode.Clamp;
                        staticEnvMap.SetPixels(envMapFaces[0].GetPixels(), CubemapFace.PositiveX);
                        staticEnvMap.SetPixels(envMapFaces[1].GetPixels(), CubemapFace.NegativeX);
                        staticEnvMap.SetPixels(envMapFaces[2].GetPixels(), CubemapFace.PositiveY);
                        staticEnvMap.SetPixels(envMapFaces[3].GetPixels(), CubemapFace.NegativeY);
                        staticEnvMap.SetPixels(envMapFaces[4].GetPixels(), CubemapFace.PositiveZ);
                        staticEnvMap.SetPixels(envMapFaces[5].GetPixels(), CubemapFace.NegativeZ);
                        staticEnvMap.Apply(true, false);

                        Util.log("Static environment map cube texture generated.");
                    }
                    catch (UnityException)
                    {
                        if (staticEnvMap != null)
                        {
                            Object.DestroyImmediate(staticEnvMap);
                        }

                        staticEnvMap = null;

                        Util.log("Failed to set up static reflections. Textures not readable?");
                    }
                }
            }

            LoadBundle();
            visorShader = LoadShader("KSP/TR/Visor");

            for (int i = 0; i < SHADER_MAP.GetLength(0); ++i)
            {
                Shader original   = Shader.Find(SHADER_MAP[i, 0]);
                Shader reflective = LoadedShaders.ContainsKey(SHADER_MAP[i, 1]) ? LoadShader(SHADER_MAP[i, 1]) : Shader.Find(SHADER_MAP[i, 1]);

                if (original == null)
                {
                    Util.log("Shader \"{0}\" missing", SHADER_MAP[i, 0]);
                }
                else if (reflective == null)
                {
                    Util.log("Shader \"{0}\" missing", SHADER_MAP[i, 1]);
                }
                else
                {
                    shaderMap[original] = reflective;
                }
            }

            setReflectionType(reflectionType);
        }