Exemplo n.º 1
0
        public static Material FromUnity(Scene scene, UnityEngine.Material unity_material)
        {
            if (shadersProperties == null)
            {
                TextAsset properties = Resources.Load <TextAsset>(Constants.shaderDatabase);

                if (properties != null && properties.bytes.Length > 0)
                {
                    shadersProperties = (Dictionary <int, string[]>)Module.Import.Binary.serializer.Deserialize(properties.bytes);
                }
            }

            if (shadersProperties != null)
            {
                // Create new material
                Material material = new Material();

                // Save material options
                material.name                    = unity_material.name;
                material.shader                  = unity_material.shader.name;
                material.renderQueue             = unity_material.renderQueue;
                material.hideFlags               = unity_material.hideFlags;
                material.globalIlluminationFlags = unity_material.globalIlluminationFlags;
                material.keywords                = unity_material.shaderKeywords;
                material.passes                  = new bool[unity_material.passCount];

                // Save material enabled passes
                for (int i = 0; i < material.passes.Length; i++)
                {
#if UNITY_5_6_OR_NEWER
                    material.passes[i] = unity_material.GetShaderPassEnabled(unity_material.GetPassName(i));
#else
                    material.passes[i] = true;
#endif
                }

                // Save material properties
                // Range properties in Unity are f****d-up. It can be either int or float values, and their is no way to know wich one it is.
                // However, if we restore them using the wrong type, we get no errors but they are (obviously) ignored...
                // Therefore, we will save range as both int and float to be conservative.
                FromUnityMaterialProperties(unity_material, Shaders.PropertyType.RANGE, ref material.ints, (m, p) => m.GetInt(p));
                FromUnityMaterialProperties(unity_material, Shaders.PropertyType.RANGE, ref material.floats, (m, p) => m.GetFloat(p));
                FromUnityMaterialProperties(unity_material, Shaders.PropertyType.FLOAT, ref material.floats, (m, p) => m.GetFloat(p));
                FromUnityMaterialProperties(unity_material, Shaders.PropertyType.VECTOR, ref material.vectors, (m, p) => m.GetVector(p));
                FromUnityMaterialProperties(unity_material, Shaders.PropertyType.COLOR, ref material.colors, (m, p) => m.GetColor(p));
                FromUnityMaterialProperties(unity_material, Shaders.PropertyType.TEXTURE, ref material.textures, (m, p) =>
                {
                    UnityEngine.Texture unity_tex = m.GetTexture(p);

                    int index = (unity_tex != null && unity_tex is Texture2D ? scene.GetUnityTextureIndex((Texture2D)unity_tex) : -1);

                    return(index >= 0 ? new TextureParams((uint)index, m.GetTextureOffset(p), m.GetTextureScale(p)) : null);
                });

                return(material);
            }

            return(null);
        }