Ejemplo n.º 1
0
        static string CreateMainShaderCode(ImportingAsset importingAsset, int stage)
        {
            var baseCode = "";

            if (stage == 0)
            {
                if (importingAsset.CustomData1Count > 0)
                {
                    baseCode += "#if _MODEL_\n";
                    baseCode += string.Format("float4 customData1 = buf_customData1[inst];\n");
                    baseCode += "#else\n";
                    baseCode += string.Format("float{0} customData1 = Input.CustomData1;\n", importingAsset.CustomData1Count);
                    baseCode += "#endif\n";
                }

                if (importingAsset.CustomData2Count > 0)
                {
                    baseCode += "#if _MODEL_\n";
                    baseCode += string.Format("float4 customData2 = buf_customData2[inst];\n");
                    baseCode += "#else\n";
                    baseCode += string.Format("float{0} customData2 = Input.CustomData2;\n", importingAsset.CustomData2Count);
                    baseCode += "#endif\n";
                }
            }
            else if (stage == 1)
            {
                if (importingAsset.CustomData1Count > 0)
                {
                    baseCode += string.Format("float{0} customData1 = Input.CustomData1;", importingAsset.CustomData1Count);
                }

                if (importingAsset.CustomData2Count > 0)
                {
                    baseCode += string.Format("float{0} customData2 = Input.CustomData2;", importingAsset.CustomData2Count);
                }
            }

            baseCode += importingAsset.Code;

            baseCode = baseCode.Replace("$F1$", "float");
            baseCode = baseCode.Replace("$F2$", "float2");
            baseCode = baseCode.Replace("$F3$", "float3");
            baseCode = baseCode.Replace("$F4$", "float4");
            baseCode = baseCode.Replace("$TIME$", "_Time.y");
            baseCode = baseCode.Replace("$UV$", "uv");

            int actualTextureCount = Math.Min(importingAsset.UserTextureSlotMax, importingAsset.Textures.Count);

            for (int i = 0; i < actualTextureCount; i++)
            {
                var keyP = "$TEX_P" + i + "$";
                var keyS = "$TEX_S" + i + "$";


                if (stage == 0)
                {
                    baseCode = baseCode.Replace(
                        keyP,
                        "tex2Dlod(" + importingAsset.Textures[i].Name + ",float4(GetUV(");
                    baseCode = baseCode.Replace(keyS, "),0,0))");
                }
                else
                {
                    baseCode = baseCode.Replace(
                        keyP,
                        "tex2D(" + importingAsset.Textures[i].Name + ",GetUV(");
                    baseCode = baseCode.Replace(keyS, "))");
                }
            }

            // invalid texture
            for (int i = actualTextureCount; i < importingAsset.Textures.Count; i++)
            {
                var keyP = "$TEX_P" + i + "$";
                var keyS = "$TEX_S" + i + "$";
                baseCode = baseCode.Replace(keyP, "float4(");
                baseCode = baseCode.Replace(keyS, ",0.0,1.0)");
            }

            if (stage == 0)
            {
                if (importingAsset.CustomData1Count == 1)
                {
                    baseCode += "Output.CustomData1 = customData1;";
                }
                if (importingAsset.CustomData1Count == 2)
                {
                    baseCode += "Output.CustomData1 = customData1.xy;";
                }
                if (importingAsset.CustomData1Count == 3)
                {
                    baseCode += "Output.CustomData1 = customData1.xyz;";
                }
                if (importingAsset.CustomData1Count == 4)
                {
                    baseCode += "Output.CustomData1 = customData1.xyzw;";
                }

                if (importingAsset.CustomData2Count == 1)
                {
                    baseCode += "Output.CustomData2 = customData2;";
                }
                if (importingAsset.CustomData2Count == 2)
                {
                    baseCode += "Output.CustomData2 = customData2.xy;";
                }
                if (importingAsset.CustomData2Count == 3)
                {
                    baseCode += "Output.CustomData2 = customData2.xyz;";
                }
                if (importingAsset.CustomData2Count == 4)
                {
                    baseCode += "Output.CustomData2 = customData2.xyzw;";
                }
            }

            return(baseCode);
        }
