diff options
Diffstat (limited to 'Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Graphs/NodeGrid.cs')
-rw-r--r-- | Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Graphs/NodeGrid.cs | 283 |
1 files changed, 283 insertions, 0 deletions
diff --git a/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Graphs/NodeGrid.cs b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Graphs/NodeGrid.cs new file mode 100644 index 00000000..748d28ba --- /dev/null +++ b/Assets/ThirdParty/AmplifyShaderEditor/Plugins/Editor/Graphs/NodeGrid.cs @@ -0,0 +1,283 @@ +// Amplify Shader Editor - Visual Shader Editing Tool +// Copyright (c) Amplify Creations, Lda <info@amplify.pt> + +using System.Collections.Generic; +using UnityEngine; +using UnityEditor; + +namespace AmplifyShaderEditor +{ + public class NodeGrid + { + private bool m_debugGrid = false; + private const float GRID_SIZE_X = 100; + private const float GRID_SIZE_Y = 100; + + private const float GRID_AREA_X = 1000; + private const float GRID_AREA_Y = 1000; + + private Dictionary<int, Dictionary<int, List<ParentNode>>> m_grid; + + private int m_xMin = int.MaxValue; + private int m_yMin = int.MaxValue; + + private int m_xMax = int.MinValue; + private int m_yMax = int.MinValue; + + public NodeGrid() + { + m_grid = new Dictionary<int, Dictionary<int, List<ParentNode>>>(); + } + + public void AddNodeToGrid( ParentNode node ) + { + Rect pos = node.Position; + if ( Mathf.Abs( pos.width ) < 0.001f || Mathf.Abs( pos.height ) < 0.001f ) + { + return; + } + + float initialXf = pos.x / GRID_SIZE_X; + float initialYf = pos.y / GRID_SIZE_Y; + + int endX = Mathf.CeilToInt( initialXf + pos.width / GRID_SIZE_X ); + int endY = Mathf.CeilToInt( initialYf + pos.height / GRID_SIZE_Y ); + + int initialX = Mathf.FloorToInt( initialXf ); + int initialY = Mathf.FloorToInt( initialYf ); + + + if ( initialX < m_xMin ) + { + m_xMin = initialX; + } + + if ( initialY < m_yMin ) + { + m_yMin = initialY; + } + + if ( endX > m_xMax ) + { + m_xMax = endX; + } + + if ( endY > m_yMax ) + { + m_yMax = endY; + } + + for ( int x = initialX; x < endX; x += 1 ) + { + for ( int y = initialY; y < endY; y += 1 ) + { + if ( !m_grid.ContainsKey( x ) ) + { + m_grid.Add( x, new Dictionary<int, List<ParentNode>>() ); + + } + + if ( !m_grid[ x ].ContainsKey( y ) ) + { + m_grid[ x ].Add( y, new List<ParentNode>() ); + } + + m_grid[ x ][ y ].Add( node ); + } + } + node.IsOnGrid = true; + //DebugLimits(); + } + + public void RemoveNodeFromGrid( ParentNode node, bool useCachedPos ) + { + Rect pos = useCachedPos ? node.CachedPos : node.Position; + if ( Mathf.Abs( pos.width ) < 0.001f || Mathf.Abs( pos.height ) < 0.001f ) + { + return; + } + + float initialXf = pos.x / GRID_SIZE_X; + float initialYf = pos.y / GRID_SIZE_Y; + + int endX = Mathf.CeilToInt( initialXf + pos.width / GRID_SIZE_X ); + int endY = Mathf.CeilToInt( initialYf + pos.height / GRID_SIZE_Y ); + + int initialX = Mathf.FloorToInt( initialXf ); + int initialY = Mathf.FloorToInt( initialYf ); + bool testLimits = false; + + int xMinCount = 0; + int xMaxCount = 0; + + int yMinCount = 0; + int yMaxCount = 0; + + + for ( int x = initialX; x < endX; x += 1 ) + { + for ( int y = initialY; y < endY; y += 1 ) + { + if ( m_grid.ContainsKey( x ) ) + { + if ( m_grid[ x ].ContainsKey( y ) ) + { + m_grid[ x ][ y ].Remove( node ); + node.IsOnGrid = false; + + if ( initialX == m_xMin && x == initialX ) + { + testLimits = true; + if ( m_grid[ x ][ y ].Count != 0 ) + { + xMinCount += 1; + } + } + + if ( endX == m_xMax && x == endX ) + { + testLimits = true; + if ( m_grid[ x ][ y ].Count != 0 ) + { + xMaxCount += 1; + } + } + + if ( initialY == m_yMin && y == initialY ) + { + testLimits = true; + if ( m_grid[ x ][ y ].Count != 0 ) + { + yMinCount += 1; + } + } + + if ( endY == m_yMax && y == endY ) + { + testLimits = true; + if ( m_grid[ x ][ y ].Count != 0 ) + { + yMaxCount += 1; + } + } + } + } + } + } + + + if ( testLimits ) + { + if ( xMinCount == 0 || xMaxCount == 0 || yMinCount == 0 || yMaxCount == 0 ) + { + m_xMin = int.MaxValue; + m_yMin = int.MaxValue; + + m_xMax = int.MinValue; + m_yMax = int.MinValue; + foreach ( KeyValuePair<int, Dictionary<int, List<ParentNode>>> entryX in m_grid ) + { + foreach ( KeyValuePair<int, List<ParentNode>> entryY in entryX.Value ) + { + if ( entryY.Value.Count > 0 ) + { + if ( entryX.Key < m_xMin ) + { + m_xMin = entryX.Key; + } + + if ( entryY.Key < m_yMin ) + { + m_yMin = entryY.Key; + } + + if ( entryX.Key > m_xMax ) + { + m_xMax = entryX.Key; + } + + if ( entryY.Key > m_yMax ) + { + m_yMax = entryY.Key; + } + } + } + } + // The += 1 is to maintain consistence with AddNodeToGrid() ceil op on max values + m_xMax += 1; + m_yMax += 1; + } + } + //DebugLimits(); + } + + public void DebugLimits() + { + Debug.Log( "[ " + m_xMin + " , " + m_yMin + " ] " + "[ " + m_xMax + " , " + m_yMax + " ] " ); + } + + //pos must be the transformed mouse position to local canvas coordinates + public List<ParentNode> GetNodesOn( Vector2 pos ) + { + int x = Mathf.FloorToInt( pos.x / GRID_SIZE_X ); + int y = Mathf.FloorToInt( pos.y / GRID_SIZE_Y ); + + if ( m_grid.ContainsKey( x ) ) + { + if ( m_grid[ x ].ContainsKey( y ) ) + { + return m_grid[ x ][ y ]; + } + } + + return null; + } + + public List<ParentNode> GetNodesOn( int x, int y ) + { + if ( m_grid.ContainsKey( x ) ) + { + if ( m_grid[ x ].ContainsKey( y ) ) + { + return m_grid[ x ][ y ]; + } + } + return null; + } + + public void DrawGrid( DrawInfo drawInfo ) + { + if ( m_debugGrid ) + { + Handles.CircleHandleCap( 0, drawInfo.InvertedZoom * ( new Vector3( drawInfo.CameraOffset.x, drawInfo.CameraOffset.y, 0f ) ), Quaternion.identity, 5,EventType.Layout ); + for ( int x = -( int ) GRID_AREA_X; x < GRID_AREA_X; x += ( int ) GRID_SIZE_X ) + { + Handles.DrawLine( drawInfo.InvertedZoom * ( new Vector3( x + drawInfo.CameraOffset.x, drawInfo.CameraOffset.y - GRID_AREA_Y, 0 ) ), drawInfo.InvertedZoom * ( new Vector3( drawInfo.CameraOffset.x + x, drawInfo.CameraOffset.y + GRID_AREA_Y, 0 ) ) ); + } + + for ( int y = -( int ) GRID_AREA_Y; y < GRID_AREA_X; y += ( int ) GRID_SIZE_Y ) + { + Handles.DrawLine( drawInfo.InvertedZoom * ( new Vector3( drawInfo.CameraOffset.x - GRID_AREA_X, drawInfo.CameraOffset.y + y, 0 ) ), drawInfo.InvertedZoom * ( new Vector3( drawInfo.CameraOffset.x + GRID_AREA_X, drawInfo.CameraOffset.y + y, 0 ) ) ); + } + } + } + + public void Destroy() + { + foreach ( KeyValuePair<int, Dictionary<int, List<ParentNode>>> entryX in m_grid ) + { + foreach ( KeyValuePair<int, List<ParentNode>> entryY in entryX.Value ) + { + entryY.Value.Clear(); + } + entryX.Value.Clear(); + } + m_grid.Clear(); + } + + public float MaxNodeDist + { + get { return Mathf.Max( ( m_xMax - m_xMin )*GRID_SIZE_X, ( m_yMax - m_yMin )*GRID_SIZE_Y ); } + } + } +} |