Created
October 10, 2021 00:44
-
-
Save minism/6222bc50f4adbef64210ba420f82b6db to your computer and use it in GitHub Desktop.
NodeGraphProcessor - NodeView with texture preview example
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System.Collections; | |
using System.Collections.Generic; | |
using UnityEngine; | |
using UnityEditor; | |
using UnityEditor.UIElements; | |
using UnityEditor.Experimental.GraphView; | |
using UnityEngine.UIElements; | |
using GraphProcessor; | |
[NodeCustomEditor(typeof(MapOutputNode))] | |
public class MapOutputNodeView : BaseNodeView { | |
protected new MapOutputNode nodeTarget => base.nodeTarget as MapOutputNode; | |
private VisualElement previewContainer; | |
private Texture2D previewTexture; | |
public override void Enable() { | |
var node = nodeTarget as MapOutputNode; | |
previewContainer = new VisualElement(); | |
controlsContainer.Add(previewContainer); | |
controlsContainer.Add(new Label("Run for preview")); | |
nodeTarget.onProcessed += UpdatePreview; | |
} | |
private void UpdatePreview() { | |
if (nodeTarget.output == null || nodeTarget.output.GetLength(0) == 0 || nodeTarget.output.GetLength(1) == 0) { | |
return; | |
} | |
if (previewContainer != null && previewContainer.childCount == 0) { | |
CreatePreviewContainer(); | |
} | |
// Update the actual texture. | |
var data = nodeTarget.output; | |
var width = data.GetLength(0); | |
var height = data.GetLength(1); | |
previewTexture = new Texture2D(width, height, TextureFormat.RGB24, false); | |
for (int x = 0; x < width; x++) { | |
for (int y = 0; y < height; y++) { | |
previewTexture.SetPixel(x, y, data[x, y] == 0 ? Color.white : Color.black); | |
} | |
} | |
previewTexture.Apply(); | |
} | |
private void CreatePreviewContainer() { | |
previewContainer.Clear(); | |
var mapTexture = new VisualElement(); | |
previewContainer.Add(mapTexture); | |
mapTexture.Add(new IMGUIContainer(() => { | |
var previewRect = GetPreviewRect(); | |
EditorGUI.DrawPreviewTexture(previewRect, previewTexture); | |
})); | |
} | |
private Rect GetPreviewRect() { | |
float width = controlsContainer.contentRect.width; | |
float scaleFactor = width / nodeTarget.output.GetLength(0); | |
float height = Mathf.Min(width, nodeTarget.output.GetLength(1) * scaleFactor); | |
return GUILayoutUtility.GetRect(1, width, 1, height); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment