/// <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 }
protected override void OnEnable() { base.OnEnable(); if (paintableSet == false) { paintable = GetComponent <P3dPaintable>(); paintableSet = true; } paintable.Register(this); }
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--; } } } }
private bool HasMaterialCloner(P3dPaintable paintable, int index) { foreach (var materialCloner in paintable.GetComponents <P3dMaterialCloner>()) { if (materialCloner.Index == index) { return(true); } } return(false); }
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); }
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); } } }
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); }
/// <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--; } } } }
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); } } }