Esempio n. 1
0
        /// <summary>This method applies the preset components to the specified paintable.
        /// NOTE: This is editor-only.</summary>
        public void AddTo(P3dPaintable paintable, int index)
        {
#if UNITY_EDITOR
            var materialCloner = GetComponent <P3dMaterialCloner>();

            if (materialCloner != null && HasMaterialCloner(paintable, index) == false)
            {
                if (UnityEditorInternal.ComponentUtility.CopyComponent(materialCloner) == true)
                {
                    var newMaterialCloner = paintable.gameObject.AddComponent <P3dMaterialCloner>();

                    UnityEditorInternal.ComponentUtility.PasteComponentValues(newMaterialCloner);

                    newMaterialCloner.Index = index;
                }
            }

            foreach (var paintableTexture in GetComponents <P3dPaintableTexture>())
            {
                if (UnityEditorInternal.ComponentUtility.CopyComponent(paintableTexture) == true)
                {
                    var newPaintableTexture = paintable.gameObject.AddComponent <P3dPaintableTexture>();

                    UnityEditorInternal.ComponentUtility.PasteComponentValues(newPaintableTexture);

                    newPaintableTexture.Slot = new P3dSlot(index, newPaintableTexture.Slot.Name);
                }
            }
#endif
        }
Esempio n. 2
0
        protected override void OnEnable()
        {
            base.OnEnable();

            if (paintableSet == false)
            {
                paintable    = GetComponent <P3dPaintable>();
                paintableSet = true;
            }

            paintable.Register(this);
        }
Esempio n. 3
0
        private void DrawMaterials(P3dPaintable paintable, Material[] materials, P3dPaintableTexture[] paintableTextures)
        {
            for (var i = 0; i < materials.Length; i++)
            {
                var material = materials[i];

                EditorGUILayout.BeginHorizontal();
                EditorGUI.BeginDisabledGroup(true);
                EditorGUILayout.ObjectField(GUIContent.none, material, typeof(Material), true, GUILayout.MinWidth(10));
                EditorGUI.EndDisabledGroup();
                if (GUILayout.Button("+Preset", EditorStyles.miniButton, GUILayout.ExpandWidth(false)) == true)
                {
                    var menu       = new GenericMenu();
                    var stateLimit = Settings.OverrideStateLimit == true ? Settings.StateLimit : -1;

                    foreach (var cachedPreset in P3dPreset.CachedPresets)
                    {
                        if (cachedPreset != null && material != null && cachedPreset.Targets(material.shader) == true)
                        {
                            var preset = cachedPreset;
                            var index  = i;

                            if (preset.CanAddTo(paintable, index) == true)
                            {
                                menu.AddItem(new GUIContent(preset.FinalName), false, () => preset.AddTo(paintable, material.shader, index, stateLimit));
                            }
                            else
                            {
                                menu.AddDisabledItem(new GUIContent(preset.FinalName));
                            }
                        }
                    }

                    if (menu.GetItemCount() == 0)
                    {
                        menu.AddDisabledItem(new GUIContent("Failed to find any presets for this material or shader."));
                    }

                    menu.ShowAsContext();
                }
                EditorGUILayout.EndHorizontal();

                foreach (var paintableTexture in paintableTextures)
                {
                    if (paintableTexture.Slot.Index == i)
                    {
                        EditorGUI.indentLevel++;
                        DrawPaintableTexture(paintableTexture, material);
                        EditorGUI.indentLevel--;
                    }
                }
            }
        }
Esempio n. 4
0
        private bool HasMaterialCloner(P3dPaintable paintable, int index)
        {
            foreach (var materialCloner in paintable.GetComponents <P3dMaterialCloner>())
            {
                if (materialCloner.Index == index)
                {
                    return(true);
                }
            }

            return(false);
        }
Esempio n. 5
0
        public bool CanAddTo(P3dPaintable paintable, int index)
        {
            var candidates = GetComponents <P3dPaintableTexture>();

            foreach (var paintableTexture in paintable.GetComponents <P3dPaintableTexture>())
            {
                if (paintableTexture.Slot.Index == index && HasPaintableTexture(candidates, paintableTexture) == true)
                {
                    return(false);
                }
            }

            return(true);
        }
Esempio n. 6
0
            public static void SubmitAll(bool preview = false, int layerMask = -1, int groupMask = -1)
            {
                var paintables = P3dPaintable.FindOverlap(cachedPosition, cachedSqrRadius, layerMask);

                for (var i = paintables.Count - 1; i >= 0; i--)
                {
                    var paintableTextures = P3dPaintableTexture.Filter(paintables[i], groupMask);

                    for (var j = paintableTextures.Count - 1; j >= 0; j--)
                    {
                        Submit(paintableTextures[j], preview);
                    }
                }
            }
Esempio n. 7
0
        public static List <P3dPaintableTexture> Filter(P3dPaintable paintable, int groupMask)
        {
            tempPaintableTextures.Clear();

            var paintableTextures = paintable.PaintableTextures;

            for (var i = paintableTextures.Count - 1; i >= 0; i--)
            {
                var paintableTexture = paintableTextures[i];
                var mask             = 1 << paintableTexture.group;

                if ((mask & groupMask) != 0)
                {
                    tempPaintableTextures.Add(paintableTexture);
                }
            }

            return(tempPaintableTextures);
        }
Esempio n. 8
0
        /// <summary>This method applies the preset components to the specified paintable.
        /// NOTE: This is editor-only.</summary>
        public void AddTo(P3dPaintable paintable, Shader shader, int index, int stateLimit)
        {
#if UNITY_EDITOR
            if (addMaterialCloner == true && HasMaterialCloner(paintable, index) == false)
            {
                var newMaterialCloner = paintable.gameObject.AddComponent <P3dMaterialCloner>();

                newMaterialCloner.Index = index;
            }

            foreach (var paintableTexture in GetComponents <P3dPaintableTexture>())
            {
                if (UnityEditorInternal.ComponentUtility.CopyComponent(paintableTexture) == true)
                {
                    var newPaintableTexture = paintable.gameObject.AddComponent <P3dPaintableTexture>();

                    UnityEditorInternal.ComponentUtility.PasteComponentValues(newPaintableTexture);

                    var groupData = P3dGroupData_Editor.GetGroupData(paintableTexture.Group);
                    var slotName  = newPaintableTexture.Slot.Name;

                    if (groupData != null && shader != null)
                    {
                        groupData.TryGetShaderSlotName(shader.name, ref slotName);
                    }

                    newPaintableTexture.Slot = new P3dSlot(index, slotName);

                    if (stateLimit >= 0)
                    {
                        if (newPaintableTexture.UndoRedo != P3dPaintableTexture.UndoRedoType.LocalCommandCopy)
                        {
                            newPaintableTexture.UndoRedo   = P3dPaintableTexture.UndoRedoType.FullTextureCopy;
                            newPaintableTexture.StateLimit = stateLimit;

                            UnityEditor.EditorUtility.SetDirty(newPaintableTexture);
                        }
                    }
                }
            }
#endif
        }
        private void DrawMaterials(P3dPaintable paintable, Material[] materials, P3dPaintableTexture[] paintableTextures)
        {
            for (var i = 0; i < materials.Length; i++)
            {
                var material = materials[i];

                EditorGUILayout.BeginHorizontal();
                EditorGUI.BeginDisabledGroup(true);
                EditorGUILayout.ObjectField(GUIContent.none, material, typeof(Material), true, GUILayout.MinWidth(10));
                EditorGUI.EndDisabledGroup();
                if (material != null && paintableTextures.Length > 0)
                {
                    if (GUILayout.Button("Export", EditorStyles.miniButton, GUILayout.ExpandWidth(false)) == true)
                    {
                        var path = AssetDatabase.GetAssetPath(material);
                        var dir  = string.IsNullOrEmpty(path) == false?System.IO.Path.GetDirectoryName(path) : "Assets";

                        path = EditorUtility.SaveFilePanelInProject("Export Material & Textures", name, "mat", "Export Your Material and Textures", dir);

                        if (string.IsNullOrEmpty(path) == false)
                        {
                            Undo.RecordObjects(paintableTextures, "Export Material & Textures");

                            var clone = Instantiate(material);

                            AssetDatabase.CreateAsset(clone, path);

                            foreach (var paintableTexture in paintableTextures)
                            {
                                var path2 = System.IO.Path.GetDirectoryName(path) + "/" + System.IO.Path.GetFileNameWithoutExtension(path) + paintableTexture.Slot.Name + ".png";

                                System.IO.File.WriteAllBytes(path2, paintableTexture.GetPngData(true));

                                AssetDatabase.ImportAsset(path2);

                                paintableTexture.Output = AssetDatabase.AssetPathToGUID(path2);

                                clone.SetTexture(paintableTexture.Slot.Name, AssetDatabase.LoadAssetAtPath <Texture>(path2));
                            }

                            EditorUtility.SetDirty(this);
                        }
                    }
                }
                if (GUILayout.Button("+Preset", EditorStyles.miniButton, GUILayout.ExpandWidth(false)) == true)
                {
                    var menu       = new GenericMenu();
                    var stateLimit = Settings.OverrideStateLimit == true ? Settings.StateLimit : -1;

                    foreach (var cachedPreset in P3dPreset.CachedPresets)
                    {
                        if (cachedPreset != null && material != null && cachedPreset.Targets(material.shader) == true)
                        {
                            var preset = cachedPreset;
                            var index  = i;

                            if (preset.CanAddTo(paintable, index) == true)
                            {
                                menu.AddItem(new GUIContent(preset.FinalName), false, () => preset.AddTo(paintable, material.shader, index, stateLimit));
                            }
                            else
                            {
                                menu.AddDisabledItem(new GUIContent(preset.FinalName));
                            }
                        }
                    }

                    if (menu.GetItemCount() == 0)
                    {
                        menu.AddDisabledItem(new GUIContent("Failed to find any presets for this material or shader."));
                    }

                    menu.ShowAsContext();
                }
                EditorGUILayout.EndHorizontal();

                foreach (var paintableTexture in paintableTextures)
                {
                    if (paintableTexture.Slot.Index == i)
                    {
                        EditorGUI.indentLevel++;
                        DrawPaintableTexture(paintableTexture, material);
                        EditorGUI.indentLevel--;
                    }
                }
            }
        }
Esempio n. 10
0
        public void ExecuteCommands(P3dPaintable paintable)
        {
            if (activated == true)
            {
                var commandCount = commands.Count;
                var swap         = default(RenderTexture);
                var swapSet      = false;

                // Revert snapshot
                if (previewSet == true)
                {
                    P3dHelper.ReleaseRenderTexture(preview); previewSet = false;
                }

                if (commandCount > 0)
                {
                    var oldActive      = RenderTexture.active;
                    var prepared       = false;
                    var preparedMesh   = default(Mesh);
                    var preparedMatrix = default(Matrix4x4);

                    RenderTexture.active = current;

                    for (var i = 0; i < commandCount; i++)
                    {
                        var command         = commands[i];
                        var commandMaterial = command.Material;

                        if (command.Preview != previewSet)
                        {
                            NotifyOnModified(previewSet);

                            if (previewSet == true)
                            {
                                P3dHelper.ReleaseRenderTexture(preview); previewSet = false;

                                RenderTexture.active = current;
                            }
                            else
                            {
                                preview = P3dHelper.GetRenderTexture(current.width, current.height, current.depth, current.format); previewSet = true;

                                P3dHelper.Blit(preview, current);

                                RenderTexture.active = preview;
                            }
                        }

                        if (command.RequireSwap == true)
                        {
                            if (swapSet == false)
                            {
                                swap = P3dHelper.GetRenderTexture(current.width, current.height, current.depth, current.format); swapSet = true;
                            }

                            RenderTexture.active = swap;

                            if (previewSet == true)
                            {
                                swap    = preview;
                                preview = RenderTexture.active;
                            }
                            else
                            {
                                swap    = current;
                                current = RenderTexture.active;
                            }

                            command.Material.SetTexture(P3dShader._Buffer, swap);
                        }

                        command.Apply();

                        if (command.RequireMesh == true)
                        {
                            if (prepared == false)
                            {
                                prepared = true;

                                paintable.GetPrepared(ref preparedMesh, ref preparedMatrix);
                            }

                            switch (channel)
                            {
                            case P3dChannel.UV: commandMaterial.SetVector(P3dShader._Channel, new Vector4(1.0f, 0.0f, 0.0f, 0.0f)); break;

                            case P3dChannel.UV2: commandMaterial.SetVector(P3dShader._Channel, new Vector4(0.0f, 1.0f, 0.0f, 0.0f)); break;

                            case P3dChannel.UV3: commandMaterial.SetVector(P3dShader._Channel, new Vector4(0.0f, 0.0f, 1.0f, 0.0f)); break;

                            case P3dChannel.UV4: commandMaterial.SetVector(P3dShader._Channel, new Vector4(0.0f, 0.0f, 0.0f, 1.0f)); break;
                            }

                            commandMaterial.SetPass(0);

                            Graphics.DrawMeshNow(preparedMesh, preparedMatrix, slot.Index);
                        }
                        else
                        {
                            Graphics.Blit(default(Texture), current, commandMaterial);
                        }

                        command.Pool();
                    }

                    RenderTexture.active = oldActive;

                    commands.Clear();
                }

                if (swapSet == true)
                {
                    P3dHelper.ReleaseRenderTexture(swap); swapSet = false;
                }

                if (commandCount > 0)
                {
                    NotifyOnModified(previewSet);
                }

                if (materialSet == false)
                {
                    UpdateMaterial();
                }

                if (previewSet == true)
                {
                    material.SetTexture(slot.Name, preview);
                }
                else
                {
                    material.SetTexture(slot.Name, current);
                }
            }
        }