Compare commits
4 Commits
08d5b1bb8d
...
d972a007d2
Author | SHA1 | Date | |
---|---|---|---|
|
d972a007d2 | ||
|
a7353ed8f6 | ||
|
b625c7d8c3 | ||
|
e8e1978af4 |
112
.gitignore
vendored
112
.gitignore
vendored
@ -1,75 +1,75 @@
|
|||||||
# ---> Unity
|
# User-specific files
|
||||||
# This .gitignore file should be placed at the root of your Unity project directory
|
.idea/
|
||||||
#
|
.vscode/
|
||||||
# Get latest from https://github.com/github/gitignore/blob/main/Unity.gitignore
|
*.suo
|
||||||
#
|
*.user
|
||||||
/[Ll]ibrary/
|
*.userosscache
|
||||||
/[Tt]emp/
|
*.sln.docstates
|
||||||
/[Oo]bj/
|
|
||||||
/[Bb]uild/
|
|
||||||
/[Bb]uilds/
|
|
||||||
/[Ll]ogs/
|
|
||||||
/[Uu]ser[Ss]ettings/
|
|
||||||
|
|
||||||
# MemoryCaptures can get excessive in size.
|
# Windows image file thumbs
|
||||||
# They also could contain extremely sensitive data
|
Thumbs.db
|
||||||
/[Mm]emoryCaptures/
|
Desktop.ini
|
||||||
|
|
||||||
# Recordings can get excessive in size
|
# Windows Installer files
|
||||||
/[Rr]ecordings/
|
*.cab
|
||||||
|
*.msi
|
||||||
|
*.msm
|
||||||
|
*.msp
|
||||||
|
|
||||||
# Uncomment this line if you wish to ignore the asset store tools plugin
|
# Build directories
|
||||||
# /[Aa]ssets/AssetStoreTools*
|
[Ll]ibrary/
|
||||||
|
[Ll]ogs/
|
||||||
|
[Tt]emp/
|
||||||
|
[Tt]arget/
|
||||||
|
|
||||||
# Autogenerated Jetbrains Rider plugin
|
# User-generated files
|
||||||
/[Aa]ssets/Plugins/Editor/JetBrains*
|
*.booproj
|
||||||
|
*.pidb
|
||||||
|
*.userprefs
|
||||||
|
|
||||||
# Visual Studio cache directory
|
# Unity-generated file types
|
||||||
.vs/
|
|
||||||
|
|
||||||
# Gradle cache directory
|
|
||||||
.gradle/
|
|
||||||
|
|
||||||
# Autogenerated VS/MD/Consulo solution and project files
|
|
||||||
ExportedObj/
|
|
||||||
.consulo/
|
|
||||||
*.csproj
|
*.csproj
|
||||||
*.unityproj
|
*.unityproj
|
||||||
*.sln
|
*.sln
|
||||||
*.suo
|
|
||||||
*.tmp
|
*.tmp
|
||||||
*.user
|
|
||||||
*.userprefs
|
|
||||||
*.pidb
|
|
||||||
*.booproj
|
|
||||||
*.svd
|
|
||||||
*.pdb
|
|
||||||
*.mdb
|
|
||||||
*.opendb
|
|
||||||
*.VC.db
|
|
||||||
|
|
||||||
# Unity3D generated meta files
|
# Unity's Auto-generated Visual Studio files
|
||||||
*.pidb.meta
|
.vs/
|
||||||
*.pdb.meta
|
|
||||||
*.mdb.meta
|
|
||||||
|
|
||||||
# Unity3D generated file on crash reports
|
# Memory Captures and crash dumps
|
||||||
sysinfo.txt
|
*.stackdump
|
||||||
|
*.dmp
|
||||||
|
*.bak
|
||||||
|
|
||||||
# Builds
|
# Build Results
|
||||||
*.apk
|
*.apk
|
||||||
*.aab
|
|
||||||
*.unitypackage
|
*.unitypackage
|
||||||
*.unitypackage.meta
|
|
||||||
*.app
|
*.app
|
||||||
|
*.exe
|
||||||
|
*.xcodeproj
|
||||||
|
*.log
|
||||||
|
*.tlog
|
||||||
|
|
||||||
# Crashlytics generated file
|
# External tools / packages (can be useful to keep if necessary)
|
||||||
crashlytics-build.properties
|
Packages/
|
||||||
|
|
||||||
# Packed Addressables
|
# .NET configuration files
|
||||||
/[Aa]ssets/[Aa]ddressable[Aa]ssets[Dd]ata/*/*.bin*
|
project.settings/
|
||||||
|
|
||||||
# Temporary auto-generated Android Assets
|
# Logs and statistics
|
||||||
/[Aa]ssets/[Ss]treamingAssets/aa.meta
|
*.log
|
||||||
/[Aa]ssets/[Ss]treamingAssets/aa/*
|
*.bak
|
||||||
|
*.swp
|
||||||
|
|
||||||
|
# JetBrains Rider files
|
||||||
|
.idea/
|
||||||
|
|
||||||
|
# Mac OS files
|
||||||
|
.DS_Store
|
||||||
|
|
||||||
|
# Linux files
|
||||||
|
*~
|
||||||
|
|
||||||
|
# Package and Unity Asset files
|
||||||
|
AssetBundles/
|
||||||
|
Build/
|
||||||
|
12
GraphView.uss
Normal file
12
GraphView.uss
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
ImageProcessingGraphViewWindow
|
||||||
|
{
|
||||||
|
flex-grow: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#Grid
|
||||||
|
{
|
||||||
|
--thick-lines: 0;
|
||||||
|
--spacing: 15;
|
||||||
|
--grid-background-color: rgb(25,25,25);
|
||||||
|
--line-color: rgb(32,32,32);
|
||||||
|
}
|
11
GraphView.uss.meta
Normal file
11
GraphView.uss.meta
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 0432b5222a07aad498018736ca300a6f
|
||||||
|
ScriptedImporter:
|
||||||
|
internalIDToNameTable: []
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
script: {fileID: 12385, guid: 0000000000000000e000000000000000, type: 0}
|
||||||
|
disableValidation: 0
|
8
Graphs.meta
Normal file
8
Graphs.meta
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: f6fe8f57402cf44e8bb5f1dffb3be6d8
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
232
Graphs/URP-MAS.asset
Normal file
232
Graphs/URP-MAS.asset
Normal file
@ -0,0 +1,232 @@
|
|||||||
|
%YAML 1.1
|
||||||
|
%TAG !u! tag:unity3d.com,2011:
|
||||||
|
--- !u!114 &11400000
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 0}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 11500000, guid: 1da462fd3f736d04e80556b4ac8b470f, type: 3}
|
||||||
|
m_Name: URP-MAS
|
||||||
|
m_EditorClassIdentifier:
|
||||||
|
nodes:
|
||||||
|
- rid: 6869590814762467406
|
||||||
|
- rid: 6869590814762467407
|
||||||
|
- rid: 6869590814762467408
|
||||||
|
- rid: 6869590814762467409
|
||||||
|
- rid: 6869590814762467410
|
||||||
|
- rid: 6869590814762467411
|
||||||
|
- rid: 6869590814762467412
|
||||||
|
connections:
|
||||||
|
- inputPort:
|
||||||
|
nodeID: c72eea15-501d-41b1-add3-4f0816ef3373
|
||||||
|
nodeType: StringAppend
|
||||||
|
portID: 0
|
||||||
|
outputPort:
|
||||||
|
nodeID: c21a6722-828f-4372-a718-298a0fe7b79b
|
||||||
|
nodeType: StringAppend
|
||||||
|
portID: 0
|
||||||
|
- inputPort:
|
||||||
|
nodeID: 9ccc58ba-79a7-4a7f-8057-3bdfbf8fb5c3
|
||||||
|
nodeType: Texture2DOutput
|
||||||
|
portID: 1
|
||||||
|
outputPort:
|
||||||
|
nodeID: c72eea15-501d-41b1-add3-4f0816ef3373
|
||||||
|
nodeType: StringAppend
|
||||||
|
portID: 0
|
||||||
|
- inputPort:
|
||||||
|
nodeID: 87c7a966-55ec-42aa-a537-73ebe906412b
|
||||||
|
nodeType: RGBASplit
|
||||||
|
portID: 0
|
||||||
|
outputPort:
|
||||||
|
nodeID: ac4be66e-d3b8-4633-a692-60cb30579f97
|
||||||
|
nodeType: Texture2DImport
|
||||||
|
portID: 0
|
||||||
|
- inputPort:
|
||||||
|
nodeID: 1c21d8e6-5b93-4a6f-a7ff-7322be2d20be
|
||||||
|
nodeType: RGBASplit
|
||||||
|
portID: 0
|
||||||
|
outputPort:
|
||||||
|
nodeID: 9b32fc10-fda3-4faa-82ac-efcff95a5138
|
||||||
|
nodeType: Texture2DImport
|
||||||
|
portID: 0
|
||||||
|
- inputPort:
|
||||||
|
nodeID: 3abef457-f0ec-456e-baa8-e8ae657b49e4
|
||||||
|
nodeType: RGBASCombine
|
||||||
|
portID: 1
|
||||||
|
outputPort:
|
||||||
|
nodeID: 87c7a966-55ec-42aa-a537-73ebe906412b
|
||||||
|
nodeType: RGBASplit
|
||||||
|
portID: 0
|
||||||
|
- inputPort:
|
||||||
|
nodeID: 3abef457-f0ec-456e-baa8-e8ae657b49e4
|
||||||
|
nodeType: RGBASCombine
|
||||||
|
portID: 0
|
||||||
|
outputPort:
|
||||||
|
nodeID: 1c21d8e6-5b93-4a6f-a7ff-7322be2d20be
|
||||||
|
nodeType: RGBASplit
|
||||||
|
portID: 0
|
||||||
|
- inputPort:
|
||||||
|
nodeID: 3abef457-f0ec-456e-baa8-e8ae657b49e4
|
||||||
|
nodeType: RGBASCombine
|
||||||
|
portID: 3
|
||||||
|
outputPort:
|
||||||
|
nodeID: 1c21d8e6-5b93-4a6f-a7ff-7322be2d20be
|
||||||
|
nodeType: RGBASplit
|
||||||
|
portID: 3
|
||||||
|
- inputPort:
|
||||||
|
nodeID: b882f7b7-9f8b-43ef-a79a-33d4e874edd0
|
||||||
|
nodeType: Texture2DOutput
|
||||||
|
portID: 0
|
||||||
|
outputPort:
|
||||||
|
nodeID: 3abef457-f0ec-456e-baa8-e8ae657b49e4
|
||||||
|
nodeType: RGBASCombine
|
||||||
|
portID: 0
|
||||||
|
- inputPort:
|
||||||
|
nodeID: b882f7b7-9f8b-43ef-a79a-33d4e874edd0
|
||||||
|
nodeType: Texture2DOutput
|
||||||
|
portID: 2
|
||||||
|
outputPort:
|
||||||
|
nodeID: 9b32fc10-fda3-4faa-82ac-efcff95a5138
|
||||||
|
nodeType: Texture2DImport
|
||||||
|
portID: 2
|
||||||
|
- inputPort:
|
||||||
|
nodeID: 97953833-bdf9-47b5-b1d2-b4cbfa19f57a
|
||||||
|
nodeType: StringAppend
|
||||||
|
portID: 0
|
||||||
|
outputPort:
|
||||||
|
nodeID: 9b32fc10-fda3-4faa-82ac-efcff95a5138
|
||||||
|
nodeType: Texture2DImport
|
||||||
|
portID: 1
|
||||||
|
- inputPort:
|
||||||
|
nodeID: b882f7b7-9f8b-43ef-a79a-33d4e874edd0
|
||||||
|
nodeType: Texture2DOutput
|
||||||
|
portID: 1
|
||||||
|
outputPort:
|
||||||
|
nodeID: 97953833-bdf9-47b5-b1d2-b4cbfa19f57a
|
||||||
|
nodeType: StringAppend
|
||||||
|
portID: 0
|
||||||
|
- inputPort:
|
||||||
|
nodeID: 3abef457-f0ec-456e-baa8-e8ae657b49e4
|
||||||
|
nodeType: RGBASCombine
|
||||||
|
portID: 2
|
||||||
|
outputPort:
|
||||||
|
nodeID: 1c21d8e6-5b93-4a6f-a7ff-7322be2d20be
|
||||||
|
nodeType: RGBASplit
|
||||||
|
portID: 3
|
||||||
|
- inputPort:
|
||||||
|
nodeID: 3abef457-f0ec-456e-baa8-e8ae657b49e4
|
||||||
|
nodeType: RGBASCombine
|
||||||
|
portID: 3
|
||||||
|
outputPort:
|
||||||
|
nodeID: 1c21d8e6-5b93-4a6f-a7ff-7322be2d20be
|
||||||
|
nodeType: RGBASplit
|
||||||
|
portID: 2
|
||||||
|
references:
|
||||||
|
version: 2
|
||||||
|
RefIds:
|
||||||
|
- rid: 6869590814762467406
|
||||||
|
type: {class: Texture2DImport, ns: ImageProcessingGraph.Editor.Nodes.Import_Nodes, asm: ImageProcessingGraphEditor}
|
||||||
|
data:
|
||||||
|
guid: ac4be66e-d3b8-4633-a692-60cb30579f97
|
||||||
|
position:
|
||||||
|
serializedVersion: 2
|
||||||
|
x: -285.5
|
||||||
|
y: 18
|
||||||
|
width: 311
|
||||||
|
height: 125
|
||||||
|
typeName: ImageProcessingGraph.Editor.Nodes.Import_Nodes.Texture2DImport,
|
||||||
|
ImageProcessingGraphEditor, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
|
||||||
|
asset: {fileID: 11400000}
|
||||||
|
textureImport: {fileID: 2800000, guid: 44da9e368ce69454aa6ccc40919a7f50, type: 3}
|
||||||
|
fileName:
|
||||||
|
filePath:
|
||||||
|
- rid: 6869590814762467407
|
||||||
|
type: {class: Texture2DImport, ns: ImageProcessingGraph.Editor.Nodes.Import_Nodes, asm: ImageProcessingGraphEditor}
|
||||||
|
data:
|
||||||
|
guid: 9b32fc10-fda3-4faa-82ac-efcff95a5138
|
||||||
|
position:
|
||||||
|
serializedVersion: 2
|
||||||
|
x: -287
|
||||||
|
y: 292
|
||||||
|
width: 288
|
||||||
|
height: 125
|
||||||
|
typeName: ImageProcessingGraph.Editor.Nodes.Import_Nodes.Texture2DImport,
|
||||||
|
ImageProcessingGraphEditor, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
|
||||||
|
asset: {fileID: 11400000}
|
||||||
|
textureImport: {fileID: 2800000, guid: 1640d081a2287448cb2a75fba48b9dcf, type: 3}
|
||||||
|
fileName:
|
||||||
|
filePath:
|
||||||
|
- rid: 6869590814762467408
|
||||||
|
type: {class: RGBASplit, ns: ImageProcessingGraph.Editor.Nodes.Fun_Nodes.Texture, asm: ImageProcessingGraphEditor}
|
||||||
|
data:
|
||||||
|
guid: 87c7a966-55ec-42aa-a537-73ebe906412b
|
||||||
|
position:
|
||||||
|
serializedVersion: 2
|
||||||
|
x: 124
|
||||||
|
y: 18
|
||||||
|
width: 138
|
||||||
|
height: 149
|
||||||
|
typeName: ImageProcessingGraph.Editor.Nodes.Fun_Nodes.Texture.RGBASplit,
|
||||||
|
ImageProcessingGraphEditor, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
|
||||||
|
asset: {fileID: 11400000}
|
||||||
|
- rid: 6869590814762467409
|
||||||
|
type: {class: RGBASplit, ns: ImageProcessingGraph.Editor.Nodes.Fun_Nodes.Texture, asm: ImageProcessingGraphEditor}
|
||||||
|
data:
|
||||||
|
guid: 1c21d8e6-5b93-4a6f-a7ff-7322be2d20be
|
||||||
|
position:
|
||||||
|
serializedVersion: 2
|
||||||
|
x: 124
|
||||||
|
y: 167
|
||||||
|
width: 138
|
||||||
|
height: 149
|
||||||
|
typeName: ImageProcessingGraph.Editor.Nodes.Fun_Nodes.Texture.RGBASplit,
|
||||||
|
ImageProcessingGraphEditor, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
|
||||||
|
asset: {fileID: 11400000}
|
||||||
|
- rid: 6869590814762467410
|
||||||
|
type: {class: RGBASCombine, ns: ImageProcessingGraph.Editor.Nodes.Fun_Nodes.Texture, asm: ImageProcessingGraphEditor}
|
||||||
|
data:
|
||||||
|
guid: 3abef457-f0ec-456e-baa8-e8ae657b49e4
|
||||||
|
position:
|
||||||
|
serializedVersion: 2
|
||||||
|
x: 315.5
|
||||||
|
y: 92.5
|
||||||
|
width: 138
|
||||||
|
height: 149
|
||||||
|
typeName: ImageProcessingGraph.Editor.Nodes.Fun_Nodes.Texture.RGBASCombine,
|
||||||
|
ImageProcessingGraphEditor, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
|
||||||
|
asset: {fileID: 11400000}
|
||||||
|
- rid: 6869590814762467411
|
||||||
|
type: {class: Texture2DOutput, ns: ImageProcessingGraph.Editor.Nodes.Output, asm: ImageProcessingGraphEditor}
|
||||||
|
data:
|
||||||
|
guid: b882f7b7-9f8b-43ef-a79a-33d4e874edd0
|
||||||
|
position:
|
||||||
|
serializedVersion: 2
|
||||||
|
x: 559.5
|
||||||
|
y: 143
|
||||||
|
width: 129.5
|
||||||
|
height: 125
|
||||||
|
typeName: ImageProcessingGraph.Editor.Nodes.Output.Texture2DOutput, ImageProcessingGraphEditor,
|
||||||
|
Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
|
||||||
|
asset: {fileID: 11400000}
|
||||||
|
fileName:
|
||||||
|
fileDirectory:
|
||||||
|
- rid: 6869590814762467412
|
||||||
|
type: {class: StringAppend, ns: ImageProcessingGraph.Editor.Nodes.String_Nodes, asm: ImageProcessingGraphEditor}
|
||||||
|
data:
|
||||||
|
guid: 97953833-bdf9-47b5-b1d2-b4cbfa19f57a
|
||||||
|
position:
|
||||||
|
serializedVersion: 2
|
||||||
|
x: 124
|
||||||
|
y: 450.5
|
||||||
|
width: 248
|
||||||
|
height: 101
|
||||||
|
typeName: ImageProcessingGraph.Editor.Nodes.String_Nodes.StringAppend, ImageProcessingGraphEditor,
|
||||||
|
Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
|
||||||
|
asset: {fileID: 11400000}
|
||||||
|
baseString:
|
||||||
|
appendString: _MAS
|
||||||
|
output:
|
8
Graphs/URP-MAS.asset.meta
Normal file
8
Graphs/URP-MAS.asset.meta
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: d04964bb165ef4820be34fe3f050be61
|
||||||
|
NativeFormatImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
mainObjectFileID: 11400000
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
8
Icons.meta
Normal file
8
Icons.meta
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 2d724fe0ba9ad8949bac2c328d3d8288
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
BIN
Icons/imageprocessor_icon.png
Normal file
BIN
Icons/imageprocessor_icon.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 2.6 KiB |
117
Icons/imageprocessor_icon.png.meta
Normal file
117
Icons/imageprocessor_icon.png.meta
Normal file
@ -0,0 +1,117 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 91cfc70686fca0145b2b37b8b1db5dff
|
||||||
|
TextureImporter:
|
||||||
|
internalIDToNameTable: []
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 13
|
||||||
|
mipmaps:
|
||||||
|
mipMapMode: 0
|
||||||
|
enableMipMap: 0
|
||||||
|
sRGBTexture: 1
|
||||||
|
linearTexture: 0
|
||||||
|
fadeOut: 0
|
||||||
|
borderMipMap: 0
|
||||||
|
mipMapsPreserveCoverage: 0
|
||||||
|
alphaTestReferenceValue: 0.5
|
||||||
|
mipMapFadeDistanceStart: 1
|
||||||
|
mipMapFadeDistanceEnd: 3
|
||||||
|
bumpmap:
|
||||||
|
convertToNormalMap: 0
|
||||||
|
externalNormalMap: 0
|
||||||
|
heightScale: 0.25
|
||||||
|
normalMapFilter: 0
|
||||||
|
flipGreenChannel: 0
|
||||||
|
isReadable: 0
|
||||||
|
streamingMipmaps: 0
|
||||||
|
streamingMipmapsPriority: 0
|
||||||
|
vTOnly: 0
|
||||||
|
ignoreMipmapLimit: 0
|
||||||
|
grayScaleToAlpha: 0
|
||||||
|
generateCubemap: 6
|
||||||
|
cubemapConvolution: 0
|
||||||
|
seamlessCubemap: 0
|
||||||
|
textureFormat: 1
|
||||||
|
maxTextureSize: 2048
|
||||||
|
textureSettings:
|
||||||
|
serializedVersion: 2
|
||||||
|
filterMode: 0
|
||||||
|
aniso: 1
|
||||||
|
mipBias: 0
|
||||||
|
wrapU: 1
|
||||||
|
wrapV: 1
|
||||||
|
wrapW: 0
|
||||||
|
nPOTScale: 0
|
||||||
|
lightmap: 0
|
||||||
|
compressionQuality: 50
|
||||||
|
spriteMode: 0
|
||||||
|
spriteExtrude: 1
|
||||||
|
spriteMeshType: 1
|
||||||
|
alignment: 0
|
||||||
|
spritePivot: {x: 0.5, y: 0.5}
|
||||||
|
spritePixelsToUnits: 100
|
||||||
|
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
|
||||||
|
spriteGenerateFallbackPhysicsShape: 1
|
||||||
|
alphaUsage: 1
|
||||||
|
alphaIsTransparency: 1
|
||||||
|
spriteTessellationDetail: -1
|
||||||
|
textureType: 2
|
||||||
|
textureShape: 1
|
||||||
|
singleChannelComponent: 0
|
||||||
|
flipbookRows: 1
|
||||||
|
flipbookColumns: 1
|
||||||
|
maxTextureSizeSet: 0
|
||||||
|
compressionQualitySet: 0
|
||||||
|
textureFormatSet: 0
|
||||||
|
ignorePngGamma: 0
|
||||||
|
applyGammaDecoding: 0
|
||||||
|
swizzle: 50462976
|
||||||
|
cookieLightType: 0
|
||||||
|
platformSettings:
|
||||||
|
- serializedVersion: 4
|
||||||
|
buildTarget: DefaultTexturePlatform
|
||||||
|
maxTextureSize: 2048
|
||||||
|
resizeAlgorithm: 0
|
||||||
|
textureFormat: -1
|
||||||
|
textureCompression: 1
|
||||||
|
compressionQuality: 50
|
||||||
|
crunchedCompression: 0
|
||||||
|
allowsAlphaSplitting: 0
|
||||||
|
overridden: 0
|
||||||
|
ignorePlatformSupport: 0
|
||||||
|
androidETC2FallbackOverride: 0
|
||||||
|
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||||
|
- serializedVersion: 4
|
||||||
|
buildTarget: Standalone
|
||||||
|
maxTextureSize: 2048
|
||||||
|
resizeAlgorithm: 0
|
||||||
|
textureFormat: -1
|
||||||
|
textureCompression: 1
|
||||||
|
compressionQuality: 50
|
||||||
|
crunchedCompression: 0
|
||||||
|
allowsAlphaSplitting: 0
|
||||||
|
overridden: 0
|
||||||
|
ignorePlatformSupport: 0
|
||||||
|
androidETC2FallbackOverride: 0
|
||||||
|
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||||
|
spriteSheet:
|
||||||
|
serializedVersion: 2
|
||||||
|
sprites: []
|
||||||
|
outline: []
|
||||||
|
customData:
|
||||||
|
physicsShape: []
|
||||||
|
bones: []
|
||||||
|
spriteID:
|
||||||
|
internalID: 0
|
||||||
|
vertices: []
|
||||||
|
indices:
|
||||||
|
edges: []
|
||||||
|
weights: []
|
||||||
|
secondaryTextures: []
|
||||||
|
spriteCustomMetadata:
|
||||||
|
entries: []
|
||||||
|
nameFileIdTable: {}
|
||||||
|
mipmapLimitGroupName:
|
||||||
|
pSDRemoveMatte: 0
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
@ -1,2 +1,2 @@
|
|||||||
# Unity Image Processing Package
|
# Graph-Based Image Processing Tool
|
||||||
|
A tool for applying image transformations and effects using a graph-based node system.
|
||||||
|
3
README.md.meta
Normal file
3
README.md.meta
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 7c410edad4eb41efb5a4419a92f19da4
|
||||||
|
timeCreated: 1745693574
|
8
Scripts.meta
Normal file
8
Scripts.meta
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: d50733debc2a73c43b07c45bcac43761
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
8
Scripts/Editor.meta
Normal file
8
Scripts/Editor.meta
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 7dab1883baf68bf47b782e97d8b6aa42
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
8
Scripts/Editor/Data Types.meta
Normal file
8
Scripts/Editor/Data Types.meta
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 92c5327ff293bff4392ca3d8d16245cc
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
25
Scripts/Editor/Data Types/IPTPort.cs
Normal file
25
Scripts/Editor/Data Types/IPTPort.cs
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
using System;
|
||||||
|
using UnityEditor.Experimental.GraphView;
|
||||||
|
using UnityEngine.UIElements;
|
||||||
|
|
||||||
|
namespace ImageProcessingGraph.Editor
|
||||||
|
{
|
||||||
|
public class IPTPort : Port
|
||||||
|
{
|
||||||
|
protected IPTPort(Orientation portOrientation, Direction portDirection, Capacity portCapacity, Type type) : base(portOrientation, portDirection, portCapacity, type)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IPTPort Create(IEdgeConnectorListener connectorListener, bool isInput, Type type)
|
||||||
|
{
|
||||||
|
var port = new IPTPort(Orientation.Horizontal, isInput ? Direction.Input : Direction.Output,
|
||||||
|
Capacity.Multi, type)
|
||||||
|
{
|
||||||
|
m_EdgeConnector = new EdgeConnector<Edge>(connectorListener),
|
||||||
|
};
|
||||||
|
port.AddManipulator(port.m_EdgeConnector);
|
||||||
|
return port;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
3
Scripts/Editor/Data Types/IPTPort.cs.meta
Normal file
3
Scripts/Editor/Data Types/IPTPort.cs.meta
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 0dd88ad7d397423897de6832d315ee7f
|
||||||
|
timeCreated: 1745310679
|
18
Scripts/Editor/Data Types/IPT_Preferences.cs
Normal file
18
Scripts/Editor/Data Types/IPT_Preferences.cs
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
namespace ImageProcessingGraph.Editor
|
||||||
|
{
|
||||||
|
#if true
|
||||||
|
[CreateAssetMenu(menuName = "PreferenceCreate")]
|
||||||
|
#endif
|
||||||
|
public class IPT_Preferences : ScriptableObject
|
||||||
|
{
|
||||||
|
[Header("Grid Settings")]
|
||||||
|
public float thickLines;
|
||||||
|
public float spacing;
|
||||||
|
public Color gridBackgroundColour;
|
||||||
|
public Color lineColour;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
2
Scripts/Editor/Data Types/IPT_Preferences.cs.meta
Normal file
2
Scripts/Editor/Data Types/IPT_Preferences.cs.meta
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 80dcc02594d68e3439df7dc743c9d4b2
|
65
Scripts/Editor/Data Types/ImageData.cs
Normal file
65
Scripts/Editor/Data Types/ImageData.cs
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
using Unity.Collections;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// A structure that holds image pixel data and its dimensions.
|
||||||
|
/// </summary>
|
||||||
|
public struct ImageData
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// The pixel data of the image in Color32 format.
|
||||||
|
/// </summary>
|
||||||
|
public NativeArray<Color32> PixelData;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The width and height of the image (width, height).
|
||||||
|
/// </summary>
|
||||||
|
public (int width, int height) Dimensions;
|
||||||
|
|
||||||
|
public bool isRGBA;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Initializes a new instance of the <see cref="ImageData"/> struct using existing pixel data and dimensions.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="imageData">The pixel data as a NativeArray of Color32.</param>
|
||||||
|
/// <param name="widthHeight">A tuple containing the width and height of the image.</param>
|
||||||
|
public ImageData(NativeArray<Color32> imageData, (int width, int height) widthHeight, bool isRgba)
|
||||||
|
{
|
||||||
|
PixelData = imageData;
|
||||||
|
Dimensions = widthHeight;
|
||||||
|
isRGBA = isRgba;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Initializes a new instance of the <see cref="ImageData"/> struct from a Texture2D object.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="sourceTexture">The source texture to extract pixel data from.</param>
|
||||||
|
public ImageData(Texture2D sourceTexture)
|
||||||
|
{
|
||||||
|
PixelData = sourceTexture.GetPixelData<Color32>(0);
|
||||||
|
Dimensions = (sourceTexture.width, sourceTexture.height);
|
||||||
|
isRGBA = sourceTexture.format == TextureFormat.RGBA32;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the width of the image.
|
||||||
|
/// </summary>
|
||||||
|
public int Width => Dimensions.width;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the height of the image.
|
||||||
|
/// </summary>
|
||||||
|
public int Height => Dimensions.height;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Converts the ImageData back into a new Texture2D.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>A Texture2D object created from the stored pixel data.</returns>
|
||||||
|
public Texture2D ToTexture2D()
|
||||||
|
{
|
||||||
|
var texture = new Texture2D(Width, Height, TextureFormat.RGBA32, false);
|
||||||
|
texture.LoadRawTextureData(PixelData);
|
||||||
|
texture.Apply();
|
||||||
|
return texture;
|
||||||
|
}
|
||||||
|
}
|
3
Scripts/Editor/Data Types/ImageData.cs.meta
Normal file
3
Scripts/Editor/Data Types/ImageData.cs.meta
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 2bb77fbc2c734e888e52e39ab92264a9
|
||||||
|
timeCreated: 1745264169
|
47
Scripts/Editor/Data Types/SplitChannelData.cs
Normal file
47
Scripts/Editor/Data Types/SplitChannelData.cs
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
|
||||||
|
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Represents a single image channel (e.g., Red, Green, Blue, Alpha) as a 1D byte array,
|
||||||
|
/// along with the original image dimensions.
|
||||||
|
/// </summary>
|
||||||
|
public struct SplitChannelData
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// The 8-bit intensity values for a single image channel, stored in row-major order.
|
||||||
|
/// </summary>
|
||||||
|
public byte[] ChannelData;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The width and height of the channel data (width, height).
|
||||||
|
/// </summary>
|
||||||
|
public (int width, int height) Dimensions;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Initializes a new instance of the <see cref="SplitChannelData"/> struct
|
||||||
|
/// using channel data and dimensions.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="channelData">The byte array representing the single channel values.</param>
|
||||||
|
/// <param name="widthHeight">A tuple of (width, height) representing the dimensions.</param>
|
||||||
|
public SplitChannelData(byte[] channelData, (int width, int height) widthHeight)
|
||||||
|
{
|
||||||
|
ChannelData = channelData;
|
||||||
|
Dimensions = widthHeight;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the width of the channel data.
|
||||||
|
/// </summary>
|
||||||
|
public int Width => Dimensions.width;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the height of the channel data.
|
||||||
|
/// </summary>
|
||||||
|
public int Height => Dimensions.height;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Checks whether the channel data is valid (non-null and matches the expected size).
|
||||||
|
/// </summary>
|
||||||
|
public bool IsValid => ChannelData != null && ChannelData.Length == Width * Height;
|
||||||
|
}
|
3
Scripts/Editor/Data Types/SplitChannelData.cs.meta
Normal file
3
Scripts/Editor/Data Types/SplitChannelData.cs.meta
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: c36c5c00054e46b191b4d21913512433
|
||||||
|
timeCreated: 1745278300
|
18
Scripts/Editor/ImageProcessingGraph.asmdef
Normal file
18
Scripts/Editor/ImageProcessingGraph.asmdef
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
{
|
||||||
|
"name": "ImageProcessingGraphEditor",
|
||||||
|
"rootNamespace": "ImageProcessingGraph.Editor",
|
||||||
|
"references": [
|
||||||
|
"GUID:2665a8d13d1b3f18800f46e256720795"
|
||||||
|
],
|
||||||
|
"includePlatforms": [
|
||||||
|
"Editor"
|
||||||
|
],
|
||||||
|
"excludePlatforms": [],
|
||||||
|
"allowUnsafeCode": false,
|
||||||
|
"overrideReferences": false,
|
||||||
|
"precompiledReferences": [],
|
||||||
|
"autoReferenced": true,
|
||||||
|
"defineConstraints": [],
|
||||||
|
"versionDefines": [],
|
||||||
|
"noEngineReferences": false
|
||||||
|
}
|
7
Scripts/Editor/ImageProcessingGraph.asmdef.meta
Normal file
7
Scripts/Editor/ImageProcessingGraph.asmdef.meta
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 3f5213b0645cf234f941e3b3d706a65a
|
||||||
|
AssemblyDefinitionImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
150
Scripts/Editor/ImageProcessingGraphAsset.cs
Normal file
150
Scripts/Editor/ImageProcessingGraphAsset.cs
Normal file
@ -0,0 +1,150 @@
|
|||||||
|
using ImageProcessingGraph.Editor.Windows;
|
||||||
|
using UnityEngine;
|
||||||
|
using UnityEditor;
|
||||||
|
using UnityEditor.Callbacks;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Diagnostics;
|
||||||
|
using System.Linq;
|
||||||
|
using UnityEditor.Experimental.GraphView;
|
||||||
|
using Debug = UnityEngine.Debug;
|
||||||
|
|
||||||
|
// ReSharper disable once CheckNamespace
|
||||||
|
namespace ImageProcessingGraph.Editor
|
||||||
|
{
|
||||||
|
[CreateAssetMenu(menuName = "Image Processing Graph/New Graph")]
|
||||||
|
public class ImageProcessingGraphAsset : ScriptableObject
|
||||||
|
{
|
||||||
|
[SerializeReference] private List<BaseImageNode> nodes;
|
||||||
|
[SerializeField] private List<GraphConnection> connections;
|
||||||
|
[SerializeField] public List<BaseImageNode> runOrder;
|
||||||
|
[SerializeField] public List<StickyNote> stickyNotes;
|
||||||
|
|
||||||
|
public List<BaseImageNode> Nodes => nodes;
|
||||||
|
public List<GraphConnection> Connections => connections;
|
||||||
|
public ImageProcessingGraphAsset()
|
||||||
|
{
|
||||||
|
nodes = new List<BaseImageNode>();
|
||||||
|
connections = new List<GraphConnection>();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
[OnOpenAsset(1)]
|
||||||
|
public static bool OpenGraphAsset(int instanceID, int line)
|
||||||
|
{
|
||||||
|
var asset = EditorUtility.InstanceIDToObject(instanceID) as ImageProcessingGraphAsset;
|
||||||
|
if (asset != null)
|
||||||
|
{
|
||||||
|
ImageProcessingGraphEditorWindow.Open(asset);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void RunGraph()
|
||||||
|
{
|
||||||
|
// Create and start the stopwatch to measure time
|
||||||
|
Stopwatch stopwatch = new Stopwatch();
|
||||||
|
stopwatch.Start();
|
||||||
|
|
||||||
|
if (runOrder == null)
|
||||||
|
runOrder = GetExecutionOrder(this.nodes, this.connections);
|
||||||
|
|
||||||
|
foreach (var VARIABLE in runOrder)
|
||||||
|
{
|
||||||
|
VARIABLE.RunNode();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Stop the stopwatch after running the nodes
|
||||||
|
stopwatch.Stop();
|
||||||
|
|
||||||
|
// Log the elapsed time
|
||||||
|
UnityEngine.Debug.Log($"Graph execution took {stopwatch.ElapsedMilliseconds} milliseconds.");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Computes a topological execution order of nodes based on their dependencies.
|
||||||
|
/// Throws if a cycle is detected or nodes are missing from the input list.
|
||||||
|
/// </summary>
|
||||||
|
public List<BaseImageNode> GetExecutionOrder(List<BaseImageNode> nodes, List<GraphConnection> connections, bool debug = false)
|
||||||
|
{
|
||||||
|
// === Initialization ===
|
||||||
|
var nodeMap = new Dictionary<string, BaseImageNode>(nodes.Count);
|
||||||
|
var adjList = new Dictionary<string, List<string>>(nodes.Count);
|
||||||
|
var inDegree = new Dictionary<string, int>(nodes.Count);
|
||||||
|
|
||||||
|
foreach (var node in nodes)
|
||||||
|
{
|
||||||
|
string id = node.ID;
|
||||||
|
nodeMap[id] = node;
|
||||||
|
adjList[id] = new List<string>();
|
||||||
|
inDegree[id] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// === Build Graph ===
|
||||||
|
foreach (var conn in connections)
|
||||||
|
{
|
||||||
|
string from = conn.outputPort.nodeID;
|
||||||
|
string to = conn.inputPort.nodeID;
|
||||||
|
|
||||||
|
if (!nodeMap.ContainsKey(from) || !nodeMap.ContainsKey(to))
|
||||||
|
throw new System.Exception($"Invalid connection: '{from}' → '{to}' (One or both node IDs not found)");
|
||||||
|
|
||||||
|
adjList[from].Add(to);
|
||||||
|
inDegree[to]++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (debug)
|
||||||
|
{
|
||||||
|
Debug.Log("=== Dependency Graph ===");
|
||||||
|
foreach (var from in adjList.Keys)
|
||||||
|
{
|
||||||
|
var outputs = string.Join(", ", adjList[from].Select(t => $"{nodeMap[t].typeName} ({t})"));
|
||||||
|
Debug.Log($"[{nodeMap[from].typeName}] ({from}) → [{outputs}]");
|
||||||
|
}
|
||||||
|
Debug.Log("=========================");
|
||||||
|
}
|
||||||
|
|
||||||
|
// === Topological Sort (Kahn's Algorithm) ===
|
||||||
|
var executionOrder = new List<BaseImageNode>(nodes.Count);
|
||||||
|
var queue = new Queue<string>(nodes.Count);
|
||||||
|
|
||||||
|
foreach (var kvp in inDegree)
|
||||||
|
{
|
||||||
|
if (kvp.Value == 0)
|
||||||
|
queue.Enqueue(kvp.Key);
|
||||||
|
}
|
||||||
|
|
||||||
|
while (queue.Count > 0)
|
||||||
|
{
|
||||||
|
string currentID = queue.Dequeue();
|
||||||
|
executionOrder.Add(nodeMap[currentID]);
|
||||||
|
|
||||||
|
foreach (var neighbor in adjList[currentID])
|
||||||
|
{
|
||||||
|
inDegree[neighbor]--;
|
||||||
|
if (inDegree[neighbor] == 0)
|
||||||
|
queue.Enqueue(neighbor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (executionOrder.Count != nodes.Count)
|
||||||
|
{
|
||||||
|
var remaining = string.Join(", ", inDegree.Where(p => p.Value > 0).Select(p => $"{nodeMap[p.Key].typeName} ({p.Key})"));
|
||||||
|
throw new System.Exception($"Cycle detected in graph. Remaining nodes: {remaining}");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (debug)
|
||||||
|
{
|
||||||
|
Debug.Log("=== Execution Order ===");
|
||||||
|
foreach (var n in executionOrder)
|
||||||
|
Debug.Log($"→ {n.typeName} ({n.ID})");
|
||||||
|
}
|
||||||
|
|
||||||
|
return executionOrder;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
11
Scripts/Editor/ImageProcessingGraphAsset.cs.meta
Normal file
11
Scripts/Editor/ImageProcessingGraphAsset.cs.meta
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 1da462fd3f736d04e80556b4ac8b470f
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {fileID: 2800000, guid: 91cfc70686fca0145b2b37b8b1db5dff, type: 3}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
8
Scripts/Editor/Nodes.meta
Normal file
8
Scripts/Editor/Nodes.meta
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 8726affebc717064db4f447f8569089d
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
8
Scripts/Editor/Nodes/Base Node.meta
Normal file
8
Scripts/Editor/Nodes/Base Node.meta
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: b0d7dde0b49a3224f9876502af464973
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
117
Scripts/Editor/Nodes/Base Node/BaseImageNode.cs
Normal file
117
Scripts/Editor/Nodes/Base Node/BaseImageNode.cs
Normal file
@ -0,0 +1,117 @@
|
|||||||
|
using System;
|
||||||
|
using System.Configuration;
|
||||||
|
using UnityEditor.Experimental.GraphView;
|
||||||
|
using UnityEngine;
|
||||||
|
using ImageProcessingGraph.Editor.Nodes.NodeAttributes;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using Input = ImageProcessingGraph.Editor.Nodes.NodeAttributes.Input;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Reflection;
|
||||||
|
|
||||||
|
namespace ImageProcessingGraph.Editor
|
||||||
|
{
|
||||||
|
[System.Serializable]
|
||||||
|
public abstract class BaseImageNode
|
||||||
|
{
|
||||||
|
[SerializeField] private string guid;
|
||||||
|
|
||||||
|
[SerializeField] private Rect position;
|
||||||
|
|
||||||
|
[SerializeField] public string typeName;
|
||||||
|
|
||||||
|
[SerializeField] public (int, int) widthHeight;
|
||||||
|
|
||||||
|
public string ID => guid;
|
||||||
|
public Rect Position => position;
|
||||||
|
|
||||||
|
public ImageProcessingGraphAsset asset;
|
||||||
|
|
||||||
|
public BaseImageNode()
|
||||||
|
{
|
||||||
|
guid = Guid.NewGuid().ToString();
|
||||||
|
|
||||||
|
/*Type t = this.GetType();
|
||||||
|
Debug.Log(t.Name);*/
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetNodeInputs()
|
||||||
|
{
|
||||||
|
Type type = this.GetType();
|
||||||
|
string t = type.Name;
|
||||||
|
FieldInfo[] properties = type.GetFields();
|
||||||
|
|
||||||
|
var inputProperties = properties
|
||||||
|
.Where(p => p.IsDefined(typeof(Input), false)).ToList();
|
||||||
|
|
||||||
|
foreach (var inputProperty in inputProperties)
|
||||||
|
{
|
||||||
|
// Find the connection that leads to this input property
|
||||||
|
GraphConnection connection = default;
|
||||||
|
|
||||||
|
foreach (var conn in asset.Connections)
|
||||||
|
{
|
||||||
|
if (conn.inputPort.nodeID == this.ID)
|
||||||
|
{
|
||||||
|
if (conn.inputPort.portID == inputProperties.IndexOf(inputProperty))
|
||||||
|
{
|
||||||
|
connection = conn;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (connection.Equals((default(GraphConnection))))
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Get the output node from the connection
|
||||||
|
var outputNode = asset.Nodes.FirstOrDefault(n => n.ID == connection.outputPort.nodeID);
|
||||||
|
|
||||||
|
if (outputNode != null)
|
||||||
|
{
|
||||||
|
// Use reflection to get the output data from the output node's corresponding output property
|
||||||
|
Type outputType = outputNode.GetType();
|
||||||
|
FieldInfo[] fields = outputType.GetFields();
|
||||||
|
|
||||||
|
var outputFields = fields
|
||||||
|
.Where(p => p.IsDefined(typeof(Output), false)).ToList();
|
||||||
|
|
||||||
|
FieldInfo outputProperty = null;
|
||||||
|
|
||||||
|
foreach (var da in outputFields)
|
||||||
|
{
|
||||||
|
if (outputFields.IndexOf(da) == connection.outputPort.portID)
|
||||||
|
{
|
||||||
|
outputProperty = da;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*var outputProperty = outputNode.GetType().GetProperties()
|
||||||
|
.FirstOrDefault(p => p.IsDefined(typeof(Output), false) &&
|
||||||
|
outputFields == connection.outputPort.portID);*/
|
||||||
|
|
||||||
|
if (outputProperty != null)
|
||||||
|
{
|
||||||
|
// Assign the output data to the input property
|
||||||
|
var outputData = outputProperty.GetValue(outputNode);
|
||||||
|
inputProperty.SetValue(this, outputData);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void RunNode()
|
||||||
|
{
|
||||||
|
SetNodeInputs();
|
||||||
|
this.Process();
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual void Process()
|
||||||
|
{
|
||||||
|
Debug.Log("Uppies");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetPosition(Rect position) => this.position = position;
|
||||||
|
}
|
||||||
|
}
|
2
Scripts/Editor/Nodes/Base Node/BaseImageNode.cs.meta
Normal file
2
Scripts/Editor/Nodes/Base Node/BaseImageNode.cs.meta
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 16aeb4367cd62fa4f8a0f72ee6eaa03b
|
13
Scripts/Editor/Nodes/Base Node/ExposedPropertyPort.cs
Normal file
13
Scripts/Editor/Nodes/Base Node/ExposedPropertyPort.cs
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
using System;
|
||||||
|
using UnityEditor.Experimental.GraphView;
|
||||||
|
|
||||||
|
namespace ImageProcessingGraph.Editor
|
||||||
|
{
|
||||||
|
public class ExposedPropertyPort : Port
|
||||||
|
{
|
||||||
|
protected ExposedPropertyPort(Orientation portOrientation, Direction portDirection, Capacity portCapacity, Type type) : base(portOrientation, portDirection, portCapacity, type)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,3 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 31313dec455d4407bb6fffc7b167dabb
|
||||||
|
timeCreated: 1743744035
|
36
Scripts/Editor/Nodes/Base Node/PortConnection.cs
Normal file
36
Scripts/Editor/Nodes/Base Node/PortConnection.cs
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
namespace ImageProcessingGraph.Editor
|
||||||
|
{
|
||||||
|
[System.Serializable]
|
||||||
|
public struct GraphConnection
|
||||||
|
{
|
||||||
|
public GraphPort inputPort;
|
||||||
|
public GraphPort outputPort;
|
||||||
|
|
||||||
|
public GraphConnection(GraphPort inputPort, GraphPort outputPort)
|
||||||
|
{
|
||||||
|
this.inputPort = inputPort;
|
||||||
|
this.outputPort = outputPort;
|
||||||
|
}
|
||||||
|
|
||||||
|
public GraphConnection(string inputNodeGuid, int inputPortID, string inputNodeType, string outputNodeGuid, int outputPortID, string outputNodeType)
|
||||||
|
{
|
||||||
|
this.inputPort = new GraphPort(inputNodeGuid, inputPortID, inputNodeType);
|
||||||
|
this.outputPort = new GraphPort(outputNodeGuid, outputPortID, outputNodeType);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[System.Serializable]
|
||||||
|
public struct GraphPort
|
||||||
|
{
|
||||||
|
public string nodeID;
|
||||||
|
public string nodeType;
|
||||||
|
public int portID;
|
||||||
|
|
||||||
|
public GraphPort(string nodeID, int portID, string nodeType)
|
||||||
|
{
|
||||||
|
this.nodeID = nodeID;
|
||||||
|
this.portID = portID;
|
||||||
|
this.nodeType = nodeType;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
3
Scripts/Editor/Nodes/Base Node/PortConnection.cs.meta
Normal file
3
Scripts/Editor/Nodes/Base Node/PortConnection.cs.meta
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 10b473e8e8494d6eb4c4f34a4b41d4bd
|
||||||
|
timeCreated: 1743739124
|
3
Scripts/Editor/Nodes/Fun Nodes.meta
Normal file
3
Scripts/Editor/Nodes/Fun Nodes.meta
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: ca37b9337d41484892c89933479f1e7f
|
||||||
|
timeCreated: 1743745541
|
3
Scripts/Editor/Nodes/Fun Nodes/Texture.meta
Normal file
3
Scripts/Editor/Nodes/Fun Nodes/Texture.meta
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 1646a2bcaf6b4de488cadad1d7cdf795
|
||||||
|
timeCreated: 1743747481
|
75
Scripts/Editor/Nodes/Fun Nodes/Texture/RGBACombine.cs
Normal file
75
Scripts/Editor/Nodes/Fun Nodes/Texture/RGBACombine.cs
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
using ImageProcessingGraph.Editor.Nodes.NodeAttributes;
|
||||||
|
using Unity.Collections;
|
||||||
|
using Unity.Jobs;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
namespace ImageProcessingGraph.Editor.Nodes.Fun_Nodes.Texture
|
||||||
|
{
|
||||||
|
[NodeInfo("RGBA Combine", "Channels/RGBA Combine", true)]
|
||||||
|
public class RGBASCombine : BaseImageNode
|
||||||
|
{
|
||||||
|
[NodeAttributes.Input("R")]
|
||||||
|
public SplitChannelData r;
|
||||||
|
|
||||||
|
[NodeAttributes.Input("G")]
|
||||||
|
public SplitChannelData g;
|
||||||
|
|
||||||
|
[NodeAttributes.Input("B")]
|
||||||
|
public SplitChannelData b;
|
||||||
|
|
||||||
|
[NodeAttributes.Input("A")]
|
||||||
|
public SplitChannelData a;
|
||||||
|
|
||||||
|
[NodeAttributes.Output("")]
|
||||||
|
public ImageData inputTexture;
|
||||||
|
|
||||||
|
// Job struct for combining RGBA channels
|
||||||
|
struct RGBACombineJob : IJob
|
||||||
|
{
|
||||||
|
public NativeArray<byte> rData;
|
||||||
|
public NativeArray<byte> gData;
|
||||||
|
public NativeArray<byte> bData;
|
||||||
|
public NativeArray<byte> aData;
|
||||||
|
public NativeArray<Color32> outputData;
|
||||||
|
public int length;
|
||||||
|
|
||||||
|
// Execute method to combine the RGBA channels into a Color32 array
|
||||||
|
public void Execute()
|
||||||
|
{
|
||||||
|
for (int i = 0; i < length; i++)
|
||||||
|
{
|
||||||
|
outputData[i] = new Color32(rData[i], gData[i], bData[i], aData[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Process()
|
||||||
|
{
|
||||||
|
int length = r.ChannelData.Length;
|
||||||
|
|
||||||
|
// Allocate NativeArrays for the RGBA channels and the output pixel data
|
||||||
|
NativeArray<byte> rChannel = new NativeArray<byte>(r.ChannelData, Allocator.Persistent);
|
||||||
|
NativeArray<byte> gChannel = new NativeArray<byte>(g.ChannelData, Allocator.Persistent);
|
||||||
|
NativeArray<byte> bChannel = new NativeArray<byte>(b.ChannelData, Allocator.Persistent);
|
||||||
|
NativeArray<byte> aChannel = new NativeArray<byte>(a.ChannelData, Allocator.Persistent);
|
||||||
|
|
||||||
|
NativeArray<Color32> outputPixels = new NativeArray<Color32>(length, Allocator.Persistent);
|
||||||
|
|
||||||
|
// Create the job to combine RGBA channels
|
||||||
|
RGBACombineJob combineJob = new RGBACombineJob
|
||||||
|
{
|
||||||
|
rData = rChannel,
|
||||||
|
gData = gChannel,
|
||||||
|
bData = bChannel,
|
||||||
|
aData = aChannel,
|
||||||
|
outputData = outputPixels,
|
||||||
|
length = length
|
||||||
|
};
|
||||||
|
|
||||||
|
combineJob.Run();
|
||||||
|
|
||||||
|
// Create the ImageData object with the combined pixel data
|
||||||
|
inputTexture = new ImageData(outputPixels, (r.Width, r.Height), false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,3 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 3fa83fcfe5464559975d25d6d55cb799
|
||||||
|
timeCreated: 1743750468
|
78
Scripts/Editor/Nodes/Fun Nodes/Texture/RGBASplit.cs
Normal file
78
Scripts/Editor/Nodes/Fun Nodes/Texture/RGBASplit.cs
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
using ImageProcessingGraph.Editor.Nodes.NodeAttributes;
|
||||||
|
using Unity.Collections;
|
||||||
|
using Unity.Jobs;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
namespace ImageProcessingGraph.Editor.Nodes.Fun_Nodes.Texture
|
||||||
|
{
|
||||||
|
[NodeInfoAttribute("RGBA Split", "Channels/RGBA Split", true)]
|
||||||
|
public class RGBASplit : BaseImageNode
|
||||||
|
{
|
||||||
|
[NodeAttributes.Input("")]
|
||||||
|
public ImageData inputTexture;
|
||||||
|
|
||||||
|
[NodeAttributes.Output("R")]
|
||||||
|
public SplitChannelData r;
|
||||||
|
[NodeAttributes.Output("G")]
|
||||||
|
public SplitChannelData g;
|
||||||
|
[NodeAttributes.Output("B")]
|
||||||
|
public SplitChannelData b;
|
||||||
|
[NodeAttributes.Output("A")]
|
||||||
|
public SplitChannelData a;
|
||||||
|
|
||||||
|
public override void Process()
|
||||||
|
{
|
||||||
|
int length = inputTexture.PixelData.Length;
|
||||||
|
|
||||||
|
// Allocate NativeArrays for the pixel data and the individual RGBA channels
|
||||||
|
NativeArray<Color32> pixelData = new NativeArray<Color32>(inputTexture.PixelData, Allocator.Persistent);
|
||||||
|
NativeArray<byte> rChannel = new NativeArray<byte>(length, Allocator.Persistent);
|
||||||
|
NativeArray<byte> gChannel = new NativeArray<byte>(length, Allocator.Persistent);
|
||||||
|
NativeArray<byte> bChannel = new NativeArray<byte>(length, Allocator.Persistent);
|
||||||
|
NativeArray<byte> aChannel = new NativeArray<byte>(length, Allocator.Persistent);
|
||||||
|
|
||||||
|
// Create the job and set up the input/output data
|
||||||
|
RGBAJob rgbaJob = new RGBAJob
|
||||||
|
{
|
||||||
|
pixelData = pixelData,
|
||||||
|
rData = rChannel,
|
||||||
|
gData = gChannel,
|
||||||
|
bData = bChannel,
|
||||||
|
aData = aChannel,
|
||||||
|
length = length
|
||||||
|
};
|
||||||
|
|
||||||
|
rgbaJob.Run();
|
||||||
|
|
||||||
|
// Store the results in the SplitChannelData objects
|
||||||
|
r = new SplitChannelData(rChannel.ToArray(), (inputTexture.Width, inputTexture.Height));
|
||||||
|
g = new SplitChannelData(gChannel.ToArray(), (inputTexture.Width, inputTexture.Height));
|
||||||
|
b = new SplitChannelData(bChannel.ToArray(), (inputTexture.Width, inputTexture.Height));
|
||||||
|
a = new SplitChannelData(aChannel.ToArray(), (inputTexture.Width, inputTexture.Height));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Job struct for processing the image data
|
||||||
|
struct RGBAJob : IJob
|
||||||
|
{
|
||||||
|
public NativeArray<Color32> pixelData;
|
||||||
|
public NativeArray<byte> rData;
|
||||||
|
public NativeArray<byte> gData;
|
||||||
|
public NativeArray<byte> bData;
|
||||||
|
public NativeArray<byte> aData;
|
||||||
|
public int length;
|
||||||
|
|
||||||
|
// Execute method that splits the RGBA channels
|
||||||
|
public void Execute()
|
||||||
|
{
|
||||||
|
for (int i = 0; i < length; i++)
|
||||||
|
{
|
||||||
|
Color32 pixel = pixelData[i];
|
||||||
|
rData[i] = pixel.r;
|
||||||
|
gData[i] = pixel.g;
|
||||||
|
bData[i] = pixel.b;
|
||||||
|
aData[i] = pixel.a;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
3
Scripts/Editor/Nodes/Fun Nodes/Texture/RGBASplit.cs.meta
Normal file
3
Scripts/Editor/Nodes/Fun Nodes/Texture/RGBASplit.cs.meta
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: c185fc298d59474cb453bf54b4f0aea8
|
||||||
|
timeCreated: 1743747489
|
@ -0,0 +1,53 @@
|
|||||||
|
using ImageProcessingGraph.Editor.Nodes.NodeAttributes;
|
||||||
|
using Unity.Burst;
|
||||||
|
using Unity.Collections;
|
||||||
|
using Unity.Jobs;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
namespace ImageProcessingGraph.Editor.Nodes.Fun_Nodes.Texture
|
||||||
|
{
|
||||||
|
[NodeInfoAttribute("Desaturate", "Adjustments/Desaturate", true)]
|
||||||
|
public class Texture2DDesaturate : BaseImageNode
|
||||||
|
{
|
||||||
|
[NodeAttributes.Input("")]
|
||||||
|
public ImageData inputTexture; // Changed to ImageData
|
||||||
|
|
||||||
|
[NodeAttributes.Output("")]
|
||||||
|
public ImageData outputTexture; // Changed to ImageData
|
||||||
|
|
||||||
|
public override void Process()
|
||||||
|
{
|
||||||
|
NativeArray<Color32> output = new NativeArray<Color32>(inputTexture.PixelData.Length, Allocator.Persistent);
|
||||||
|
|
||||||
|
DesaturateJob job = new DesaturateJob
|
||||||
|
{
|
||||||
|
pixels = inputTexture.PixelData,
|
||||||
|
outputPixels = output
|
||||||
|
};
|
||||||
|
|
||||||
|
job.Run();
|
||||||
|
|
||||||
|
outputTexture = new ImageData(output, (inputTexture.Width, inputTexture.Height), inputTexture.isRGBA);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public struct DesaturateJob : IJob
|
||||||
|
{
|
||||||
|
[ReadOnly] public NativeArray<Color32> pixels;
|
||||||
|
public NativeArray<Color32> outputPixels;
|
||||||
|
|
||||||
|
public void Execute()
|
||||||
|
{
|
||||||
|
for (int i = 0; i < pixels.Length; i++)
|
||||||
|
{
|
||||||
|
Color32 pixel = pixels[i];
|
||||||
|
|
||||||
|
byte grayValue = (byte)(0.2989f * pixel.r + 0.5870f * pixel.g + 0.1140f * pixel.b);
|
||||||
|
|
||||||
|
outputPixels[i] = new Color32(grayValue, grayValue, grayValue, pixel.a);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,3 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: a3e2d8c461684005a1286dcbc985dbbf
|
||||||
|
timeCreated: 1745291300
|
59
Scripts/Editor/Nodes/Fun Nodes/Texture/Texture2DInvert.cs
Normal file
59
Scripts/Editor/Nodes/Fun Nodes/Texture/Texture2DInvert.cs
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
using ImageProcessingGraph.Editor.Nodes.NodeAttributes;
|
||||||
|
using Unity.Burst;
|
||||||
|
using Unity.Collections;
|
||||||
|
using Unity.Jobs;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
namespace ImageProcessingGraph.Editor.Nodes.Fun_Nodes.Texture
|
||||||
|
{
|
||||||
|
[NodeInfoAttribute("Invert", "Adjustments/Invert", true)]
|
||||||
|
public class Texture2DInvert : BaseImageNode
|
||||||
|
{
|
||||||
|
[NodeAttributes.Input("")]
|
||||||
|
public ImageData inputTexture; // Changed to ImageData
|
||||||
|
|
||||||
|
[NodeAttributes.Output("")]
|
||||||
|
public ImageData outputTexture; // Changed to ImageData
|
||||||
|
|
||||||
|
public override void Process()
|
||||||
|
{
|
||||||
|
// Create an empty NativeArray for the output
|
||||||
|
NativeArray<Color32> output = new NativeArray<Color32>(inputTexture.PixelData.Length, Allocator.Persistent);
|
||||||
|
|
||||||
|
// Create and run the InvertJob
|
||||||
|
InvertJob job = new InvertJob
|
||||||
|
{
|
||||||
|
pixels = inputTexture.PixelData,
|
||||||
|
outputPixels = output
|
||||||
|
};
|
||||||
|
|
||||||
|
job.Run();
|
||||||
|
|
||||||
|
// Store the result in the outputImage as an ImageData instance
|
||||||
|
outputTexture = new ImageData(output, (inputTexture.Width, inputTexture.Height), inputTexture.isRGBA);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[BurstCompile]
|
||||||
|
public struct InvertJob : IJob
|
||||||
|
{
|
||||||
|
[ReadOnly] public NativeArray<Color32> pixels; // Input pixels
|
||||||
|
[WriteOnly] public NativeArray<Color32> outputPixels; // Output pixels
|
||||||
|
|
||||||
|
public void Execute()
|
||||||
|
{
|
||||||
|
int length = pixels.Length;
|
||||||
|
|
||||||
|
// Invert each pixel color
|
||||||
|
for (int i = 0; i < length; i++)
|
||||||
|
{
|
||||||
|
Color32 pixel = pixels[i];
|
||||||
|
outputPixels[i] = new Color32(
|
||||||
|
(byte)(255 - pixel.r),
|
||||||
|
(byte)(255 - pixel.g),
|
||||||
|
(byte)(255 - pixel.b),
|
||||||
|
pixel.a);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,3 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: d95b796b51a64fac8947aa4325b0373d
|
||||||
|
timeCreated: 1743747802
|
8
Scripts/Editor/Nodes/Import Nodes.meta
Normal file
8
Scripts/Editor/Nodes/Import Nodes.meta
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: e0ffc7091a5ca0244a56716dc57b6c86
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
8
Scripts/Editor/Nodes/Import Nodes/Base.meta
Normal file
8
Scripts/Editor/Nodes/Import Nodes/Base.meta
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 22b0f0e553dc85e489979a232505a332
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
34
Scripts/Editor/Nodes/Import Nodes/Texture2DImport.cs
Normal file
34
Scripts/Editor/Nodes/Import Nodes/Texture2DImport.cs
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
using System.IO;
|
||||||
|
using ImageProcessingGraph.Editor.Nodes.NodeAttributes;
|
||||||
|
using Unity.Collections;
|
||||||
|
using UnityEditor;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
namespace ImageProcessingGraph.Editor.Nodes.Import_Nodes
|
||||||
|
{
|
||||||
|
[NodeInfo("Texture Import", "Imports/Texture2D", true)]
|
||||||
|
public class Texture2DImport : BaseImageNode
|
||||||
|
{
|
||||||
|
[NodeAttributes.Input("")]
|
||||||
|
public Texture2D textureImport;
|
||||||
|
|
||||||
|
[NodeAttributes.Output("")]
|
||||||
|
public ImageData textureOutput;
|
||||||
|
[NodeAttributes.Output("File Name")]
|
||||||
|
public string fileName;
|
||||||
|
[NodeAttributes.Output("File Path")]
|
||||||
|
public string filePath;
|
||||||
|
|
||||||
|
public override void Process()
|
||||||
|
{
|
||||||
|
if (this.textureImport != null)
|
||||||
|
{
|
||||||
|
this.textureOutput = new ImageData(textureImport);
|
||||||
|
this.fileName = textureImport.name;
|
||||||
|
this.filePath = Path.GetDirectoryName(AssetDatabase.GetAssetPath(textureImport));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
Debug.LogError("UH!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,3 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 349192a0abdc4544888b8b537dea9c74
|
||||||
|
timeCreated: 1743745590
|
3
Scripts/Editor/Nodes/NodeAttributes.meta
Normal file
3
Scripts/Editor/Nodes/NodeAttributes.meta
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: dbd7cd37cae147f3a54f12c52ef54217
|
||||||
|
timeCreated: 1742158168
|
17
Scripts/Editor/Nodes/NodeAttributes/NewMonoBehaviour.cs
Normal file
17
Scripts/Editor/Nodes/NodeAttributes/NewMonoBehaviour.cs
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
using UnityEngine;
|
||||||
|
using System.Collections;
|
||||||
|
|
||||||
|
public class NewMonoBehaviour : MonoBehaviour
|
||||||
|
{
|
||||||
|
// Use this for initialization
|
||||||
|
void Start()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update is called once per frame
|
||||||
|
void Update()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,2 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 78c0de359ceae406cb2985637a2e6c97
|
45
Scripts/Editor/Nodes/NodeAttributes/NodeAttributes.cs
Normal file
45
Scripts/Editor/Nodes/NodeAttributes/NodeAttributes.cs
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
namespace ImageProcessingGraph.Editor.Nodes.NodeAttributes
|
||||||
|
{
|
||||||
|
[AttributeUsage(AttributeTargets.Class)]
|
||||||
|
public class NodeInfoAttribute : Attribute
|
||||||
|
{
|
||||||
|
private string name;
|
||||||
|
private string menuItem;
|
||||||
|
private string ussPath;
|
||||||
|
|
||||||
|
public string Title => name;
|
||||||
|
public string MenuItem => menuItem;
|
||||||
|
public string UssPath => ussPath;
|
||||||
|
|
||||||
|
public NodeInfoAttribute(string name, string menuItem = "", bool requiresImage = false, string ussPath = null)
|
||||||
|
{
|
||||||
|
this.name = name;
|
||||||
|
this.menuItem = menuItem;
|
||||||
|
this.ussPath = ussPath;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[AttributeUsage(AttributeTargets.Field)]
|
||||||
|
public class Input : Attribute
|
||||||
|
{
|
||||||
|
public string Label { get; }
|
||||||
|
|
||||||
|
public Input(string _label)
|
||||||
|
{
|
||||||
|
Label = _label;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[AttributeUsage(AttributeTargets.Field)]
|
||||||
|
public class Output : Attribute
|
||||||
|
{
|
||||||
|
public string Label { get; }
|
||||||
|
|
||||||
|
public Output(string _label)
|
||||||
|
{
|
||||||
|
Label = _label;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,3 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: a46f5cb221ec44348c340aeb91b54b6c
|
||||||
|
timeCreated: 1742158180
|
3
Scripts/Editor/Nodes/Output.meta
Normal file
3
Scripts/Editor/Nodes/Output.meta
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 80a64ea121f9494d931173b10cce68b3
|
||||||
|
timeCreated: 1743749784
|
20
Scripts/Editor/Nodes/Output/Texture2DOutput.cs
Normal file
20
Scripts/Editor/Nodes/Output/Texture2DOutput.cs
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
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");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
3
Scripts/Editor/Nodes/Output/Texture2DOutput.cs.meta
Normal file
3
Scripts/Editor/Nodes/Output/Texture2DOutput.cs.meta
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 10f83f7df222436c8495916067139b91
|
||||||
|
timeCreated: 1743750878
|
3
Scripts/Editor/Nodes/String Nodes.meta
Normal file
3
Scripts/Editor/Nodes/String Nodes.meta
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 587f3b2d6fad453fbf6664066f807f21
|
||||||
|
timeCreated: 1745299284
|
18
Scripts/Editor/Nodes/String Nodes/StringAppend.cs
Normal file
18
Scripts/Editor/Nodes/String Nodes/StringAppend.cs
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
using ImageProcessingGraph.Editor.Nodes.NodeAttributes;
|
||||||
|
|
||||||
|
namespace ImageProcessingGraph.Editor.Nodes.String_Nodes
|
||||||
|
{
|
||||||
|
[NodeInfo("String Append", "String/Append")]
|
||||||
|
public class StringAppend : BaseImageNode
|
||||||
|
{
|
||||||
|
[NodeAttributes.Input("String A")] public string baseString;
|
||||||
|
[NodeAttributes.Input("String B")] public string appendString;
|
||||||
|
|
||||||
|
[NodeAttributes.Output("Appended String")] public string output;
|
||||||
|
|
||||||
|
public override void Process()
|
||||||
|
{
|
||||||
|
this.output = baseString + appendString;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
3
Scripts/Editor/Nodes/String Nodes/StringAppend.cs.meta
Normal file
3
Scripts/Editor/Nodes/String Nodes/StringAppend.cs.meta
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 52ee2568ed5f4c5da8fb920672d1aa96
|
||||||
|
timeCreated: 1745299310
|
8
Scripts/Editor/Windows.meta
Normal file
8
Scripts/Editor/Windows.meta
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 1754e13556323a64ea0fe2a83fe4c82d
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
@ -0,0 +1,30 @@
|
|||||||
|
using UnityEditor;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
namespace ImageProcessingGraph.Editor.Windows
|
||||||
|
{
|
||||||
|
[CustomEditor(typeof(ImageProcessingGraphAsset))]
|
||||||
|
public class ImageProcessingGraphAssetEditorWindow : UnityEditor.Editor
|
||||||
|
{
|
||||||
|
public override void OnInspectorGUI()
|
||||||
|
{
|
||||||
|
if (GUILayout.Button("Open"))
|
||||||
|
{
|
||||||
|
ImageProcessingGraphEditorWindow.Open((ImageProcessingGraphAsset)target);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(GUILayout.Button("Calculate Dependancy Graph"))
|
||||||
|
{
|
||||||
|
var bleh = (ImageProcessingGraphAsset)target;
|
||||||
|
bleh.runOrder = bleh.GetExecutionOrder(bleh.Nodes, bleh.Connections, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(GUILayout.Button("Run Graph"))
|
||||||
|
{
|
||||||
|
var bleh = (ImageProcessingGraphAsset)target;
|
||||||
|
bleh.RunGraph();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,2 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 5341664b296612f4dbc6d242c853bd7d
|
@ -0,0 +1,67 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
using UnityEditor.Experimental.GraphView;
|
||||||
|
using UnityEngine;
|
||||||
|
using UnityEngine.UIElements;
|
||||||
|
|
||||||
|
namespace ImageProcessingGraph.Editor.Unity_Image_Processing.Scripts.Editor.Windows
|
||||||
|
{
|
||||||
|
|
||||||
|
public class ImageProcessingGraphEdgeConnectorListener : IEdgeConnectorListener
|
||||||
|
{
|
||||||
|
private GraphViewChange m_GraphViewChange;
|
||||||
|
private List<Edge> m_EdgesToCreate;
|
||||||
|
private List<GraphElement> m_EdgesToDelete;
|
||||||
|
|
||||||
|
private ImageProcessingGraphViewWindow window;
|
||||||
|
|
||||||
|
public ImageProcessingGraphEdgeConnectorListener(ImageProcessingGraphViewWindow window)
|
||||||
|
{
|
||||||
|
this.m_EdgesToCreate = new List<Edge>();
|
||||||
|
this.m_EdgesToDelete = new List<GraphElement>();
|
||||||
|
this.m_GraphViewChange.edgesToCreate = this.m_EdgesToCreate;
|
||||||
|
this.window = window;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnDropOutsidePort(Edge edge, Vector2 position)
|
||||||
|
{
|
||||||
|
window.searchProvider.target = (VisualElement)window.focusController.focusedElement;
|
||||||
|
SearchWindow.Open(new SearchWindowContext(position), window.searchProvider);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnDrop(UnityEditor.Experimental.GraphView.GraphView graphView, Edge edge)
|
||||||
|
{
|
||||||
|
this.m_EdgesToCreate.Clear();
|
||||||
|
this.m_EdgesToCreate.Add(edge);
|
||||||
|
this.m_EdgesToDelete.Clear();
|
||||||
|
if (edge.input.capacity == Port.Capacity.Single)
|
||||||
|
{
|
||||||
|
foreach (Edge connection in edge.input.connections)
|
||||||
|
{
|
||||||
|
if (connection != edge)
|
||||||
|
this.m_EdgesToDelete.Add((GraphElement)connection);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (edge.output.capacity == Port.Capacity.Single)
|
||||||
|
{
|
||||||
|
foreach (Edge connection in edge.output.connections)
|
||||||
|
{
|
||||||
|
if (connection != edge)
|
||||||
|
this.m_EdgesToDelete.Add((GraphElement)connection);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.m_EdgesToDelete.Count > 0)
|
||||||
|
graphView.DeleteElements((IEnumerable<GraphElement>)this.m_EdgesToDelete);
|
||||||
|
List<Edge> edgesToCreate = this.m_EdgesToCreate;
|
||||||
|
if (graphView.graphViewChanged != null)
|
||||||
|
edgesToCreate = graphView.graphViewChanged(this.m_GraphViewChange).edgesToCreate;
|
||||||
|
foreach (Edge edge1 in edgesToCreate)
|
||||||
|
{
|
||||||
|
graphView.AddElement((GraphElement)edge1);
|
||||||
|
edge.input.Connect(edge1);
|
||||||
|
edge.output.Connect(edge1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,3 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: e55abc4baf7246aca9ebafb2c3aa793b
|
||||||
|
timeCreated: 1745309249
|
71
Scripts/Editor/Windows/ImageProcessingGraphEditorWindow.cs
Normal file
71
Scripts/Editor/Windows/ImageProcessingGraphEditorWindow.cs
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
using System;
|
||||||
|
using UnityEditor;
|
||||||
|
using UnityEditor.Experimental.GraphView;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
namespace ImageProcessingGraph.Editor.Windows
|
||||||
|
{
|
||||||
|
public class ImageProcessingGraphEditorWindow : EditorWindow
|
||||||
|
{
|
||||||
|
[SerializeField] private ImageProcessingGraphAsset currentGraph;
|
||||||
|
[SerializeField] private SerializedObject serializedObject;
|
||||||
|
[SerializeField] private ImageProcessingGraphViewWindow currentView;
|
||||||
|
public ImageProcessingGraphAsset CurrentGraph => currentGraph;
|
||||||
|
|
||||||
|
public static void Open(ImageProcessingGraphAsset asset)
|
||||||
|
{
|
||||||
|
ImageProcessingGraphEditorWindow[] windows = Resources.FindObjectsOfTypeAll<ImageProcessingGraphEditorWindow>();
|
||||||
|
|
||||||
|
foreach (var w in windows)
|
||||||
|
{
|
||||||
|
w.Focus();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ImageProcessingGraphEditorWindow window =
|
||||||
|
CreateWindow<ImageProcessingGraphEditorWindow>(typeof(ImageProcessingGraphEditorWindow),
|
||||||
|
typeof(SceneView));
|
||||||
|
|
||||||
|
window.titleContent = new GUIContent($"{asset.name}", EditorGUIUtility.ObjectContent(null, typeof(ImageProcessingGraphAsset)).image
|
||||||
|
);
|
||||||
|
window.Load(asset);
|
||||||
|
}
|
||||||
|
|
||||||
|
void OnEnable()
|
||||||
|
{
|
||||||
|
if(currentGraph != null)
|
||||||
|
DrawGraph();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnGUI()
|
||||||
|
{
|
||||||
|
if (currentGraph != null)
|
||||||
|
{
|
||||||
|
if(EditorUtility.IsDirty(currentGraph))
|
||||||
|
this.hasUnsavedChanges = true;
|
||||||
|
else
|
||||||
|
this.hasUnsavedChanges = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Load(ImageProcessingGraphAsset asset)
|
||||||
|
{
|
||||||
|
currentGraph = asset;
|
||||||
|
DrawGraph();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void DrawGraph()
|
||||||
|
{
|
||||||
|
serializedObject = new SerializedObject(currentGraph);
|
||||||
|
currentView = new ImageProcessingGraphViewWindow(serializedObject, this);
|
||||||
|
currentView.graphViewChanged += OnChange;
|
||||||
|
rootVisualElement.Add(currentView);
|
||||||
|
}
|
||||||
|
|
||||||
|
private GraphViewChange OnChange(GraphViewChange graphviewchange)
|
||||||
|
{
|
||||||
|
EditorUtility.SetDirty(currentGraph);
|
||||||
|
return graphviewchange;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,2 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 42279c09a8e81c844ab9651b6165a1e8
|
245
Scripts/Editor/Windows/ImageProcessingGraphNodeVisual.cs
Normal file
245
Scripts/Editor/Windows/ImageProcessingGraphNodeVisual.cs
Normal file
@ -0,0 +1,245 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Reflection;
|
||||||
|
using ImageProcessingGraph.Editor.Nodes.NodeAttributes;
|
||||||
|
using UnityEditor.Experimental.GraphView;
|
||||||
|
using UnityEditor.UIElements;
|
||||||
|
using UnityEngine;
|
||||||
|
using UnityEngine.UIElements;
|
||||||
|
using Input = ImageProcessingGraph.Editor.Nodes.NodeAttributes.Input;
|
||||||
|
|
||||||
|
namespace ImageProcessingGraph.Editor.Unity_Image_Processing.Scripts.Editor.Windows
|
||||||
|
{
|
||||||
|
public class ImageProcessingGraphNodeVisual : Node
|
||||||
|
{
|
||||||
|
private BaseImageNode graphNode;
|
||||||
|
public BaseImageNode GraphNode => graphNode;
|
||||||
|
|
||||||
|
public List<Port> InputPorts { get; }
|
||||||
|
public List<Port> OutputPorts { get; }
|
||||||
|
|
||||||
|
private ImageProcessingGraphViewWindow window;
|
||||||
|
|
||||||
|
public ImageProcessingGraphNodeVisual(BaseImageNode node, ImageProcessingGraphViewWindow window)
|
||||||
|
{
|
||||||
|
this.AddToClassList("image-node-visual");
|
||||||
|
this.window = window;
|
||||||
|
|
||||||
|
graphNode = node;
|
||||||
|
Type typeInfo = node.GetType();
|
||||||
|
|
||||||
|
NodeInfoAttribute info = typeInfo.GetCustomAttribute<NodeInfoAttribute>();
|
||||||
|
title = info.Title;
|
||||||
|
|
||||||
|
string[] depths = info.MenuItem.Split('/');
|
||||||
|
foreach (var depth in depths)
|
||||||
|
{
|
||||||
|
this.AddToClassList(depth.ToLower().Replace(' ', '-'));
|
||||||
|
}
|
||||||
|
|
||||||
|
this.InputPorts = new List<Port>();
|
||||||
|
this.OutputPorts = new List<Port>();
|
||||||
|
|
||||||
|
List<Input> inputs = new List<Input>();
|
||||||
|
List<FieldInfo> inputFieldInfo = new List<FieldInfo>();
|
||||||
|
List<FieldInfo> outputFieldInfo = new List<FieldInfo>();
|
||||||
|
|
||||||
|
FieldInfo[] fields = typeInfo.GetFields(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
|
||||||
|
foreach (var field in fields)
|
||||||
|
{
|
||||||
|
if (field.GetCustomAttribute(typeof(Input)) != null)
|
||||||
|
{
|
||||||
|
Input input = field.GetCustomAttribute<Input>();
|
||||||
|
inputs.Add(input);
|
||||||
|
inputFieldInfo.Add(field);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (field.GetCustomAttribute(typeof(Output)) != null)
|
||||||
|
{
|
||||||
|
Output output = field.GetCustomAttribute<Output>();
|
||||||
|
outputFieldInfo.Add(field);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
CreateInputPorts(inputFieldInfo);
|
||||||
|
CreateOutputPorts(outputFieldInfo);
|
||||||
|
|
||||||
|
this.name = typeInfo.Name;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CreateInputPorts(List<FieldInfo> fields)
|
||||||
|
{
|
||||||
|
for (var index = 0; index < fields.Count; index++)
|
||||||
|
{
|
||||||
|
var field = fields[index];
|
||||||
|
/*
|
||||||
|
Port port = InstantiatePort(Orientation.Horizontal, Direction.Input, Port.Capacity.Multi, field.FieldType);
|
||||||
|
*/
|
||||||
|
|
||||||
|
var port = IPTPort.Create(window.edgeConnectorListener, true, field.FieldType);
|
||||||
|
|
||||||
|
string label = field.GetCustomAttribute<Input>().Label;
|
||||||
|
if (label != "")
|
||||||
|
port.portName = label;
|
||||||
|
InputPorts.Add(port);
|
||||||
|
|
||||||
|
inputContainer.Add(port);
|
||||||
|
ExposeVariableToPort(port, field);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CreateOutputPorts(List<FieldInfo> fields)
|
||||||
|
{
|
||||||
|
for (var index = 0; index < fields.Count; index++)
|
||||||
|
{
|
||||||
|
var field = fields[index];
|
||||||
|
var port = IPTPort.Create(window.edgeConnectorListener, false, field.FieldType);
|
||||||
|
|
||||||
|
string label = field.GetCustomAttribute<Output>().Label;
|
||||||
|
if (label != "")
|
||||||
|
port.portName = label;
|
||||||
|
OutputPorts.Add(port);
|
||||||
|
|
||||||
|
outputContainer.Add(port);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Exposes a variable on the port for editing when it's not connected
|
||||||
|
private void ExposeVariableToPort(Port port, FieldInfo field)
|
||||||
|
{
|
||||||
|
// Only expose when the port is not connected
|
||||||
|
if (port.connections.Count() == 0)
|
||||||
|
{
|
||||||
|
var propertyFieldContainer = new VisualElement();
|
||||||
|
propertyFieldContainer.name = "property-field-container";
|
||||||
|
var propertyField = CreatePropertyFieldForType(field.FieldType, field.GetValue(graphNode));
|
||||||
|
|
||||||
|
if (propertyField != null)
|
||||||
|
{
|
||||||
|
// Register a callback for when the value changes
|
||||||
|
if (propertyField is IntegerField intField)
|
||||||
|
{
|
||||||
|
intField.RegisterValueChangedCallback(evt =>
|
||||||
|
{
|
||||||
|
field.SetValue(graphNode, evt.newValue); // Update the field with the new value
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else if (propertyField is FloatField floatField)
|
||||||
|
{
|
||||||
|
floatField.RegisterValueChangedCallback(evt =>
|
||||||
|
{
|
||||||
|
field.SetValue(graphNode, evt.newValue); // Update the field with the new value
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else if (propertyField is Toggle boolField)
|
||||||
|
{
|
||||||
|
boolField.RegisterValueChangedCallback(evt =>
|
||||||
|
{
|
||||||
|
field.SetValue(graphNode, evt.newValue); // Update the field with the new value
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else if (propertyField is TextField stringField)
|
||||||
|
{
|
||||||
|
stringField.RegisterValueChangedCallback(evt =>
|
||||||
|
{
|
||||||
|
field.SetValue(graphNode, evt.newValue); // Update the field with the new value
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else if (propertyField is ColorField colorField)
|
||||||
|
{
|
||||||
|
colorField.RegisterValueChangedCallback(evt =>
|
||||||
|
{
|
||||||
|
field.SetValue(graphNode, evt.newValue); // Update the field with the new value
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else if (propertyField is Vector3Field vector3Field)
|
||||||
|
{
|
||||||
|
vector3Field.RegisterValueChangedCallback(evt =>
|
||||||
|
{
|
||||||
|
field.SetValue(graphNode, evt.newValue); // Update the field with the new value
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else if (propertyField is Vector2Field vector2Field)
|
||||||
|
{
|
||||||
|
vector2Field.RegisterValueChangedCallback(evt =>
|
||||||
|
{
|
||||||
|
field.SetValue(graphNode, evt.newValue); // Update the field with the new value
|
||||||
|
});
|
||||||
|
}
|
||||||
|
else if (propertyField is ObjectField objectField)
|
||||||
|
{
|
||||||
|
objectField.RegisterValueChangedCallback(evt =>
|
||||||
|
{
|
||||||
|
field.SetValue(graphNode, evt.newValue); // Update the field with the new value
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
propertyFieldContainer.Add(propertyField);
|
||||||
|
port.Add(propertyFieldContainer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// If the port is connected, remove the exposed UI element
|
||||||
|
var existingPropertyFieldContainer = port.Q<VisualElement>("property-field-container");
|
||||||
|
if (existingPropertyFieldContainer != null)
|
||||||
|
{
|
||||||
|
port.Remove(existingPropertyFieldContainer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create appropriate property field based on the type of the variable
|
||||||
|
private VisualElement CreatePropertyFieldForType(Type type, object value)
|
||||||
|
{
|
||||||
|
if (type == typeof(int))
|
||||||
|
{
|
||||||
|
var intField = new IntegerField { value = (int)value };
|
||||||
|
return intField;
|
||||||
|
}
|
||||||
|
else if (type == typeof(float))
|
||||||
|
{
|
||||||
|
var floatField = new FloatField { value = (float)value };
|
||||||
|
return floatField;
|
||||||
|
}
|
||||||
|
else if (type == typeof(bool))
|
||||||
|
{
|
||||||
|
var boolField = new Toggle { value = (bool)value };
|
||||||
|
return boolField;
|
||||||
|
}
|
||||||
|
else if (type == typeof(string))
|
||||||
|
{
|
||||||
|
var stringField = new TextField { value = (string)value };
|
||||||
|
return stringField;
|
||||||
|
}
|
||||||
|
else if (type == typeof(Color))
|
||||||
|
{
|
||||||
|
var colorField = new ColorField() { value = (Color)value };
|
||||||
|
return colorField;
|
||||||
|
}
|
||||||
|
else if (type == typeof(Vector3))
|
||||||
|
{
|
||||||
|
var vector3Field = new Vector3Field { value = (Vector3)value };
|
||||||
|
return vector3Field;
|
||||||
|
}
|
||||||
|
else if (type == typeof(Vector2))
|
||||||
|
{
|
||||||
|
var vector2Field = new Vector2Field { value = (Vector2)value };
|
||||||
|
return vector2Field;
|
||||||
|
}
|
||||||
|
else if (type == typeof(Texture2D))
|
||||||
|
{
|
||||||
|
var objectField = new ObjectField { value = (Texture2D)value, objectType = typeof(Texture2D) };
|
||||||
|
return objectField;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add more types as needed (Vector3, etc.)
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SavePosition() => graphNode.SetPosition(GetPosition());
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,3 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 4f6cc3303a2442938105c3bc990cfd18
|
||||||
|
timeCreated: 1742158018
|
138
Scripts/Editor/Windows/ImageProcessingGraphSearchProvider.cs
Normal file
138
Scripts/Editor/Windows/ImageProcessingGraphSearchProvider.cs
Normal file
@ -0,0 +1,138 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Reflection;
|
||||||
|
using Codice.Client.Common;
|
||||||
|
using ImageProcessingGraph.Editor.Nodes.NodeAttributes;
|
||||||
|
using UnityEditor;
|
||||||
|
using UnityEditor.Experimental.GraphView;
|
||||||
|
using UnityEngine;
|
||||||
|
using UnityEngine.UIElements;
|
||||||
|
|
||||||
|
namespace ImageProcessingGraph.Editor.Unity_Image_Processing.Scripts.Editor.Windows
|
||||||
|
{
|
||||||
|
public struct SearchContextElement
|
||||||
|
{
|
||||||
|
public object target { get; private set; }
|
||||||
|
public string title { get; private set; }
|
||||||
|
|
||||||
|
public SearchContextElement(object target, string title)
|
||||||
|
{
|
||||||
|
this.target = target;
|
||||||
|
this.title = title;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class ImageProcessingGraphSearchProvider : ScriptableObject, ISearchWindowProvider
|
||||||
|
{
|
||||||
|
public ImageProcessingGraphViewWindow graph;
|
||||||
|
public VisualElement target;
|
||||||
|
|
||||||
|
public static List<SearchContextElement> elements;
|
||||||
|
private Assembly[] assemblies;
|
||||||
|
public List<SearchTreeEntry> CreateSearchTree(SearchWindowContext context)
|
||||||
|
{
|
||||||
|
List<SearchTreeEntry> tree = new List<SearchTreeEntry>();
|
||||||
|
tree.Add(new SearchTreeGroupEntry(new GUIContent("Nodes"), 0));
|
||||||
|
|
||||||
|
elements = new List<SearchContextElement>();
|
||||||
|
|
||||||
|
/*
|
||||||
|
assemblies = AppDomain.CurrentDomain.GetAssemblies();
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*foreach (var assembly in assemblies)
|
||||||
|
{
|
||||||
|
foreach (Type type in assembly.GetTypes())
|
||||||
|
{
|
||||||
|
if (type.CustomAttributes.ToList() != null)
|
||||||
|
{
|
||||||
|
var attr = type.GetCustomAttribute(typeof(NodeInfoAttribute));
|
||||||
|
if (attr != null)
|
||||||
|
{
|
||||||
|
NodeInfoAttribute info = attr as NodeInfoAttribute;
|
||||||
|
var node = Activator.CreateInstance(type);
|
||||||
|
if(string.IsNullOrEmpty(info.MenuItem)) continue;
|
||||||
|
|
||||||
|
elements.Add(new SearchContextElement(node, info.MenuItem));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}*/
|
||||||
|
|
||||||
|
foreach (var type in TypeCache.GetTypesWithAttribute<NodeInfoAttribute>())
|
||||||
|
{
|
||||||
|
var attr = type.GetCustomAttribute<NodeInfoAttribute>();
|
||||||
|
NodeInfoAttribute info = attr as NodeInfoAttribute;
|
||||||
|
var node = Activator.CreateInstance(type);
|
||||||
|
if(string.IsNullOrEmpty(info.MenuItem)) continue;
|
||||||
|
|
||||||
|
elements.Add(new SearchContextElement(node, info.MenuItem));
|
||||||
|
}
|
||||||
|
|
||||||
|
elements.Sort((entry1, entry2) =>
|
||||||
|
{
|
||||||
|
string[] splits1 = entry1.title.Split('/');
|
||||||
|
string[] splits2 = entry2.title.Split('/');
|
||||||
|
|
||||||
|
for (int i = 0; i < splits1.Length; i++)
|
||||||
|
{
|
||||||
|
if (i >= splits2.Length) return 1;
|
||||||
|
|
||||||
|
int value = splits1[i].CompareTo(splits2[i]);
|
||||||
|
if (value != 0)
|
||||||
|
{
|
||||||
|
if(splits1.Length != splits2.Length && (i == splits1.Length - 1 || i == splits2.Length - 1))
|
||||||
|
return splits1.Length < splits2.Length ? 1 : -1;
|
||||||
|
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
});
|
||||||
|
|
||||||
|
List<string> groups = new List<string>();
|
||||||
|
|
||||||
|
foreach (var element in elements)
|
||||||
|
{
|
||||||
|
string[] entryTitle = element.title.Split('/');
|
||||||
|
|
||||||
|
string groupName = "";
|
||||||
|
|
||||||
|
for (int i = 0; i < entryTitle.Length - 1; i++)
|
||||||
|
{
|
||||||
|
groupName += entryTitle[i];
|
||||||
|
if (!groups.Contains(groupName))
|
||||||
|
{
|
||||||
|
tree.Add(new SearchTreeGroupEntry(new GUIContent(groupName), i + 1));
|
||||||
|
groups.Add(groupName);
|
||||||
|
}
|
||||||
|
groupName += '/';
|
||||||
|
}
|
||||||
|
|
||||||
|
SearchTreeEntry entry = new SearchTreeEntry(new GUIContent(entryTitle.Last()));
|
||||||
|
entry.level = entryTitle.Length;
|
||||||
|
entry.userData = new SearchContextElement(element.target, element.title);
|
||||||
|
tree.Add(entry);
|
||||||
|
}
|
||||||
|
|
||||||
|
return tree;
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool OnSelectEntry(SearchTreeEntry SearchTreeEntry, SearchWindowContext context)
|
||||||
|
{
|
||||||
|
var mousePos = graph.ChangeCoordinatesTo(graph, context.screenMousePosition - graph.Window.position.position);
|
||||||
|
var graphMousePosition = graph.contentViewContainer.WorldToLocal(mousePos);
|
||||||
|
|
||||||
|
SearchContextElement element = (SearchContextElement)SearchTreeEntry.userData;
|
||||||
|
|
||||||
|
BaseImageNode node = (BaseImageNode)element.target;
|
||||||
|
node.SetPosition(new Rect(graphMousePosition, new Vector2()));
|
||||||
|
graph.Add(node);
|
||||||
|
node.asset = graph.asset;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,3 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 4b3b053637c34e86b2bda50c9cc5ccbb
|
||||||
|
timeCreated: 1742159126
|
342
Scripts/Editor/Windows/ImageProcessingGraphViewWindow.cs
Normal file
342
Scripts/Editor/Windows/ImageProcessingGraphViewWindow.cs
Normal file
@ -0,0 +1,342 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using ImageProcessingGraph.Editor.Unity_Image_Processing.Scripts.Editor.Windows;
|
||||||
|
using ImageProcessingGraph.Editor.Windows;
|
||||||
|
using UnityEditor;
|
||||||
|
using UnityEditor.Experimental.GraphView;
|
||||||
|
using UnityEngine;
|
||||||
|
using UnityEngine.UIElements;
|
||||||
|
|
||||||
|
namespace ImageProcessingGraph.Editor
|
||||||
|
{
|
||||||
|
public class ImageProcessingGraphViewWindow : GraphView
|
||||||
|
{
|
||||||
|
internal ImageProcessingGraphAsset asset;
|
||||||
|
private SerializedObject serializedObject;
|
||||||
|
private ImageProcessingGraphEditorWindow window;
|
||||||
|
|
||||||
|
public ImageProcessingGraphEditorWindow Window => window;
|
||||||
|
|
||||||
|
public List<ImageProcessingGraphNodeVisual> graphNodes;
|
||||||
|
public Dictionary<string, ImageProcessingGraphNodeVisual> nodeDictionary;
|
||||||
|
public Dictionary<Edge, GraphConnection> connectionDictionary;
|
||||||
|
|
||||||
|
internal ImageProcessingGraphSearchProvider searchProvider;
|
||||||
|
internal ImageProcessingGraphEdgeConnectorListener edgeConnectorListener;
|
||||||
|
|
||||||
|
public ImageProcessingGraphViewWindow(SerializedObject obeject, ImageProcessingGraphEditorWindow window)
|
||||||
|
{
|
||||||
|
this.serializedObject = obeject;
|
||||||
|
this.asset = obeject.targetObject as ImageProcessingGraphAsset;
|
||||||
|
|
||||||
|
this.graphNodes = new List<ImageProcessingGraphNodeVisual>();
|
||||||
|
nodeDictionary = new Dictionary<string, ImageProcessingGraphNodeVisual>();
|
||||||
|
connectionDictionary = new Dictionary<Edge, GraphConnection>();
|
||||||
|
|
||||||
|
searchProvider = ScriptableObject.CreateInstance<ImageProcessingGraphSearchProvider>();
|
||||||
|
searchProvider.graph = this;
|
||||||
|
|
||||||
|
edgeConnectorListener = new ImageProcessingGraphEdgeConnectorListener(this);
|
||||||
|
|
||||||
|
this.nodeCreationRequest = ShowSearchWindow;
|
||||||
|
|
||||||
|
this.window = window;
|
||||||
|
|
||||||
|
StyleSheet styleSheet = AssetDatabase.LoadAssetAtPath<StyleSheet>("Assets/Unity Image Processing/GraphView.uss");
|
||||||
|
styleSheets.Add(styleSheet);
|
||||||
|
|
||||||
|
GridBackground background = new GridBackground();
|
||||||
|
|
||||||
|
background.name = "Grid";
|
||||||
|
|
||||||
|
|
||||||
|
Add(background);
|
||||||
|
|
||||||
|
background.SendToBack();
|
||||||
|
|
||||||
|
this.AddManipulator(new ContentDragger());
|
||||||
|
this.AddManipulator(new SelectionDragger());
|
||||||
|
this.AddManipulator(new RectangleSelector());
|
||||||
|
this.AddManipulator(new ClickSelector());
|
||||||
|
this.AddManipulator(new ContentZoomer() );
|
||||||
|
|
||||||
|
DrawNodes();
|
||||||
|
DrawConnections();
|
||||||
|
|
||||||
|
graphViewChanged += OnGraphViewChanged;
|
||||||
|
Undo.undoRedoEvent += UndoEvent;
|
||||||
|
}
|
||||||
|
|
||||||
|
private ImageProcessingGraphNodeVisual GetNode(string NodeID)
|
||||||
|
{
|
||||||
|
ImageProcessingGraphNodeVisual node = null;
|
||||||
|
nodeDictionary.TryGetValue(NodeID, out node);
|
||||||
|
return node;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override List<Port> GetCompatiblePorts(Port startPort, NodeAdapter nodeAdapter)
|
||||||
|
{
|
||||||
|
List<Port> compatiblePorts = new List<Port>();
|
||||||
|
|
||||||
|
|
||||||
|
foreach (var node in graphNodes)
|
||||||
|
{
|
||||||
|
// Prevent connections to self
|
||||||
|
if (node == startPort.node)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
foreach (var port in node.inputContainer.Children().Concat(node.outputContainer.Children()).OfType<Port>())
|
||||||
|
{
|
||||||
|
// Prevent connecting input to input or output to output
|
||||||
|
if (port.direction == startPort.direction)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (port.portType != startPort.portType)
|
||||||
|
{
|
||||||
|
if (DoesConversionNodeExist())
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Prevent connection if it creates a cycle
|
||||||
|
if (startPort.direction == Direction.Output && CreatesCycle(startPort, port))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (startPort.direction == Direction.Input && CreatesCycle(port, startPort))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
compatiblePorts.Add(port);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return compatiblePorts;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void UndoEvent(in UndoRedoInfo undo)
|
||||||
|
{
|
||||||
|
DrawNodes();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private GraphViewChange OnGraphViewChanged(GraphViewChange graphviewchange)
|
||||||
|
{
|
||||||
|
|
||||||
|
if (graphviewchange.movedElements != null)
|
||||||
|
{
|
||||||
|
Undo.RecordObject(serializedObject.targetObject, "Moved Graph Elements");
|
||||||
|
foreach (var VARIABLE in graphviewchange.movedElements.OfType<ImageProcessingGraphNodeVisual>())
|
||||||
|
{
|
||||||
|
VARIABLE.SavePosition();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (graphviewchange.elementsToRemove != null)
|
||||||
|
{
|
||||||
|
List<ImageProcessingGraphNodeVisual> nodesToRemove = graphviewchange.elementsToRemove.OfType<ImageProcessingGraphNodeVisual>().ToList();
|
||||||
|
|
||||||
|
if (nodesToRemove.Count > 0)
|
||||||
|
{
|
||||||
|
Undo.RecordObject(serializedObject.targetObject, "Remove Node");
|
||||||
|
|
||||||
|
foreach (var VARIABLE in nodesToRemove)
|
||||||
|
{
|
||||||
|
RemoveNode(VARIABLE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var VARIABLE in graphviewchange.elementsToRemove.OfType<Edge>())
|
||||||
|
{
|
||||||
|
RemoveEdge(VARIABLE);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if (graphviewchange.edgesToCreate != null)
|
||||||
|
{
|
||||||
|
foreach (Edge edge in graphviewchange.edgesToCreate)
|
||||||
|
{
|
||||||
|
Undo.RecordObject(serializedObject.targetObject, "Created Connection");
|
||||||
|
CreateEdge(edge);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return graphviewchange;
|
||||||
|
}
|
||||||
|
|
||||||
|
#region Edges
|
||||||
|
|
||||||
|
void CreateEdge(Edge edge)
|
||||||
|
{
|
||||||
|
ImageProcessingGraphNodeVisual outputNode = (ImageProcessingGraphNodeVisual)edge.output.node;
|
||||||
|
ImageProcessingGraphNodeVisual inputNode = (ImageProcessingGraphNodeVisual)edge.input.node;
|
||||||
|
|
||||||
|
|
||||||
|
int outputIndex = outputNode.OutputPorts.IndexOf(edge.output);
|
||||||
|
int inputIndex = inputNode.InputPorts.IndexOf(edge.input);
|
||||||
|
|
||||||
|
string inputType = inputNode.GraphNode.GetType().Name;
|
||||||
|
string outputType = outputNode.GraphNode.GetType().Name;
|
||||||
|
|
||||||
|
GraphConnection connection = new GraphConnection(inputNode.GraphNode.ID,inputIndex, inputType,outputNode.GraphNode.ID, outputIndex, outputType);
|
||||||
|
|
||||||
|
asset.Connections.Add(connection);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void RemoveEdge(Edge variable)
|
||||||
|
{
|
||||||
|
if (connectionDictionary.TryGetValue(variable, out GraphConnection connection))
|
||||||
|
{
|
||||||
|
asset.Connections.Remove(connection);
|
||||||
|
connectionDictionary.Remove(variable);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void DrawConnections()
|
||||||
|
{
|
||||||
|
if (asset.Connections != null)
|
||||||
|
{
|
||||||
|
foreach (GraphConnection conn in asset.Connections)
|
||||||
|
{
|
||||||
|
ImageProcessingGraphNodeVisual inputNode = GetNode(conn.inputPort.nodeID);
|
||||||
|
ImageProcessingGraphNodeVisual outputNode = GetNode(conn.outputPort.nodeID);
|
||||||
|
|
||||||
|
if (inputNode != null && outputNode != null)
|
||||||
|
{
|
||||||
|
Port inPort = inputNode.InputPorts[conn.inputPort.portID];
|
||||||
|
Port outPort = outputNode.OutputPorts[conn.outputPort.portID];
|
||||||
|
|
||||||
|
Edge edge = inPort.ConnectTo(outPort);
|
||||||
|
AddElement(edge);
|
||||||
|
connectionDictionary.Add(edge, conn);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private bool DoesConversionNodeExist()
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
#region Cycle Logic
|
||||||
|
|
||||||
|
private bool CreatesCycle(Port fromPort, Port toPort)
|
||||||
|
{
|
||||||
|
var visited = new HashSet<Node>();
|
||||||
|
return HasPathTo(toPort.node, fromPort.node, visited);
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool HasPathTo(Node current, Node target, HashSet<Node> visited)
|
||||||
|
{
|
||||||
|
if (current == target)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
if (visited.Contains(current))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
visited.Add(current);
|
||||||
|
|
||||||
|
foreach (var outputPort in current.outputContainer.Children().OfType<Port>())
|
||||||
|
{
|
||||||
|
foreach (var edge in outputPort.connections)
|
||||||
|
{
|
||||||
|
var nextNode = edge.input.node;
|
||||||
|
if (HasPathTo(nextNode, target, visited))
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Nodes
|
||||||
|
private void DrawNodes()
|
||||||
|
{
|
||||||
|
foreach (ImageProcessingGraphNodeVisual node in graphNodes)
|
||||||
|
{
|
||||||
|
RemoveElement(node);
|
||||||
|
}
|
||||||
|
graphNodes.Clear();
|
||||||
|
|
||||||
|
foreach (KeyValuePair<string, ImageProcessingGraphNodeVisual> node in nodeDictionary)
|
||||||
|
{
|
||||||
|
RemoveElement(node.Value);
|
||||||
|
}
|
||||||
|
nodeDictionary.Clear();
|
||||||
|
|
||||||
|
foreach (var variable in asset.Nodes)
|
||||||
|
{
|
||||||
|
AddNodeToGraph(variable);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void AddNodeToGraph(BaseImageNode node)
|
||||||
|
{
|
||||||
|
node.typeName = node.GetType().AssemblyQualifiedName;
|
||||||
|
|
||||||
|
ImageProcessingGraphNodeVisual editorNode = new ImageProcessingGraphNodeVisual(node, this);
|
||||||
|
editorNode.SetPosition(node.Position);
|
||||||
|
|
||||||
|
graphNodes.Add(editorNode);
|
||||||
|
nodeDictionary.Add(node.ID, editorNode);
|
||||||
|
|
||||||
|
|
||||||
|
AddElement(editorNode);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Add(BaseImageNode node)
|
||||||
|
{
|
||||||
|
Undo.RecordObject(serializedObject.targetObject, "Added Node");
|
||||||
|
asset.Nodes.Add(node);
|
||||||
|
|
||||||
|
serializedObject.Update();
|
||||||
|
|
||||||
|
AddNodeToGraph(node);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void RemoveNode(ImageProcessingGraphNodeVisual variable)
|
||||||
|
{
|
||||||
|
List<GraphConnection> connectionsToRemove = new List<GraphConnection>();
|
||||||
|
|
||||||
|
foreach (var connection in asset.Connections)
|
||||||
|
{
|
||||||
|
if (connection.inputPort.nodeID == variable.GraphNode.ID || connection.outputPort.nodeID == variable.GraphNode.ID)
|
||||||
|
connectionsToRemove.Add(connection);
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var connection in connectionsToRemove)
|
||||||
|
{
|
||||||
|
asset.Connections.Remove(connection);
|
||||||
|
}
|
||||||
|
|
||||||
|
asset.Nodes.Remove(variable.GraphNode);
|
||||||
|
nodeDictionary.Remove(variable.GraphNode.ID);
|
||||||
|
graphNodes.Remove(variable);
|
||||||
|
serializedObject.Update();
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Search Window
|
||||||
|
|
||||||
|
private void ShowSearchWindow(NodeCreationContext obj)
|
||||||
|
{
|
||||||
|
searchProvider.target = (VisualElement)focusController.focusedElement;
|
||||||
|
SearchWindow.Open(new SearchWindowContext(obj.screenMousePosition), searchProvider);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,2 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: f8b07435c36617f48bbb9c51889caf81
|
8
Test Assets.meta
Normal file
8
Test Assets.meta
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: a4036f11a5b3def48b6cf5e8b0654a54
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
18
Test Assets/New IPT_Preferences.asset
Normal file
18
Test Assets/New IPT_Preferences.asset
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
%YAML 1.1
|
||||||
|
%TAG !u! tag:unity3d.com,2011:
|
||||||
|
--- !u!114 &11400000
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 0}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 11500000, guid: 80dcc02594d68e3439df7dc743c9d4b2, type: 3}
|
||||||
|
m_Name: New IPT_Preferences
|
||||||
|
m_EditorClassIdentifier:
|
||||||
|
thickLines: 0
|
||||||
|
spacing: 0
|
||||||
|
gridBackgroundColour: {r: 0, g: 0, b: 0, a: 0}
|
||||||
|
lineColour: {r: 0, g: 0, b: 0, a: 0}
|
8
Test Assets/New IPT_Preferences.asset.meta
Normal file
8
Test Assets/New IPT_Preferences.asset.meta
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: d4bfee84a7579474c8626fb17fcc299b
|
||||||
|
NativeFormatImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
mainObjectFileID: 11400000
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
658
Test Assets/New Shader Graph.shadergraph
Normal file
658
Test Assets/New Shader Graph.shadergraph
Normal file
@ -0,0 +1,658 @@
|
|||||||
|
{
|
||||||
|
"m_SGVersion": 3,
|
||||||
|
"m_Type": "UnityEditor.ShaderGraph.GraphData",
|
||||||
|
"m_ObjectId": "a14387ccdc0e4230b24cf16376062b37",
|
||||||
|
"m_Properties": [],
|
||||||
|
"m_Keywords": [],
|
||||||
|
"m_Dropdowns": [],
|
||||||
|
"m_CategoryData": [
|
||||||
|
{
|
||||||
|
"m_Id": "71cd3153db9241d78583f494f3175e65"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"m_Nodes": [
|
||||||
|
{
|
||||||
|
"m_Id": "0e3586066bf84a19b29835e8f00f18c8"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"m_Id": "4a4c9b7678bf48649738dd347fbf691d"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"m_Id": "6cc2f2b53819431db80cdc902c44b0a2"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"m_Id": "170a5a0274d84f83b5b3409d7ebccc3c"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"m_Id": "b6f01d1b41104807b982a044c5e1e005"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"m_Id": "329dddc156c148b887205cd362845c53"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"m_Id": "574823597594424bb34f730b62c44aef"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"m_Id": "a77037c58c28419ba14f3220b7d8fbff"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"m_Id": "265ae6dabc6f4c57bb9681736466b11f"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"m_GroupDatas": [],
|
||||||
|
"m_StickyNoteDatas": [],
|
||||||
|
"m_Edges": [],
|
||||||
|
"m_VertexContext": {
|
||||||
|
"m_Position": {
|
||||||
|
"x": 0.0,
|
||||||
|
"y": 0.0
|
||||||
|
},
|
||||||
|
"m_Blocks": [
|
||||||
|
{
|
||||||
|
"m_Id": "0e3586066bf84a19b29835e8f00f18c8"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"m_Id": "4a4c9b7678bf48649738dd347fbf691d"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"m_Id": "6cc2f2b53819431db80cdc902c44b0a2"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"m_FragmentContext": {
|
||||||
|
"m_Position": {
|
||||||
|
"x": 0.0,
|
||||||
|
"y": 200.0
|
||||||
|
},
|
||||||
|
"m_Blocks": [
|
||||||
|
{
|
||||||
|
"m_Id": "170a5a0274d84f83b5b3409d7ebccc3c"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"m_Id": "b6f01d1b41104807b982a044c5e1e005"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"m_Id": "329dddc156c148b887205cd362845c53"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"m_Id": "574823597594424bb34f730b62c44aef"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"m_Id": "a77037c58c28419ba14f3220b7d8fbff"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"m_Id": "265ae6dabc6f4c57bb9681736466b11f"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"m_PreviewData": {
|
||||||
|
"serializedMesh": {
|
||||||
|
"m_SerializedMesh": "{\"mesh\":{\"instanceID\":0}}",
|
||||||
|
"m_Guid": ""
|
||||||
|
},
|
||||||
|
"preventRotation": false
|
||||||
|
},
|
||||||
|
"m_Path": "Shader Graphs",
|
||||||
|
"m_GraphPrecision": 1,
|
||||||
|
"m_PreviewMode": 2,
|
||||||
|
"m_OutputNode": {
|
||||||
|
"m_Id": ""
|
||||||
|
},
|
||||||
|
"m_SubDatas": [],
|
||||||
|
"m_ActiveTargets": [
|
||||||
|
{
|
||||||
|
"m_Id": "7dffcc0f872e4798bc7d7c277c01ca46"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
"m_SGVersion": 0,
|
||||||
|
"m_Type": "UnityEditor.ShaderGraph.ColorRGBMaterialSlot",
|
||||||
|
"m_ObjectId": "0000b8c7f15240e8a92c2c75a833f48f",
|
||||||
|
"m_Id": 0,
|
||||||
|
"m_DisplayName": "Base Color",
|
||||||
|
"m_SlotType": 0,
|
||||||
|
"m_Hidden": false,
|
||||||
|
"m_ShaderOutputName": "BaseColor",
|
||||||
|
"m_StageCapability": 2,
|
||||||
|
"m_Value": {
|
||||||
|
"x": 0.5,
|
||||||
|
"y": 0.5,
|
||||||
|
"z": 0.5
|
||||||
|
},
|
||||||
|
"m_DefaultValue": {
|
||||||
|
"x": 0.5,
|
||||||
|
"y": 0.5,
|
||||||
|
"z": 0.5
|
||||||
|
},
|
||||||
|
"m_Labels": [],
|
||||||
|
"m_ColorMode": 0,
|
||||||
|
"m_DefaultColor": {
|
||||||
|
"r": 0.5,
|
||||||
|
"g": 0.5,
|
||||||
|
"b": 0.5,
|
||||||
|
"a": 1.0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
"m_SGVersion": 0,
|
||||||
|
"m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot",
|
||||||
|
"m_ObjectId": "0468751a1c344e38b0aec9b2b4467e38",
|
||||||
|
"m_Id": 0,
|
||||||
|
"m_DisplayName": "Smoothness",
|
||||||
|
"m_SlotType": 0,
|
||||||
|
"m_Hidden": false,
|
||||||
|
"m_ShaderOutputName": "Smoothness",
|
||||||
|
"m_StageCapability": 2,
|
||||||
|
"m_Value": 0.5,
|
||||||
|
"m_DefaultValue": 0.5,
|
||||||
|
"m_Labels": []
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
"m_SGVersion": 0,
|
||||||
|
"m_Type": "UnityEditor.ShaderGraph.BlockNode",
|
||||||
|
"m_ObjectId": "0e3586066bf84a19b29835e8f00f18c8",
|
||||||
|
"m_Group": {
|
||||||
|
"m_Id": ""
|
||||||
|
},
|
||||||
|
"m_Name": "VertexDescription.Position",
|
||||||
|
"m_DrawState": {
|
||||||
|
"m_Expanded": true,
|
||||||
|
"m_Position": {
|
||||||
|
"serializedVersion": "2",
|
||||||
|
"x": 0.0,
|
||||||
|
"y": 0.0,
|
||||||
|
"width": 0.0,
|
||||||
|
"height": 0.0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"m_Slots": [
|
||||||
|
{
|
||||||
|
"m_Id": "8e9794e0177a4feebf5eb676d84fe1f3"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"synonyms": [],
|
||||||
|
"m_Precision": 0,
|
||||||
|
"m_PreviewExpanded": true,
|
||||||
|
"m_DismissedVersion": 0,
|
||||||
|
"m_PreviewMode": 0,
|
||||||
|
"m_CustomColors": {
|
||||||
|
"m_SerializableColors": []
|
||||||
|
},
|
||||||
|
"m_SerializedDescriptor": "VertexDescription.Position"
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
"m_SGVersion": 0,
|
||||||
|
"m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot",
|
||||||
|
"m_ObjectId": "0f43a512a2ae49f3959b2c0347ca55b2",
|
||||||
|
"m_Id": 0,
|
||||||
|
"m_DisplayName": "Ambient Occlusion",
|
||||||
|
"m_SlotType": 0,
|
||||||
|
"m_Hidden": false,
|
||||||
|
"m_ShaderOutputName": "Occlusion",
|
||||||
|
"m_StageCapability": 2,
|
||||||
|
"m_Value": 1.0,
|
||||||
|
"m_DefaultValue": 1.0,
|
||||||
|
"m_Labels": []
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
"m_SGVersion": 0,
|
||||||
|
"m_Type": "UnityEditor.ShaderGraph.BlockNode",
|
||||||
|
"m_ObjectId": "170a5a0274d84f83b5b3409d7ebccc3c",
|
||||||
|
"m_Group": {
|
||||||
|
"m_Id": ""
|
||||||
|
},
|
||||||
|
"m_Name": "SurfaceDescription.BaseColor",
|
||||||
|
"m_DrawState": {
|
||||||
|
"m_Expanded": true,
|
||||||
|
"m_Position": {
|
||||||
|
"serializedVersion": "2",
|
||||||
|
"x": 0.0,
|
||||||
|
"y": 0.0,
|
||||||
|
"width": 0.0,
|
||||||
|
"height": 0.0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"m_Slots": [
|
||||||
|
{
|
||||||
|
"m_Id": "0000b8c7f15240e8a92c2c75a833f48f"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"synonyms": [],
|
||||||
|
"m_Precision": 0,
|
||||||
|
"m_PreviewExpanded": true,
|
||||||
|
"m_DismissedVersion": 0,
|
||||||
|
"m_PreviewMode": 0,
|
||||||
|
"m_CustomColors": {
|
||||||
|
"m_SerializableColors": []
|
||||||
|
},
|
||||||
|
"m_SerializedDescriptor": "SurfaceDescription.BaseColor"
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
"m_SGVersion": 2,
|
||||||
|
"m_Type": "UnityEditor.Rendering.Universal.ShaderGraph.UniversalLitSubTarget",
|
||||||
|
"m_ObjectId": "1fe22ff03eb64399a2fd9c06b88eafa8",
|
||||||
|
"m_WorkflowMode": 1,
|
||||||
|
"m_NormalDropOffSpace": 0,
|
||||||
|
"m_ClearCoat": false,
|
||||||
|
"m_BlendModePreserveSpecular": true
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
"m_SGVersion": 0,
|
||||||
|
"m_Type": "UnityEditor.ShaderGraph.BlockNode",
|
||||||
|
"m_ObjectId": "265ae6dabc6f4c57bb9681736466b11f",
|
||||||
|
"m_Group": {
|
||||||
|
"m_Id": ""
|
||||||
|
},
|
||||||
|
"m_Name": "SurfaceDescription.Occlusion",
|
||||||
|
"m_DrawState": {
|
||||||
|
"m_Expanded": true,
|
||||||
|
"m_Position": {
|
||||||
|
"serializedVersion": "2",
|
||||||
|
"x": 0.0,
|
||||||
|
"y": 0.0,
|
||||||
|
"width": 0.0,
|
||||||
|
"height": 0.0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"m_Slots": [
|
||||||
|
{
|
||||||
|
"m_Id": "0f43a512a2ae49f3959b2c0347ca55b2"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"synonyms": [],
|
||||||
|
"m_Precision": 0,
|
||||||
|
"m_PreviewExpanded": true,
|
||||||
|
"m_DismissedVersion": 0,
|
||||||
|
"m_PreviewMode": 0,
|
||||||
|
"m_CustomColors": {
|
||||||
|
"m_SerializableColors": []
|
||||||
|
},
|
||||||
|
"m_SerializedDescriptor": "SurfaceDescription.Occlusion"
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
"m_SGVersion": 0,
|
||||||
|
"m_Type": "UnityEditor.ShaderGraph.BlockNode",
|
||||||
|
"m_ObjectId": "329dddc156c148b887205cd362845c53",
|
||||||
|
"m_Group": {
|
||||||
|
"m_Id": ""
|
||||||
|
},
|
||||||
|
"m_Name": "SurfaceDescription.Metallic",
|
||||||
|
"m_DrawState": {
|
||||||
|
"m_Expanded": true,
|
||||||
|
"m_Position": {
|
||||||
|
"serializedVersion": "2",
|
||||||
|
"x": 0.0,
|
||||||
|
"y": 0.0,
|
||||||
|
"width": 0.0,
|
||||||
|
"height": 0.0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"m_Slots": [
|
||||||
|
{
|
||||||
|
"m_Id": "bd184b28488f4573bef8c2af64be7436"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"synonyms": [],
|
||||||
|
"m_Precision": 0,
|
||||||
|
"m_PreviewExpanded": true,
|
||||||
|
"m_DismissedVersion": 0,
|
||||||
|
"m_PreviewMode": 0,
|
||||||
|
"m_CustomColors": {
|
||||||
|
"m_SerializableColors": []
|
||||||
|
},
|
||||||
|
"m_SerializedDescriptor": "SurfaceDescription.Metallic"
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
"m_SGVersion": 0,
|
||||||
|
"m_Type": "UnityEditor.ShaderGraph.TangentMaterialSlot",
|
||||||
|
"m_ObjectId": "32e096cd3bb849e7bb32f646989794db",
|
||||||
|
"m_Id": 0,
|
||||||
|
"m_DisplayName": "Tangent",
|
||||||
|
"m_SlotType": 0,
|
||||||
|
"m_Hidden": false,
|
||||||
|
"m_ShaderOutputName": "Tangent",
|
||||||
|
"m_StageCapability": 1,
|
||||||
|
"m_Value": {
|
||||||
|
"x": 0.0,
|
||||||
|
"y": 0.0,
|
||||||
|
"z": 0.0
|
||||||
|
},
|
||||||
|
"m_DefaultValue": {
|
||||||
|
"x": 0.0,
|
||||||
|
"y": 0.0,
|
||||||
|
"z": 0.0
|
||||||
|
},
|
||||||
|
"m_Labels": [],
|
||||||
|
"m_Space": 0
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
"m_SGVersion": 0,
|
||||||
|
"m_Type": "UnityEditor.ShaderGraph.ColorRGBMaterialSlot",
|
||||||
|
"m_ObjectId": "382845f601e84d2292ccb7886a370bcb",
|
||||||
|
"m_Id": 0,
|
||||||
|
"m_DisplayName": "Emission",
|
||||||
|
"m_SlotType": 0,
|
||||||
|
"m_Hidden": false,
|
||||||
|
"m_ShaderOutputName": "Emission",
|
||||||
|
"m_StageCapability": 2,
|
||||||
|
"m_Value": {
|
||||||
|
"x": 0.0,
|
||||||
|
"y": 0.0,
|
||||||
|
"z": 0.0
|
||||||
|
},
|
||||||
|
"m_DefaultValue": {
|
||||||
|
"x": 0.0,
|
||||||
|
"y": 0.0,
|
||||||
|
"z": 0.0
|
||||||
|
},
|
||||||
|
"m_Labels": [],
|
||||||
|
"m_ColorMode": 1,
|
||||||
|
"m_DefaultColor": {
|
||||||
|
"r": 0.0,
|
||||||
|
"g": 0.0,
|
||||||
|
"b": 0.0,
|
||||||
|
"a": 1.0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
"m_SGVersion": 0,
|
||||||
|
"m_Type": "UnityEditor.ShaderGraph.BlockNode",
|
||||||
|
"m_ObjectId": "4a4c9b7678bf48649738dd347fbf691d",
|
||||||
|
"m_Group": {
|
||||||
|
"m_Id": ""
|
||||||
|
},
|
||||||
|
"m_Name": "VertexDescription.Normal",
|
||||||
|
"m_DrawState": {
|
||||||
|
"m_Expanded": true,
|
||||||
|
"m_Position": {
|
||||||
|
"serializedVersion": "2",
|
||||||
|
"x": 0.0,
|
||||||
|
"y": 0.0,
|
||||||
|
"width": 0.0,
|
||||||
|
"height": 0.0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"m_Slots": [
|
||||||
|
{
|
||||||
|
"m_Id": "83dd0d2576664436bb795eba7ffb4883"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"synonyms": [],
|
||||||
|
"m_Precision": 0,
|
||||||
|
"m_PreviewExpanded": true,
|
||||||
|
"m_DismissedVersion": 0,
|
||||||
|
"m_PreviewMode": 0,
|
||||||
|
"m_CustomColors": {
|
||||||
|
"m_SerializableColors": []
|
||||||
|
},
|
||||||
|
"m_SerializedDescriptor": "VertexDescription.Normal"
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
"m_SGVersion": 0,
|
||||||
|
"m_Type": "UnityEditor.ShaderGraph.BlockNode",
|
||||||
|
"m_ObjectId": "574823597594424bb34f730b62c44aef",
|
||||||
|
"m_Group": {
|
||||||
|
"m_Id": ""
|
||||||
|
},
|
||||||
|
"m_Name": "SurfaceDescription.Smoothness",
|
||||||
|
"m_DrawState": {
|
||||||
|
"m_Expanded": true,
|
||||||
|
"m_Position": {
|
||||||
|
"serializedVersion": "2",
|
||||||
|
"x": 0.0,
|
||||||
|
"y": 0.0,
|
||||||
|
"width": 0.0,
|
||||||
|
"height": 0.0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"m_Slots": [
|
||||||
|
{
|
||||||
|
"m_Id": "0468751a1c344e38b0aec9b2b4467e38"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"synonyms": [],
|
||||||
|
"m_Precision": 0,
|
||||||
|
"m_PreviewExpanded": true,
|
||||||
|
"m_DismissedVersion": 0,
|
||||||
|
"m_PreviewMode": 0,
|
||||||
|
"m_CustomColors": {
|
||||||
|
"m_SerializableColors": []
|
||||||
|
},
|
||||||
|
"m_SerializedDescriptor": "SurfaceDescription.Smoothness"
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
"m_SGVersion": 0,
|
||||||
|
"m_Type": "UnityEditor.ShaderGraph.BlockNode",
|
||||||
|
"m_ObjectId": "6cc2f2b53819431db80cdc902c44b0a2",
|
||||||
|
"m_Group": {
|
||||||
|
"m_Id": ""
|
||||||
|
},
|
||||||
|
"m_Name": "VertexDescription.Tangent",
|
||||||
|
"m_DrawState": {
|
||||||
|
"m_Expanded": true,
|
||||||
|
"m_Position": {
|
||||||
|
"serializedVersion": "2",
|
||||||
|
"x": 0.0,
|
||||||
|
"y": 0.0,
|
||||||
|
"width": 0.0,
|
||||||
|
"height": 0.0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"m_Slots": [
|
||||||
|
{
|
||||||
|
"m_Id": "32e096cd3bb849e7bb32f646989794db"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"synonyms": [],
|
||||||
|
"m_Precision": 0,
|
||||||
|
"m_PreviewExpanded": true,
|
||||||
|
"m_DismissedVersion": 0,
|
||||||
|
"m_PreviewMode": 0,
|
||||||
|
"m_CustomColors": {
|
||||||
|
"m_SerializableColors": []
|
||||||
|
},
|
||||||
|
"m_SerializedDescriptor": "VertexDescription.Tangent"
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
"m_SGVersion": 0,
|
||||||
|
"m_Type": "UnityEditor.ShaderGraph.CategoryData",
|
||||||
|
"m_ObjectId": "71cd3153db9241d78583f494f3175e65",
|
||||||
|
"m_Name": "",
|
||||||
|
"m_ChildObjectList": []
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
"m_SGVersion": 1,
|
||||||
|
"m_Type": "UnityEditor.Rendering.Universal.ShaderGraph.UniversalTarget",
|
||||||
|
"m_ObjectId": "7dffcc0f872e4798bc7d7c277c01ca46",
|
||||||
|
"m_Datas": [],
|
||||||
|
"m_ActiveSubTarget": {
|
||||||
|
"m_Id": "1fe22ff03eb64399a2fd9c06b88eafa8"
|
||||||
|
},
|
||||||
|
"m_AllowMaterialOverride": false,
|
||||||
|
"m_SurfaceType": 0,
|
||||||
|
"m_ZTestMode": 4,
|
||||||
|
"m_ZWriteControl": 0,
|
||||||
|
"m_AlphaMode": 0,
|
||||||
|
"m_RenderFace": 2,
|
||||||
|
"m_AlphaClip": false,
|
||||||
|
"m_CastShadows": true,
|
||||||
|
"m_ReceiveShadows": true,
|
||||||
|
"m_DisableTint": false,
|
||||||
|
"m_AdditionalMotionVectorMode": 0,
|
||||||
|
"m_AlembicMotionVectors": false,
|
||||||
|
"m_SupportsLODCrossFade": false,
|
||||||
|
"m_CustomEditorGUI": "",
|
||||||
|
"m_SupportVFX": false
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
"m_SGVersion": 0,
|
||||||
|
"m_Type": "UnityEditor.ShaderGraph.NormalMaterialSlot",
|
||||||
|
"m_ObjectId": "83dd0d2576664436bb795eba7ffb4883",
|
||||||
|
"m_Id": 0,
|
||||||
|
"m_DisplayName": "Normal",
|
||||||
|
"m_SlotType": 0,
|
||||||
|
"m_Hidden": false,
|
||||||
|
"m_ShaderOutputName": "Normal",
|
||||||
|
"m_StageCapability": 1,
|
||||||
|
"m_Value": {
|
||||||
|
"x": 0.0,
|
||||||
|
"y": 0.0,
|
||||||
|
"z": 0.0
|
||||||
|
},
|
||||||
|
"m_DefaultValue": {
|
||||||
|
"x": 0.0,
|
||||||
|
"y": 0.0,
|
||||||
|
"z": 0.0
|
||||||
|
},
|
||||||
|
"m_Labels": [],
|
||||||
|
"m_Space": 0
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
"m_SGVersion": 0,
|
||||||
|
"m_Type": "UnityEditor.ShaderGraph.PositionMaterialSlot",
|
||||||
|
"m_ObjectId": "8e9794e0177a4feebf5eb676d84fe1f3",
|
||||||
|
"m_Id": 0,
|
||||||
|
"m_DisplayName": "Position",
|
||||||
|
"m_SlotType": 0,
|
||||||
|
"m_Hidden": false,
|
||||||
|
"m_ShaderOutputName": "Position",
|
||||||
|
"m_StageCapability": 1,
|
||||||
|
"m_Value": {
|
||||||
|
"x": 0.0,
|
||||||
|
"y": 0.0,
|
||||||
|
"z": 0.0
|
||||||
|
},
|
||||||
|
"m_DefaultValue": {
|
||||||
|
"x": 0.0,
|
||||||
|
"y": 0.0,
|
||||||
|
"z": 0.0
|
||||||
|
},
|
||||||
|
"m_Labels": [],
|
||||||
|
"m_Space": 0
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
"m_SGVersion": 0,
|
||||||
|
"m_Type": "UnityEditor.ShaderGraph.NormalMaterialSlot",
|
||||||
|
"m_ObjectId": "a72d7540c45d4b7e8a8d554f6274d745",
|
||||||
|
"m_Id": 0,
|
||||||
|
"m_DisplayName": "Normal (Tangent Space)",
|
||||||
|
"m_SlotType": 0,
|
||||||
|
"m_Hidden": false,
|
||||||
|
"m_ShaderOutputName": "NormalTS",
|
||||||
|
"m_StageCapability": 2,
|
||||||
|
"m_Value": {
|
||||||
|
"x": 0.0,
|
||||||
|
"y": 0.0,
|
||||||
|
"z": 0.0
|
||||||
|
},
|
||||||
|
"m_DefaultValue": {
|
||||||
|
"x": 0.0,
|
||||||
|
"y": 0.0,
|
||||||
|
"z": 0.0
|
||||||
|
},
|
||||||
|
"m_Labels": [],
|
||||||
|
"m_Space": 3
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
"m_SGVersion": 0,
|
||||||
|
"m_Type": "UnityEditor.ShaderGraph.BlockNode",
|
||||||
|
"m_ObjectId": "a77037c58c28419ba14f3220b7d8fbff",
|
||||||
|
"m_Group": {
|
||||||
|
"m_Id": ""
|
||||||
|
},
|
||||||
|
"m_Name": "SurfaceDescription.Emission",
|
||||||
|
"m_DrawState": {
|
||||||
|
"m_Expanded": true,
|
||||||
|
"m_Position": {
|
||||||
|
"serializedVersion": "2",
|
||||||
|
"x": 0.0,
|
||||||
|
"y": 0.0,
|
||||||
|
"width": 0.0,
|
||||||
|
"height": 0.0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"m_Slots": [
|
||||||
|
{
|
||||||
|
"m_Id": "382845f601e84d2292ccb7886a370bcb"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"synonyms": [],
|
||||||
|
"m_Precision": 0,
|
||||||
|
"m_PreviewExpanded": true,
|
||||||
|
"m_DismissedVersion": 0,
|
||||||
|
"m_PreviewMode": 0,
|
||||||
|
"m_CustomColors": {
|
||||||
|
"m_SerializableColors": []
|
||||||
|
},
|
||||||
|
"m_SerializedDescriptor": "SurfaceDescription.Emission"
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
"m_SGVersion": 0,
|
||||||
|
"m_Type": "UnityEditor.ShaderGraph.BlockNode",
|
||||||
|
"m_ObjectId": "b6f01d1b41104807b982a044c5e1e005",
|
||||||
|
"m_Group": {
|
||||||
|
"m_Id": ""
|
||||||
|
},
|
||||||
|
"m_Name": "SurfaceDescription.NormalTS",
|
||||||
|
"m_DrawState": {
|
||||||
|
"m_Expanded": true,
|
||||||
|
"m_Position": {
|
||||||
|
"serializedVersion": "2",
|
||||||
|
"x": 0.0,
|
||||||
|
"y": 0.0,
|
||||||
|
"width": 0.0,
|
||||||
|
"height": 0.0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"m_Slots": [
|
||||||
|
{
|
||||||
|
"m_Id": "a72d7540c45d4b7e8a8d554f6274d745"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"synonyms": [],
|
||||||
|
"m_Precision": 0,
|
||||||
|
"m_PreviewExpanded": true,
|
||||||
|
"m_DismissedVersion": 0,
|
||||||
|
"m_PreviewMode": 0,
|
||||||
|
"m_CustomColors": {
|
||||||
|
"m_SerializableColors": []
|
||||||
|
},
|
||||||
|
"m_SerializedDescriptor": "SurfaceDescription.NormalTS"
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
"m_SGVersion": 0,
|
||||||
|
"m_Type": "UnityEditor.ShaderGraph.Vector1MaterialSlot",
|
||||||
|
"m_ObjectId": "bd184b28488f4573bef8c2af64be7436",
|
||||||
|
"m_Id": 0,
|
||||||
|
"m_DisplayName": "Metallic",
|
||||||
|
"m_SlotType": 0,
|
||||||
|
"m_Hidden": false,
|
||||||
|
"m_ShaderOutputName": "Metallic",
|
||||||
|
"m_StageCapability": 2,
|
||||||
|
"m_Value": 0.0,
|
||||||
|
"m_DefaultValue": 0.0,
|
||||||
|
"m_Labels": []
|
||||||
|
}
|
||||||
|
|
10
Test Assets/New Shader Graph.shadergraph.meta
Normal file
10
Test Assets/New Shader Graph.shadergraph.meta
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: c56761e16709479478032d95d74c0274
|
||||||
|
ScriptedImporter:
|
||||||
|
internalIDToNameTable: []
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
script: {fileID: 11500000, guid: 625f186215c104763be7675aa2d941aa, type: 3}
|
95
Test Assets/Test Graph One.asset
Normal file
95
Test Assets/Test Graph One.asset
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
%YAML 1.1
|
||||||
|
%TAG !u! tag:unity3d.com,2011:
|
||||||
|
--- !u!114 &11400000
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 0}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 11500000, guid: 1da462fd3f736d04e80556b4ac8b470f, type: 3}
|
||||||
|
m_Name: Test Graph One
|
||||||
|
m_EditorClassIdentifier:
|
||||||
|
nodes:
|
||||||
|
- rid: 6869590814762467392
|
||||||
|
- rid: 6869590814762467393
|
||||||
|
- rid: 6869590814762467394
|
||||||
|
- rid: 6869590814762467395
|
||||||
|
connections:
|
||||||
|
- inputPort:
|
||||||
|
nodeID: 64b814fe-8177-4620-9cf6-cacbe0b8ddd7
|
||||||
|
nodeType: Texture2DDesaturate
|
||||||
|
portID: 0
|
||||||
|
outputPort:
|
||||||
|
nodeID: b8924b16-c816-4168-8ee6-9ee30c6b63a9
|
||||||
|
nodeType: Texture2DImport
|
||||||
|
portID: 0
|
||||||
|
- inputPort:
|
||||||
|
nodeID: aa4b4ff2-61d6-4f84-a4ab-5b6b15c2ba97
|
||||||
|
nodeType: Texture2DOutput
|
||||||
|
portID: 0
|
||||||
|
outputPort:
|
||||||
|
nodeID: 64b814fe-8177-4620-9cf6-cacbe0b8ddd7
|
||||||
|
nodeType: Texture2DDesaturate
|
||||||
|
portID: 0
|
||||||
|
references:
|
||||||
|
version: 2
|
||||||
|
RefIds:
|
||||||
|
- rid: 6869590814762467392
|
||||||
|
type: {class: Texture2DImport, ns: ImageProcessingGraph.Editor.Nodes.Import_Nodes, asm: ImageProcessingGraphEditor}
|
||||||
|
data:
|
||||||
|
guid: b8924b16-c816-4168-8ee6-9ee30c6b63a9
|
||||||
|
position:
|
||||||
|
serializedVersion: 2
|
||||||
|
x: -1110
|
||||||
|
y: 171.5
|
||||||
|
width: 311
|
||||||
|
height: 77
|
||||||
|
typeName: ImageProcessingGraph.Editor.Nodes.Import_Nodes.Texture2DImport,
|
||||||
|
ImageProcessingGraphEditor, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
|
||||||
|
asset: {fileID: 11400000}
|
||||||
|
textureImport: {fileID: 2800000, guid: 727a75301c3d24613a3ebcec4a24c2c8, type: 3}
|
||||||
|
- rid: 6869590814762467393
|
||||||
|
type: {class: Texture2DDesaturate, ns: ImageProcessingGraph.Editor.Nodes.Fun_Nodes.Texture, asm: ImageProcessingGraphEditor}
|
||||||
|
data:
|
||||||
|
guid: 64b814fe-8177-4620-9cf6-cacbe0b8ddd7
|
||||||
|
position:
|
||||||
|
serializedVersion: 2
|
||||||
|
x: -782
|
||||||
|
y: 171.5
|
||||||
|
width: 186
|
||||||
|
height: 77
|
||||||
|
typeName: ImageProcessingGraph.Editor.Nodes.Fun_Nodes.Texture.Texture2DDesaturate,
|
||||||
|
ImageProcessingGraphEditor, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
|
||||||
|
asset: {fileID: 11400000}
|
||||||
|
- rid: 6869590814762467394
|
||||||
|
type: {class: Texture2DOutput, ns: ImageProcessingGraph.Editor.Nodes.Output, asm: ImageProcessingGraphEditor}
|
||||||
|
data:
|
||||||
|
guid: aa4b4ff2-61d6-4f84-a4ab-5b6b15c2ba97
|
||||||
|
position:
|
||||||
|
serializedVersion: 2
|
||||||
|
x: -541
|
||||||
|
y: 186
|
||||||
|
width: 129.5
|
||||||
|
height: 125
|
||||||
|
typeName: ImageProcessingGraph.Editor.Nodes.Output.Texture2DOutput, ImageProcessingGraphEditor,
|
||||||
|
Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
|
||||||
|
asset: {fileID: 11400000}
|
||||||
|
fileName: test123432
|
||||||
|
fileDirectory: Assets/
|
||||||
|
- rid: 6869590814762467395
|
||||||
|
type: {class: Texture2DImport, ns: ImageProcessingGraph.Editor.Nodes.Import_Nodes, asm: ImageProcessingGraphEditor}
|
||||||
|
data:
|
||||||
|
guid: 31f0135e-bc96-4c58-b808-210652f702bb
|
||||||
|
position:
|
||||||
|
serializedVersion: 2
|
||||||
|
x: 152
|
||||||
|
y: -9
|
||||||
|
width: 311
|
||||||
|
height: 77
|
||||||
|
typeName: ImageProcessingGraph.Editor.Nodes.Import_Nodes.Texture2DImport,
|
||||||
|
ImageProcessingGraphEditor, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
|
||||||
|
asset: {fileID: 11400000}
|
||||||
|
textureImport: {fileID: 0}
|
8
Test Assets/Test Graph One.asset.meta
Normal file
8
Test Assets/Test Graph One.asset.meta
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: cef427fd668d96d47b164a934e97ba0d
|
||||||
|
NativeFormatImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
mainObjectFileID: 11400000
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
15
package.json
Normal file
15
package.json
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
{
|
||||||
|
"name": "com.chromium.imageprocessingrah",
|
||||||
|
"version": "6000.0.19f1",
|
||||||
|
"displayName": "Image Processing Graph",
|
||||||
|
"description": "Stuffs",
|
||||||
|
"unity": "6000.0.19f1",
|
||||||
|
"dependencies": {
|
||||||
|
"com.unity.burst" : "1.8.17"
|
||||||
|
},
|
||||||
|
"author": {
|
||||||
|
"name": "Sam Green",
|
||||||
|
"email": "samgreen432@hotmail.com",
|
||||||
|
"url": "https://sam-green.dev"
|
||||||
|
}
|
||||||
|
}
|
7
package.json.meta
Normal file
7
package.json.meta
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 0092e49564121a74aafb744bcc1282ac
|
||||||
|
TextScriptImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
Loading…
x
Reference in New Issue
Block a user