public static string GetShaderName(this MfxShaderType mfxShaderType)
        {
            switch (mfxShaderType)
            {
            case MfxShaderType.Standard:
                return(MfxStandardShaderName);

            case MfxShaderType.StandardSpecular:
                return(MfxStandardSpecularShaderName);

            case MfxShaderType.StandardTransparent:
                return(MfxStandardTransparentShaderName);

            case MfxShaderType.Unlit:
                return(MfxUnlitShaderName);

            default:
                return(MfxUnlitShaderName);
            }
        }
Пример #2
0
        public MfxObjectMaterialUpdater(GameObject targetObject, bool modifyChildren, bool replaceMaterialsAtStart,
                                        Material mfxTemplateMaterial, bool determineWorkflow, MfxShaderType mfxShaderType)
        {
            _determineWorkflow = determineWorkflow;
            _mfxShaderType     = mfxShaderType;

            _renderers = modifyChildren
                ? targetObject.GetComponentsInChildren <Renderer>()
                : targetObject.GetComponents <Renderer>();

            if (!replaceMaterialsAtStart)
            {
                foreach (var renderer in _renderers)
                {
                    foreach (var material in renderer.materials)
                    {
                        _mfxMaterials.Add(material);
                    }
                }
                return;
            }

            Replace(mfxTemplateMaterial);
        }
Пример #3
0
        public static List <Material> ReplaceMaterialsToMfx(Material mfxTemplateMaterial, Material[] targetRendererMaterials, bool determineWorkflowAutomatically,
                                                            MfxShaderType mfxShaderType, bool editorMode)
        {
            var newMaterials = new List <Material>();

            foreach (var targetRendererMaterial in targetRendererMaterials)
            {
                if (targetRendererMaterial == null)
                {
                    continue;
                }

#if UNITY_EDITOR
                string newAssetPath = string.Empty;

                if (editorMode)
                {
                    var materialPath = AssetDatabase.GetAssetPath(targetRendererMaterial);

                    var extensionIdx = materialPath.LastIndexOf("/", StringComparison.Ordinal);
                    if (extensionIdx <= 0)
                    {
                        Debug.LogError("the path is incorrect");
                        continue;
                    }

                    var pathWithoutExtension = materialPath.Substring(0, extensionIdx);

                    newAssetPath = pathWithoutExtension + "/" + targetRendererMaterial.name + "_MFX.mat";

                    var assetType = AssetDatabase.GetMainAssetTypeAtPath(newAssetPath);
                    if (assetType != null)
                    {
                        var existingMaterial = AssetDatabase.LoadAssetAtPath <Material>(newAssetPath);
                        newMaterials.Add(existingMaterial);
                        continue;
                    }
                }
#endif

                var shaderName  = determineWorkflowAutomatically ? GetShaderByWorkflow(targetRendererMaterial) : mfxShaderType.GetShaderName();
                var newMaterial = new Material(targetRendererMaterial)
                {
                    shader = Shader.Find(shaderName)
                };

                CopyMfxProperties(mfxTemplateMaterial, newMaterial, targetRendererMaterial, determineWorkflowAutomatically);

                ReplaceMetallicSpecularKeywords(targetRendererMaterial, newMaterial);

                newMaterials.Add(newMaterial);

#if UNITY_EDITOR
                if (editorMode)
                {
                    AssetDatabase.CreateAsset(newMaterial, newAssetPath);
                    Debug.Log("Mfx Material Was Created: " + newAssetPath);
                }
#endif
            }

            return(newMaterials);
        }
Пример #4
0
        public static void ReplaceRenderersMaterials(Material mfxTemplateMaterial, GameObject targetObject, bool determineWorkflowAutomatically, MfxShaderType mfxShaderType,
                                                     bool editorMode)
        {
            var renderers = targetObject.GetComponentsInChildren <Renderer>();

            foreach (var targetRenderer in renderers)
            {
                var targetRendererMaterials = targetRenderer.sharedMaterials;
                var newMaterials            = ReplaceMaterialsToMfx(mfxTemplateMaterial, targetRendererMaterials, determineWorkflowAutomatically, mfxShaderType, editorMode);
                targetRenderer.sharedMaterials = newMaterials.ToArray();
            }
        }