From 462bf4ffc058ce20733c924bd1b5917450920a23 Mon Sep 17 00:00:00 2001 From: Chromium <62724067+Chromum@users.noreply.github.com> Date: Sat, 26 Apr 2025 23:26:24 +0100 Subject: [PATCH] Added Single Channel Node and Get Dimensions As well as various bug fixes --- Editor/Scripts/Editor/Data Types/ImageData.cs | 22 +++++++ .../Editor/ImageProcessingGraphAsset.cs | 2 + .../Nodes/{Base Node.meta => Base.meta} | 0 .../{Base Node => Base}/BaseImageNode.cs | 2 +- .../{Base Node => Base}/BaseImageNode.cs.meta | 0 .../ExposedPropertyPort.cs | 0 .../ExposedPropertyPort.cs.meta | 0 .../{Base Node => Base}/PortConnection.cs | 0 .../PortConnection.cs.meta | 0 .../Editor/Nodes/Base/RangeProperty.cs | 23 +++++++ .../Editor/Nodes/Base/RangeProperty.cs.meta | 3 + Editor/Scripts/Editor/Nodes/Fun Nodes.meta | 3 - .../Editor/Nodes/Fun Nodes/Texture.meta | 3 - .../Editor/Nodes/Output/Texture2DOutput.cs | 20 ------ .../{Import Nodes/Base.meta => Types.meta} | 2 +- Editor/Scripts/Editor/Nodes/Types/Image.meta | 8 +++ .../Editor/Nodes/Types/Image/Adjustments.meta | 8 +++ .../Image/Adjustments}/Texture2DDesaturate.cs | 0 .../Adjustments}/Texture2DDesaturate.cs.meta | 0 .../Image/Adjustments}/Texture2DInvert.cs | 0 .../Adjustments}/Texture2DInvert.cs.meta | 0 .../Editor/Nodes/Types/Image/Channels.meta | 8 +++ .../Image/Channels}/RGBACombine.cs | 0 .../Image/Channels}/RGBACombine.cs.meta | 0 .../Image/Channels}/RGBASplit.cs | 2 + .../Image/Channels}/RGBASplit.cs.meta | 0 .../Editor/Nodes/Types/Image/Dimensions.meta | 8 +++ .../Types/Image/Dimensions/GetDimensions.cs | 27 ++++++++ .../Image/Dimensions/GetDimensions.cs.meta | 3 + .../{Output.meta => Types/Image/Export.meta} | 0 .../Types/Image/Export/Texture2DOutput.cs | 37 +++++++++++ .../Image/Export}/Texture2DOutput.cs.meta | 0 .../Editor/Nodes/Types/Image/Filters.meta | 8 +++ .../Editor/Nodes/Types/Image/Image.meta | 8 +++ .../Image/Import.meta} | 0 .../Image/Import}/Texture2DImport.cs | 16 ++++- .../Image/Import}/Texture2DImport.cs.meta | 0 .../Editor/Nodes/Types/Image/Utilities.meta | 8 +++ .../Image/Utilities/SingleChannelColor.cs | 63 +++++++++++++++++++ .../Utilities/SingleChannelColor.cs.meta | 3 + Editor/Scripts/Editor/Nodes/Types/String.meta | 8 +++ .../Windows/ImageProcessingGraphNodeVisual.cs | 42 ++++++++++++- 42 files changed, 305 insertions(+), 32 deletions(-) rename Editor/Scripts/Editor/Nodes/{Base Node.meta => Base.meta} (100%) rename Editor/Scripts/Editor/Nodes/{Base Node => Base}/BaseImageNode.cs (99%) rename Editor/Scripts/Editor/Nodes/{Base Node => Base}/BaseImageNode.cs.meta (100%) rename Editor/Scripts/Editor/Nodes/{Base Node => Base}/ExposedPropertyPort.cs (100%) rename Editor/Scripts/Editor/Nodes/{Base Node => Base}/ExposedPropertyPort.cs.meta (100%) rename Editor/Scripts/Editor/Nodes/{Base Node => Base}/PortConnection.cs (100%) rename Editor/Scripts/Editor/Nodes/{Base Node => Base}/PortConnection.cs.meta (100%) create mode 100644 Editor/Scripts/Editor/Nodes/Base/RangeProperty.cs create mode 100644 Editor/Scripts/Editor/Nodes/Base/RangeProperty.cs.meta delete mode 100644 Editor/Scripts/Editor/Nodes/Fun Nodes.meta delete mode 100644 Editor/Scripts/Editor/Nodes/Fun Nodes/Texture.meta delete mode 100644 Editor/Scripts/Editor/Nodes/Output/Texture2DOutput.cs rename Editor/Scripts/Editor/Nodes/{Import Nodes/Base.meta => Types.meta} (77%) create mode 100644 Editor/Scripts/Editor/Nodes/Types/Image.meta create mode 100644 Editor/Scripts/Editor/Nodes/Types/Image/Adjustments.meta rename Editor/Scripts/Editor/Nodes/{Fun Nodes/Texture => Types/Image/Adjustments}/Texture2DDesaturate.cs (100%) rename Editor/Scripts/Editor/Nodes/{Fun Nodes/Texture => Types/Image/Adjustments}/Texture2DDesaturate.cs.meta (100%) rename Editor/Scripts/Editor/Nodes/{Fun Nodes/Texture => Types/Image/Adjustments}/Texture2DInvert.cs (100%) rename Editor/Scripts/Editor/Nodes/{Fun Nodes/Texture => Types/Image/Adjustments}/Texture2DInvert.cs.meta (100%) create mode 100644 Editor/Scripts/Editor/Nodes/Types/Image/Channels.meta rename Editor/Scripts/Editor/Nodes/{Fun Nodes/Texture => Types/Image/Channels}/RGBACombine.cs (100%) rename Editor/Scripts/Editor/Nodes/{Fun Nodes/Texture => Types/Image/Channels}/RGBACombine.cs.meta (100%) rename Editor/Scripts/Editor/Nodes/{Fun Nodes/Texture => Types/Image/Channels}/RGBASplit.cs (98%) rename Editor/Scripts/Editor/Nodes/{Fun Nodes/Texture => Types/Image/Channels}/RGBASplit.cs.meta (100%) create mode 100644 Editor/Scripts/Editor/Nodes/Types/Image/Dimensions.meta create mode 100644 Editor/Scripts/Editor/Nodes/Types/Image/Dimensions/GetDimensions.cs create mode 100644 Editor/Scripts/Editor/Nodes/Types/Image/Dimensions/GetDimensions.cs.meta rename Editor/Scripts/Editor/Nodes/{Output.meta => Types/Image/Export.meta} (100%) create mode 100644 Editor/Scripts/Editor/Nodes/Types/Image/Export/Texture2DOutput.cs rename Editor/Scripts/Editor/Nodes/{Output => Types/Image/Export}/Texture2DOutput.cs.meta (100%) create mode 100644 Editor/Scripts/Editor/Nodes/Types/Image/Filters.meta create mode 100644 Editor/Scripts/Editor/Nodes/Types/Image/Image.meta rename Editor/Scripts/Editor/Nodes/{Import Nodes.meta => Types/Image/Import.meta} (100%) rename Editor/Scripts/Editor/Nodes/{Import Nodes => Types/Image/Import}/Texture2DImport.cs (53%) rename Editor/Scripts/Editor/Nodes/{Import Nodes => Types/Image/Import}/Texture2DImport.cs.meta (100%) create mode 100644 Editor/Scripts/Editor/Nodes/Types/Image/Utilities.meta create mode 100644 Editor/Scripts/Editor/Nodes/Types/Image/Utilities/SingleChannelColor.cs create mode 100644 Editor/Scripts/Editor/Nodes/Types/Image/Utilities/SingleChannelColor.cs.meta create mode 100644 Editor/Scripts/Editor/Nodes/Types/String.meta diff --git a/Editor/Scripts/Editor/Data Types/ImageData.cs b/Editor/Scripts/Editor/Data Types/ImageData.cs index 3ddc4c8..53d7ae8 100644 --- a/Editor/Scripts/Editor/Data Types/ImageData.cs +++ b/Editor/Scripts/Editor/Data Types/ImageData.cs @@ -1,3 +1,4 @@ +using System.IO; using Unity.Collections; using UnityEngine; @@ -62,4 +63,25 @@ public struct ImageData texture.Apply(); return texture; } + + public void ExportPNG(string path) + { + Texture2D texture = this.ToTexture2D(); + byte[] data = texture.EncodeToPNG(); + string thePath; + + if (path.StartsWith("Assets\\")) + { + thePath = path.Substring("Assets/".Length); + } + else + { + thePath = path; + } + + if (data != null) + { + System.IO.File.WriteAllBytes(Path.Combine(Application.dataPath, thePath), data); + } + } } diff --git a/Editor/Scripts/Editor/ImageProcessingGraphAsset.cs b/Editor/Scripts/Editor/ImageProcessingGraphAsset.cs index 8d01e9d..388d7a0 100644 --- a/Editor/Scripts/Editor/ImageProcessingGraphAsset.cs +++ b/Editor/Scripts/Editor/ImageProcessingGraphAsset.cs @@ -59,6 +59,8 @@ namespace ImageProcessingGraph.Editor // Log the elapsed time UnityEngine.Debug.Log($"Graph execution took {stopwatch.ElapsedMilliseconds} milliseconds."); + + AssetDatabase.Refresh(); } diff --git a/Editor/Scripts/Editor/Nodes/Base Node.meta b/Editor/Scripts/Editor/Nodes/Base.meta similarity index 100% rename from Editor/Scripts/Editor/Nodes/Base Node.meta rename to Editor/Scripts/Editor/Nodes/Base.meta diff --git a/Editor/Scripts/Editor/Nodes/Base Node/BaseImageNode.cs b/Editor/Scripts/Editor/Nodes/Base/BaseImageNode.cs similarity index 99% rename from Editor/Scripts/Editor/Nodes/Base Node/BaseImageNode.cs rename to Editor/Scripts/Editor/Nodes/Base/BaseImageNode.cs index 45eb740..3325d43 100644 --- a/Editor/Scripts/Editor/Nodes/Base Node/BaseImageNode.cs +++ b/Editor/Scripts/Editor/Nodes/Base/BaseImageNode.cs @@ -61,7 +61,7 @@ namespace ImageProcessingGraph.Editor } if (connection.Equals((default(GraphConnection)))) - return; + continue; // Get the output node from the connection var outputNode = asset.Nodes.FirstOrDefault(n => n.ID == connection.outputPort.nodeID); diff --git a/Editor/Scripts/Editor/Nodes/Base Node/BaseImageNode.cs.meta b/Editor/Scripts/Editor/Nodes/Base/BaseImageNode.cs.meta similarity index 100% rename from Editor/Scripts/Editor/Nodes/Base Node/BaseImageNode.cs.meta rename to Editor/Scripts/Editor/Nodes/Base/BaseImageNode.cs.meta diff --git a/Editor/Scripts/Editor/Nodes/Base Node/ExposedPropertyPort.cs b/Editor/Scripts/Editor/Nodes/Base/ExposedPropertyPort.cs similarity index 100% rename from Editor/Scripts/Editor/Nodes/Base Node/ExposedPropertyPort.cs rename to Editor/Scripts/Editor/Nodes/Base/ExposedPropertyPort.cs diff --git a/Editor/Scripts/Editor/Nodes/Base Node/ExposedPropertyPort.cs.meta b/Editor/Scripts/Editor/Nodes/Base/ExposedPropertyPort.cs.meta similarity index 100% rename from Editor/Scripts/Editor/Nodes/Base Node/ExposedPropertyPort.cs.meta rename to Editor/Scripts/Editor/Nodes/Base/ExposedPropertyPort.cs.meta diff --git a/Editor/Scripts/Editor/Nodes/Base Node/PortConnection.cs b/Editor/Scripts/Editor/Nodes/Base/PortConnection.cs similarity index 100% rename from Editor/Scripts/Editor/Nodes/Base Node/PortConnection.cs rename to Editor/Scripts/Editor/Nodes/Base/PortConnection.cs diff --git a/Editor/Scripts/Editor/Nodes/Base Node/PortConnection.cs.meta b/Editor/Scripts/Editor/Nodes/Base/PortConnection.cs.meta similarity index 100% rename from Editor/Scripts/Editor/Nodes/Base Node/PortConnection.cs.meta rename to Editor/Scripts/Editor/Nodes/Base/PortConnection.cs.meta diff --git a/Editor/Scripts/Editor/Nodes/Base/RangeProperty.cs b/Editor/Scripts/Editor/Nodes/Base/RangeProperty.cs new file mode 100644 index 0000000..7e5711d --- /dev/null +++ b/Editor/Scripts/Editor/Nodes/Base/RangeProperty.cs @@ -0,0 +1,23 @@ +using System; +using UnityEngine.UIElements; + +namespace ImageProcessingGraph.Editor +{ + [Serializable] + public class GreyscaleValue + { + public int value = 255; + + public GreyscaleValue() + { + + } + } + + public class GreyscaleField : IntegerField + { + public (int, int) minMax = (0,255); + } + + +} \ No newline at end of file diff --git a/Editor/Scripts/Editor/Nodes/Base/RangeProperty.cs.meta b/Editor/Scripts/Editor/Nodes/Base/RangeProperty.cs.meta new file mode 100644 index 0000000..98d85cf --- /dev/null +++ b/Editor/Scripts/Editor/Nodes/Base/RangeProperty.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 3ab37c25c4884480b8777a62e042a37c +timeCreated: 1745703416 \ No newline at end of file diff --git a/Editor/Scripts/Editor/Nodes/Fun Nodes.meta b/Editor/Scripts/Editor/Nodes/Fun Nodes.meta deleted file mode 100644 index b40f50d..0000000 --- a/Editor/Scripts/Editor/Nodes/Fun Nodes.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: ca37b9337d41484892c89933479f1e7f -timeCreated: 1743745541 \ No newline at end of file diff --git a/Editor/Scripts/Editor/Nodes/Fun Nodes/Texture.meta b/Editor/Scripts/Editor/Nodes/Fun Nodes/Texture.meta deleted file mode 100644 index 35f736c..0000000 --- a/Editor/Scripts/Editor/Nodes/Fun Nodes/Texture.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 1646a2bcaf6b4de488cadad1d7cdf795 -timeCreated: 1743747481 \ No newline at end of file diff --git a/Editor/Scripts/Editor/Nodes/Output/Texture2DOutput.cs b/Editor/Scripts/Editor/Nodes/Output/Texture2DOutput.cs deleted file mode 100644 index 1252400..0000000 --- a/Editor/Scripts/Editor/Nodes/Output/Texture2DOutput.cs +++ /dev/null @@ -1,20 +0,0 @@ -using ImageProcessingGraph.Editor.Nodes.NodeAttributes; -using Unity.Collections; -using UnityEditor; -using UnityEngine; - -namespace ImageProcessingGraph.Editor.Nodes.Output -{ - [NodeInfo("Texture Export", "Export/Texture2D", true)] - public class Texture2DOutput : BaseImageNode - { - [NodeAttributes.Input("")] public ImageData inputPixels; - [NodeAttributes.Input("File Name")] public string fileName; - [NodeAttributes.Input("File Path")] public string fileDirectory; - - public override void Process() - { - AssetDatabase.CreateAsset(inputPixels.ToTexture2D(), $"{fileDirectory}/{fileName}.asset"); - } - } -} \ No newline at end of file diff --git a/Editor/Scripts/Editor/Nodes/Import Nodes/Base.meta b/Editor/Scripts/Editor/Nodes/Types.meta similarity index 77% rename from Editor/Scripts/Editor/Nodes/Import Nodes/Base.meta rename to Editor/Scripts/Editor/Nodes/Types.meta index 4af4f45..32bafea 100644 --- a/Editor/Scripts/Editor/Nodes/Import Nodes/Base.meta +++ b/Editor/Scripts/Editor/Nodes/Types.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 22b0f0e553dc85e489979a232505a332 +guid: cf47dea8bd47175418a3f462e2ddb060 folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/Editor/Scripts/Editor/Nodes/Types/Image.meta b/Editor/Scripts/Editor/Nodes/Types/Image.meta new file mode 100644 index 0000000..0c175ac --- /dev/null +++ b/Editor/Scripts/Editor/Nodes/Types/Image.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 3d053e80c499447499397a64b22ee639 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/Scripts/Editor/Nodes/Types/Image/Adjustments.meta b/Editor/Scripts/Editor/Nodes/Types/Image/Adjustments.meta new file mode 100644 index 0000000..936f053 --- /dev/null +++ b/Editor/Scripts/Editor/Nodes/Types/Image/Adjustments.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e6bd53786a8dee54790032792e0b03da +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/Scripts/Editor/Nodes/Fun Nodes/Texture/Texture2DDesaturate.cs b/Editor/Scripts/Editor/Nodes/Types/Image/Adjustments/Texture2DDesaturate.cs similarity index 100% rename from Editor/Scripts/Editor/Nodes/Fun Nodes/Texture/Texture2DDesaturate.cs rename to Editor/Scripts/Editor/Nodes/Types/Image/Adjustments/Texture2DDesaturate.cs diff --git a/Editor/Scripts/Editor/Nodes/Fun Nodes/Texture/Texture2DDesaturate.cs.meta b/Editor/Scripts/Editor/Nodes/Types/Image/Adjustments/Texture2DDesaturate.cs.meta similarity index 100% rename from Editor/Scripts/Editor/Nodes/Fun Nodes/Texture/Texture2DDesaturate.cs.meta rename to Editor/Scripts/Editor/Nodes/Types/Image/Adjustments/Texture2DDesaturate.cs.meta diff --git a/Editor/Scripts/Editor/Nodes/Fun Nodes/Texture/Texture2DInvert.cs b/Editor/Scripts/Editor/Nodes/Types/Image/Adjustments/Texture2DInvert.cs similarity index 100% rename from Editor/Scripts/Editor/Nodes/Fun Nodes/Texture/Texture2DInvert.cs rename to Editor/Scripts/Editor/Nodes/Types/Image/Adjustments/Texture2DInvert.cs diff --git a/Editor/Scripts/Editor/Nodes/Fun Nodes/Texture/Texture2DInvert.cs.meta b/Editor/Scripts/Editor/Nodes/Types/Image/Adjustments/Texture2DInvert.cs.meta similarity index 100% rename from Editor/Scripts/Editor/Nodes/Fun Nodes/Texture/Texture2DInvert.cs.meta rename to Editor/Scripts/Editor/Nodes/Types/Image/Adjustments/Texture2DInvert.cs.meta diff --git a/Editor/Scripts/Editor/Nodes/Types/Image/Channels.meta b/Editor/Scripts/Editor/Nodes/Types/Image/Channels.meta new file mode 100644 index 0000000..530860a --- /dev/null +++ b/Editor/Scripts/Editor/Nodes/Types/Image/Channels.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 6957ba197a1612a4c8f0f588d40e374f +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/Scripts/Editor/Nodes/Fun Nodes/Texture/RGBACombine.cs b/Editor/Scripts/Editor/Nodes/Types/Image/Channels/RGBACombine.cs similarity index 100% rename from Editor/Scripts/Editor/Nodes/Fun Nodes/Texture/RGBACombine.cs rename to Editor/Scripts/Editor/Nodes/Types/Image/Channels/RGBACombine.cs diff --git a/Editor/Scripts/Editor/Nodes/Fun Nodes/Texture/RGBACombine.cs.meta b/Editor/Scripts/Editor/Nodes/Types/Image/Channels/RGBACombine.cs.meta similarity index 100% rename from Editor/Scripts/Editor/Nodes/Fun Nodes/Texture/RGBACombine.cs.meta rename to Editor/Scripts/Editor/Nodes/Types/Image/Channels/RGBACombine.cs.meta diff --git a/Editor/Scripts/Editor/Nodes/Fun Nodes/Texture/RGBASplit.cs b/Editor/Scripts/Editor/Nodes/Types/Image/Channels/RGBASplit.cs similarity index 98% rename from Editor/Scripts/Editor/Nodes/Fun Nodes/Texture/RGBASplit.cs rename to Editor/Scripts/Editor/Nodes/Types/Image/Channels/RGBASplit.cs index 674a833..d1dca6f 100644 --- a/Editor/Scripts/Editor/Nodes/Fun Nodes/Texture/RGBASplit.cs +++ b/Editor/Scripts/Editor/Nodes/Types/Image/Channels/RGBASplit.cs @@ -1,4 +1,5 @@ using ImageProcessingGraph.Editor.Nodes.NodeAttributes; +using Unity.Burst; using Unity.Collections; using Unity.Jobs; using UnityEngine; @@ -53,6 +54,7 @@ namespace ImageProcessingGraph.Editor.Nodes.Fun_Nodes.Texture } // Job struct for processing the image data + [BurstCompile] struct RGBAJob : IJob { public NativeArray pixelData; diff --git a/Editor/Scripts/Editor/Nodes/Fun Nodes/Texture/RGBASplit.cs.meta b/Editor/Scripts/Editor/Nodes/Types/Image/Channels/RGBASplit.cs.meta similarity index 100% rename from Editor/Scripts/Editor/Nodes/Fun Nodes/Texture/RGBASplit.cs.meta rename to Editor/Scripts/Editor/Nodes/Types/Image/Channels/RGBASplit.cs.meta diff --git a/Editor/Scripts/Editor/Nodes/Types/Image/Dimensions.meta b/Editor/Scripts/Editor/Nodes/Types/Image/Dimensions.meta new file mode 100644 index 0000000..2ab3068 --- /dev/null +++ b/Editor/Scripts/Editor/Nodes/Types/Image/Dimensions.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d31e8b213de87c54caaf096620201846 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/Scripts/Editor/Nodes/Types/Image/Dimensions/GetDimensions.cs b/Editor/Scripts/Editor/Nodes/Types/Image/Dimensions/GetDimensions.cs new file mode 100644 index 0000000..8196161 --- /dev/null +++ b/Editor/Scripts/Editor/Nodes/Types/Image/Dimensions/GetDimensions.cs @@ -0,0 +1,27 @@ +using ImageProcessingGraph.Editor.Nodes.NodeAttributes; +using Unity.Burst; +using Unity.Collections; +using Unity.Jobs; +using UnityEngine; + +namespace ImageProcessingGraph.Editor.Nodes.Fun_Nodes.Texture +{ + [NodeInfoAttribute("Get Dimensions", "Dimensions/Get Dimensions", false)] + public class TextureGetDimensions : BaseImageNode + { + [NodeAttributes.Input("")] + public ImageData inputTexture; + + [NodeAttributes.Output("Width")] + public int width; + + [NodeAttributes.Output("Height")] + public int height; + + public override void Process() + { + this.width = inputTexture.Width; + this.height = inputTexture.Height; + } + } +} diff --git a/Editor/Scripts/Editor/Nodes/Types/Image/Dimensions/GetDimensions.cs.meta b/Editor/Scripts/Editor/Nodes/Types/Image/Dimensions/GetDimensions.cs.meta new file mode 100644 index 0000000..874953c --- /dev/null +++ b/Editor/Scripts/Editor/Nodes/Types/Image/Dimensions/GetDimensions.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 71e1db2a5bfe4a54a6ce2a99fe4d02fb +timeCreated: 1745699625 \ No newline at end of file diff --git a/Editor/Scripts/Editor/Nodes/Output.meta b/Editor/Scripts/Editor/Nodes/Types/Image/Export.meta similarity index 100% rename from Editor/Scripts/Editor/Nodes/Output.meta rename to Editor/Scripts/Editor/Nodes/Types/Image/Export.meta diff --git a/Editor/Scripts/Editor/Nodes/Types/Image/Export/Texture2DOutput.cs b/Editor/Scripts/Editor/Nodes/Types/Image/Export/Texture2DOutput.cs new file mode 100644 index 0000000..0f6029d --- /dev/null +++ b/Editor/Scripts/Editor/Nodes/Types/Image/Export/Texture2DOutput.cs @@ -0,0 +1,37 @@ +using System.ComponentModel.Composition.Primitives; +using ImageProcessingGraph.Editor.Nodes.NodeAttributes; +using Unity.Collections; +using UnityEditor; +using UnityEngine; + +namespace ImageProcessingGraph.Editor.Nodes.Output +{ + [NodeInfo("Texture Export", "Export/Texture2D", true)] + public class Texture2DOutput : BaseImageNode + { + [NodeAttributes.Input("")] public ImageData inputPixels; + [NodeAttributes.Input("File Name")] public string fileName; + [NodeAttributes.Input("File Path")] public string fileDirectory; + + public enum ExportType + { + Texture2D, + PNG + } + + [NodeAttributes.Input("Export Type")] public ExportType exportType; + + public override void Process() + { + switch (exportType) + { + case ExportType.Texture2D: + AssetDatabase.CreateAsset(inputPixels.ToTexture2D(), $"{fileDirectory}/{fileName}.asset"); + break; + case ExportType.PNG: + inputPixels.ExportPNG($"{fileDirectory}/{fileName}.png"); + break; + } + } + } +} \ No newline at end of file diff --git a/Editor/Scripts/Editor/Nodes/Output/Texture2DOutput.cs.meta b/Editor/Scripts/Editor/Nodes/Types/Image/Export/Texture2DOutput.cs.meta similarity index 100% rename from Editor/Scripts/Editor/Nodes/Output/Texture2DOutput.cs.meta rename to Editor/Scripts/Editor/Nodes/Types/Image/Export/Texture2DOutput.cs.meta diff --git a/Editor/Scripts/Editor/Nodes/Types/Image/Filters.meta b/Editor/Scripts/Editor/Nodes/Types/Image/Filters.meta new file mode 100644 index 0000000..1ddc493 --- /dev/null +++ b/Editor/Scripts/Editor/Nodes/Types/Image/Filters.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 96b583a3bbd8b2c45a5eaa9e0f00d1b2 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/Scripts/Editor/Nodes/Types/Image/Image.meta b/Editor/Scripts/Editor/Nodes/Types/Image/Image.meta new file mode 100644 index 0000000..8545cd4 --- /dev/null +++ b/Editor/Scripts/Editor/Nodes/Types/Image/Image.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: bf8e2895a77954d45864e9f8edae29c3 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/Scripts/Editor/Nodes/Import Nodes.meta b/Editor/Scripts/Editor/Nodes/Types/Image/Import.meta similarity index 100% rename from Editor/Scripts/Editor/Nodes/Import Nodes.meta rename to Editor/Scripts/Editor/Nodes/Types/Image/Import.meta diff --git a/Editor/Scripts/Editor/Nodes/Import Nodes/Texture2DImport.cs b/Editor/Scripts/Editor/Nodes/Types/Image/Import/Texture2DImport.cs similarity index 53% rename from Editor/Scripts/Editor/Nodes/Import Nodes/Texture2DImport.cs rename to Editor/Scripts/Editor/Nodes/Types/Image/Import/Texture2DImport.cs index 6394633..965a040 100644 --- a/Editor/Scripts/Editor/Nodes/Import Nodes/Texture2DImport.cs +++ b/Editor/Scripts/Editor/Nodes/Types/Image/Import/Texture2DImport.cs @@ -6,7 +6,7 @@ using UnityEngine; namespace ImageProcessingGraph.Editor.Nodes.Import_Nodes { - [NodeInfo("Texture Import", "Imports/Texture2D", true)] + [NodeInfo("Texture Import", "Imports/Import Texture", true)] public class Texture2DImport : BaseImageNode { [NodeAttributes.Input("")] @@ -23,6 +23,20 @@ namespace ImageProcessingGraph.Editor.Nodes.Import_Nodes { if (this.textureImport != null) { + TextureImporter textureImporter = AssetImporter.GetAtPath(AssetDatabase.GetAssetPath(textureImport)) as TextureImporter; + + TextureImporterPlatformSettings texset = textureImporter.GetDefaultPlatformTextureSettings(); + texset.format=TextureImporterFormat.RGBA32; + texset.maxTextureSize=16384; + textureImporter.SetPlatformTextureSettings(texset); + + TextureImporterSettings settings = new TextureImporterSettings(); + textureImporter.ReadTextureSettings(settings); + settings.readable = true; + textureImporter.SetTextureSettings(settings); + textureImporter.SaveAndReimport(); + + this.textureOutput = new ImageData(textureImport); this.fileName = textureImport.name; this.filePath = Path.GetDirectoryName(AssetDatabase.GetAssetPath(textureImport)); diff --git a/Editor/Scripts/Editor/Nodes/Import Nodes/Texture2DImport.cs.meta b/Editor/Scripts/Editor/Nodes/Types/Image/Import/Texture2DImport.cs.meta similarity index 100% rename from Editor/Scripts/Editor/Nodes/Import Nodes/Texture2DImport.cs.meta rename to Editor/Scripts/Editor/Nodes/Types/Image/Import/Texture2DImport.cs.meta diff --git a/Editor/Scripts/Editor/Nodes/Types/Image/Utilities.meta b/Editor/Scripts/Editor/Nodes/Types/Image/Utilities.meta new file mode 100644 index 0000000..65c0171 --- /dev/null +++ b/Editor/Scripts/Editor/Nodes/Types/Image/Utilities.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c524131b4dbc3414ab755a10441b3841 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/Scripts/Editor/Nodes/Types/Image/Utilities/SingleChannelColor.cs b/Editor/Scripts/Editor/Nodes/Types/Image/Utilities/SingleChannelColor.cs new file mode 100644 index 0000000..3b3c5ab --- /dev/null +++ b/Editor/Scripts/Editor/Nodes/Types/Image/Utilities/SingleChannelColor.cs @@ -0,0 +1,63 @@ +using ImageProcessingGraph.Editor.Nodes.NodeAttributes; +using Unity.Burst; +using Unity.Collections; +using Unity.Jobs; +using UnityEngine; + +namespace ImageProcessingGraph.Editor.Nodes.Types.Image.Utilities +{ + public class SingleChannelColor + { + [NodeInfoAttribute("Channel Color", "Utility/Channel Color", false)] + public class SingleColorChannel : BaseImageNode + { + [NodeAttributes.Input("Color")] public GreyscaleValue range; + + [NodeAttributes.Input("Width")] public int Width; + + [NodeAttributes.Input("Height")] public int Height; + + [NodeAttributes.Output("Color")] public SplitChannelData OutputColor; + + public override void Process() + { + int pixelCount = Width * Height; + + NativeArray outputData = new NativeArray(pixelCount * 4, Allocator.TempJob); + + CreateSingleColorJob job = new CreateSingleColorJob + { + color32 = range.value, + outputData = outputData, + width = Width, + height = Height + }; + + job.Run(); + + OutputColor = new SplitChannelData(outputData.ToArray(), (Width, Height)); + + outputData.Dispose(); + } + + [BurstCompile] + struct CreateSingleColorJob : IJob + { + public int color32; + [WriteOnly] + public NativeArray outputData; + public int width; + public int height; + + public void Execute() + { + // More efficient linear write pattern + for (int i = 0; i < width*height*4; i++) + { + outputData[i] = (byte)color32; + } + } + } + } + } +} diff --git a/Editor/Scripts/Editor/Nodes/Types/Image/Utilities/SingleChannelColor.cs.meta b/Editor/Scripts/Editor/Nodes/Types/Image/Utilities/SingleChannelColor.cs.meta new file mode 100644 index 0000000..da1f1bd --- /dev/null +++ b/Editor/Scripts/Editor/Nodes/Types/Image/Utilities/SingleChannelColor.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: aef9d7bde3d544e6bca5eef8ff58a60e +timeCreated: 1745699866 \ No newline at end of file diff --git a/Editor/Scripts/Editor/Nodes/Types/String.meta b/Editor/Scripts/Editor/Nodes/Types/String.meta new file mode 100644 index 0000000..df0e408 --- /dev/null +++ b/Editor/Scripts/Editor/Nodes/Types/String.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 77d8c5639ebc40947940b6b150aad306 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/Scripts/Editor/Windows/ImageProcessingGraphNodeVisual.cs b/Editor/Scripts/Editor/Windows/ImageProcessingGraphNodeVisual.cs index 2e23f0c..8f1b3a3 100644 --- a/Editor/Scripts/Editor/Windows/ImageProcessingGraphNodeVisual.cs +++ b/Editor/Scripts/Editor/Windows/ImageProcessingGraphNodeVisual.cs @@ -120,8 +120,9 @@ namespace ImageProcessingGraph.Editor.Unity_Image_Processing.Scripts.Editor.Wind if (propertyField != null) { // Register a callback for when the value changes - if (propertyField is IntegerField intField) + if (propertyField.GetType() == typeof(IntegerField)) { + var intField = propertyField as IntegerField; intField.RegisterValueChangedCallback(evt => { field.SetValue(graphNode, evt.newValue); // Update the field with the new value @@ -176,6 +177,29 @@ namespace ImageProcessingGraph.Editor.Unity_Image_Processing.Scripts.Editor.Wind field.SetValue(graphNode, evt.newValue); // Update the field with the new value }); } + else if (propertyField is EnumField enumField) + { + enumField.RegisterValueChangedCallback(evt => + { + field.SetValue(graphNode, evt.newValue); // 🎯 Update the field with the new enum value + }); + } + else if (propertyField.GetType() == typeof(GreyscaleField)) + { + var greyscaleField = propertyField as GreyscaleField; + greyscaleField.RegisterValueChangedCallback(evt => + { + var value = (GreyscaleValue)field.GetValue(graphNode); + + if(evt.newValue > greyscaleField.minMax.Item2) + value.value = greyscaleField.minMax.Item2; + else if(evt.newValue < greyscaleField.minMax.Item1) + value.value = greyscaleField.minMax.Item1; + + value.value = (int)evt.newValue; + }); + } + propertyFieldContainer.Add(propertyField); port.Add(propertyFieldContainer); @@ -192,7 +216,6 @@ namespace ImageProcessingGraph.Editor.Unity_Image_Processing.Scripts.Editor.Wind } } - // Create appropriate property field based on the type of the variable private VisualElement CreatePropertyFieldForType(Type type, object value) { if (type == typeof(int)) @@ -235,11 +258,24 @@ namespace ImageProcessingGraph.Editor.Unity_Image_Processing.Scripts.Editor.Wind var objectField = new ObjectField { value = (Texture2D)value, objectType = typeof(Texture2D) }; return objectField; } + else if (type.IsEnum) // 💥✨ ENUMS, BABY! 💥✨ + { + var enumField = new EnumField((Enum)value); + return enumField; + } + else if (type == typeof(GreyscaleValue)) + { - // Add more types as needed (Vector3, etc.) + var greyscaleValue = (GreyscaleValue)value; + var intField = new GreyscaleField { value = (int)greyscaleValue.value }; + return intField; + } + + // Add more types as needed return null; } + public void SavePosition() => graphNode.SetPosition(GetPosition()); } }