Ejemplo n.º 2
0
        static Shader CreateShader(string path, ImportingAsset importingAsset)
        {
            var nl         = Environment.NewLine;
            var mainVSCode = CreateMainShaderCode(importingAsset, 0);
            var mainPSCode = CreateMainShaderCode(importingAsset, 1);

            var code = shaderTemplate;

            code = code.Replace("@", "#");

            string codeProperty = string.Empty;
            string codeVariable = string.Empty;
            string codeUniforms = string.Empty;

            int actualTextureCount = Math.Min(importingAsset.UserTextureSlotMax, importingAsset.Textures.Count);

            for (int i = 0; i < actualTextureCount; i++)
            {
                codeProperty += importingAsset.Textures[i].Name + @"(""Color (RGBA)"", 2D) = ""white"" {}" + nl;
                codeVariable += "sampler2D " + importingAsset.Textures[i].Name + ";" + nl;
            }

            for (int i = 0; i < importingAsset.Uniforms.Count; i++)
            {
                codeUniforms += "float4 " + importingAsset.Uniforms[i].Name + ";" + nl;
            }

            // replace for usability
            // HACK for efk_xxx_1 and efk_xxx_12
            {
                var replacingUniforms = importingAsset.Uniforms.ToArray();

                replacingUniforms = replacingUniforms.OrderByDescending(_ => _.UniformName.Length).ToArray();

                foreach (var kv in replacingUniforms)
                {
                    if (kv.Name == string.Empty)
                    {
                        continue;
                    }

                    code       = code.Replace(kv.UniformName, kv.Name);
                    mainVSCode = mainVSCode.Replace(kv.UniformName, kv.Name);
                    mainPSCode = mainPSCode.Replace(kv.UniformName, kv.Name);
                }
            }


            code = code.Replace("%TEX_PROPERTY%", codeProperty);
            code = code.Replace("%TEX_VARIABLE%", codeVariable);
            code = code.Replace("%UNIFORMS%", codeUniforms);
            code = code.Replace("%VSCODE%", mainVSCode);
            code = code.Replace("%PSCODE%", mainPSCode);
            code = code.Replace("%MATERIAL_NAME%", System.IO.Path.GetFileNameWithoutExtension(path));

            if (importingAsset.HasRefraction)
            {
                code = code.Replace("//PRAGMA_REFRACTION_FLAG", "#pragma multi_compile _ _MATERIAL_REFRACTION_");
            }

            if (importingAsset.ShadingModel == 0)
            {
                code = code.Replace("//PRAGMA_LIT_FLAG", "#define _MATERIAL_LIT_ 1");
            }

            if (importingAsset.CustomData1Count > 0)
            {
                code = code.Replace("//%CUSTOM_BUF1%", string.Format("StructuredBuffer<float4> buf_customData1;"));
                code = code.Replace("//%CUSTOM_VS_INPUT1%", string.Format("float{0} CustomData1;", importingAsset.CustomData1Count));
                code = code.Replace("//%CUSTOM_VSPS_INOUT1%", string.Format("float{0} CustomData1 : TEXCOORD7;", importingAsset.CustomData1Count));
            }

            if (importingAsset.CustomData2Count > 0)
            {
                code = code.Replace("//%CUSTOM_BUF2%", string.Format("StructuredBuffer<float4> buf_customData2;"));
                code = code.Replace("//%CUSTOM_VS_INPUT2%", string.Format("float{0} CustomData2;", importingAsset.CustomData2Count));
                code = code.Replace("//%CUSTOM_VSPS_INOUT2%", string.Format("float{0} CustomData2 : TEXCOORD8;", importingAsset.CustomData2Count));
            }

            // change return codes
            code = code.Replace("\r\n", "\n");

            AssetDatabase.StartAssetEditing();

            using (var writer = new StreamWriter(path))
            {
                writer.Write(code);
            }

            AssetDatabase.StopAssetEditing();

            AssetDatabase.Refresh(ImportAssetOptions.ImportRecursive);
            AssetDatabase.ImportAsset(path, ImportAssetOptions.ImportRecursive);

            var asset = AssetDatabase.LoadAssetAtPath <Shader>(path);

            return(asset);
        }
Ejemplo n.º 3
0
        public static void CreateAsset(string path, ImportingAsset importingAsset)
        {
            // modify
            if (importingAsset.CustomData1Count > 0)
            {
                importingAsset.CustomData1Count = Math.Max(2, importingAsset.CustomData1Count);
            }

            if (importingAsset.CustomData2Count > 0)
            {
                importingAsset.CustomData2Count = Math.Max(2, importingAsset.CustomData2Count);
            }

            // modifiy importing asset to avoid invalid name
            foreach (var texture in importingAsset.Textures)
            {
                if (texture.Name == string.Empty)
                {
                    texture.Name = texture.UniformName;
                }

                // Escape
                texture.Name = EscapePropertyName(texture.Name);
            }

            string assetPath = Path.ChangeExtension(path, ".asset");

            var asset = AssetDatabase.LoadAssetAtPath <EffekseerMaterialAsset>(assetPath);

            if (asset != null)
            {
            }

            string assetDir   = assetPath.Substring(0, assetPath.LastIndexOf('/'));
            bool   isNewAsset = false;

            if (asset == null)
            {
                asset      = CreateInstance <EffekseerMaterialAsset>();
                isNewAsset = true;
            }

            if (importingAsset.IsCacheFile)
            {
                asset.cachedMaterialBuffers = importingAsset.Data;
            }
            else
            {
                asset.materialBuffers  = importingAsset.Data;
                asset.uniforms         = importingAsset.Uniforms.ToArray();
                asset.textures         = importingAsset.Textures.ToArray();
                asset.CustomData1Count = importingAsset.CustomData1Count;
                asset.CustomData2Count = importingAsset.CustomData2Count;
                asset.HasRefraction    = importingAsset.HasRefraction;
                var shader = CreateShader(Path.ChangeExtension(path, ".shader"), importingAsset);

                // sometimes return null
                if (shader != null)
                {
                    asset.shader = shader;
                }
            }

            if (isNewAsset)
            {
                AssetDatabase.CreateAsset(asset, assetPath);
            }
            else
            {
                EditorUtility.SetDirty(asset);
            }

            AssetDatabase.Refresh();
        }