| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618 | 
							- // Amplify Shader Editor - Visual Shader Editing Tool
 
- // Copyright (c) Amplify Creations, Lda <info@amplify.pt>
 
- using System;
 
- using UnityEditor;
 
- using UnityEngine;
 
- namespace AmplifyShaderEditor
 
- {
 
- 	[Serializable]
 
- 	[NodeAttributes( "Voronoi", "Miscellaneous", "Voronoi", Tags = "noise" )]
 
- 	public sealed class VoronoiNode : ParentNode
 
- 	{
 
- 		// Unity Voronoi
 
- 		private readonly string UnityVoronoiNoiseFunc = "UnityVoronoi({0},{1},{2},{3})";
 
- 		private readonly string[] UnityVoroniNoiseFunctionsBody =
 
- 		{
 
- 			"inline float2 UnityVoronoiRandomVector( float2 UV, float offset )\n",
 
- 			"{\n",
 
- 			"\tfloat2x2 m = float2x2( 15.27, 47.63, 99.41, 89.98 );\n",
 
- 			"\tUV = frac( sin(mul(UV, m) ) * 46839.32 );\n",
 
- 			"\treturn float2( sin(UV.y* +offset ) * 0.5 + 0.5, cos( UV.x* offset ) * 0.5 + 0.5 );\n",
 
- 			"}\n",
 
- 			"\n",
 
- 			"//x - Out y - Cells\n",
 
- 			"float3 UnityVoronoi( float2 UV, float AngleOffset, float CellDensity, inout float2 mr )\n",
 
- 			"{\n",
 
- 			"\tfloat2 g = floor( UV * CellDensity );\n",
 
- 			"\tfloat2 f = frac( UV * CellDensity );\n",
 
- 			"\tfloat t = 8.0;\n",
 
- 			"\tfloat3 res = float3( 8.0, 0.0, 0.0 );\n",
 
- 			"\n",
 
- 			"\tfor( int y = -1; y <= 1; y++ )\n",
 
- 			"\t{\n",
 
- 			"\t	for( int x = -1; x <= 1; x++ )\n",
 
- 			"\t	{\n",
 
- 			"\t\t\tfloat2 lattice = float2( x, y );\n",
 
- 			"\t\t\tfloat2 offset = UnityVoronoiRandomVector( lattice + g, AngleOffset );\n",
 
- 			"\t\t\tfloat d = distance( lattice + offset, f );\n",
 
- 			"\n",
 
- 			"\t\t\tif( d < res.x )\n",
 
- 			"\t\t\t{\n",
 
- 			"\t\t\t\tmr = f - lattice - offset;\n",
 
- 			"\t\t\t\tres = float3( d, offset.x, offset.y );\n",
 
- 			"\t\t\t}\n",
 
- 			"\t	}\n",
 
- 			"\t}\n",
 
- 			"\treturn res;\n",
 
- 			"}\n",
 
- 		};
 
- 		////////////
 
- 		private const string VoronoiHashHeader = "float2 voronoihash{0}( float2 p )";
 
- 		private readonly string[] VoronoiHashBody = { "p = p - 2 * floor( p / 2 );",
 
- 			"p = float2( dot( p, float2( 127.1, 311.7 ) ), dot( p, float2( 269.5, 183.3 ) ) );",
 
- 			"return frac( sin( p ) *43758.5453);" };
 
- 		private const string VoronoiHeader = "float voronoi{0}( float2 v, float time, inout float2 id, inout float2 mr, float smoothness, inout float2 smoothId )";
 
- 		private const string VoronoiFunc = "voronoi{0}( {1}, {2}, {3}, {4}, {5}, {6} )";
 
- 		private string[] VoronoiBody = 
 
- 		{
 
- 			"float2 n = floor( v );",
 
- 			"float2 f = frac( v );",
 
- 			"float F1 = 8.0;",
 
- 			"float F2 = 8.0; float2 mg = 0;",
 
- 			"for ( int j = -1; j <= 1; j++ )",
 
- 			"{",
 
- 			" \tfor ( int i = -1; i <= 1; i++ )",
 
- 			" \t{",
 
- 			" \t\tfloat2 g = float2( i, j );",
 
- 			" \t\tfloat2 o = voronoihash{0}( n + g );",
 
- 			" \t\tfloat2 r = f - g - ( sin( 0 + o * 6.2831 ) * 0.5 + 0.5 );",
 
- 			" \t\tfloat d = dot( r, r );",
 
- 			" \t\tif( d<F1 ) {",//12
 
- 			" \t\t\tF2 = F1;",//13
 
- 			" \t\t\tF1 = d; mg = g; mr = r; id = o;",//14
 
- 			" \t\t} else if( d<F2 ) {",//15
 
- 			" \t\t\tF2 = d;",//16
 
- 			"",//this is where we inject smooth Id
 
- 			" \t\t}" ,//18
 
- 			" \t}",
 
- 			"}",
 
- 			"return F1;"
 
- 		};
 
- 		
 
- 		private string VoronoiDistanceBody =
 
- 			"\nF1 = 8.0;" +
 
- 			"\nfor ( int j = -2; j <= 2; j++ )" +
 
- 			"\n{{" +
 
- 			"\nfor ( int i = -2; i <= 2; i++ )" +
 
- 			"\n{{" +
 
- 			"\nfloat2 g = mg + float2( i, j );" +
 
- 			"\nfloat2 o = voronoihash{1}( n + g );" +
 
- 			"\n{0}" +
 
- 			"\nfloat d = dot( 0.5 * ( r + mr ), normalize( r - mr ) );" +
 
- 			"\nF1 = min( F1, d );" +
 
- 			"\n}}" +
 
- 			"\n}}" +
 
- 			"\nreturn F1;";
 
- 		[SerializeField]
 
- 		private int m_distanceFunction = 0;
 
- 		[SerializeField]
 
- 		private float m_minkowskiPower = 1;
 
- 		[SerializeField]
 
- 		private int m_functionType = 0;
 
- 		[SerializeField]
 
- 		private int m_octaves = 1;
 
- 		[SerializeField]
 
- 		private bool m_tileable = false;
 
- 		[SerializeField]
 
- 		private int m_tileScale = 1;
 
- 		[SerializeField]
 
- 		private bool m_useUnity = false;
 
- 		[SerializeField]
 
- 		private bool m_calculateSmoothValue = false;
 
- 		[SerializeField]
 
- 		private bool m_applySmoothToIds = false;
 
- 		private const string FunctionTypeStr = "Method";//"Function Type";
 
- 		private readonly string[] m_functionTypeStr = { "Cells", "Crystal", "Glass", "Caustic", "Distance" };
 
- 		private const string DistanceFunctionLabelStr = "Distance Function";
 
- 		private readonly string[] m_distanceFunctionStr = { "Euclidean\u00B2", "Euclidean", "Manhattan", "Chebyshev", "Minkowski" };
 
- 		[SerializeField]
 
- 		private int m_searchQuality = 0;
 
- 		private const string SearchQualityLabelStr = "Search Quality";
 
- 		private readonly string[] m_searchQualityStr = { "9 Cells", "25 Cells", "49 Cells" };
 
- 		private const string UseTileScaleStr = "_UseTileScale";
 
- 		private const string TileScaleStr = "_TileScale";
 
- 		private const string MinkowskiPowerStr = "_MinkowskiPower";
 
- 		private const string DistFuncStr = "_DistFunc";
 
- 		private const string MethodTypeStr = "_MethodType";
 
- 		private const string SearchQualityStr = "_SearchQuality";
 
- 		private const string OctavesStr = "_Octaves";
 
- 		private const string UseSmoothnessStr = "_UseSmoothness";
 
- 		private int m_UseTileScaleId;
 
- 		private int m_TileScaleId;
 
- 		private int m_MinkowskiPowerId;
 
- 		private int m_DistFuncId;
 
- 		private int m_MethodTypeId;
 
- 		private int m_SearchQualityId;
 
- 		private int m_OctavesId;
 
- 		private int m_UseSmoothnessId;
 
- 		private int m_cachedUvsId = -1;
 
- 		protected override void CommonInit( int uniqueId )
 
- 		{
 
- 			base.CommonInit( uniqueId );
 
- 			AddInputPort( WirePortDataType.FLOAT2, false, "UV" );
 
- 			AddInputPort( WirePortDataType.FLOAT, false, "Angle" );
 
- 			AddInputPort( WirePortDataType.FLOAT, false, "Scale" );
 
- 			AddInputPort( WirePortDataType.FLOAT, false, "Smoothness" );
 
- 			m_inputPorts[ 1 ].AutoDrawInternalData = true;
 
- 			m_inputPorts[ 2 ].AutoDrawInternalData = true;
 
- 			m_inputPorts[ 2 ].FloatInternalData = 1;
 
- 			AddOutputPort( WirePortDataType.FLOAT, "Out" );
 
- 			AddOutputPort( WirePortDataType.FLOAT2, "ID" );
 
- 			AddOutputPort( WirePortDataType.FLOAT2, "UV" );
 
- 			m_textLabelWidth = 120;
 
- 			//m_useInternalPortData = true;
 
- 			m_autoWrapProperties = true;
 
- 			m_previewShaderGUID = "bc1498ccdade442479038b24982fc946";
 
- 			ChangePorts();
 
- 			ChechSmoothPorts();
 
- 		}
 
- 		void ChechSmoothPorts()
 
- 		{
 
- 			m_inputPorts[ 3 ].Visible = !m_useUnity && m_calculateSmoothValue && (m_functionType == 0) ;
 
- 			m_sizeIsDirty = true;
 
- 		}
 
- 		void ChangePorts()
 
- 		{
 
- 			m_previewMaterialPassId = 0;
 
- 		}
 
- 		public override void OnEnable()
 
- 		{
 
- 			base.OnEnable();
 
- 			m_UseTileScaleId = Shader.PropertyToID( UseTileScaleStr );
 
- 			m_TileScaleId = Shader.PropertyToID( TileScaleStr );
 
- 			m_MinkowskiPowerId = Shader.PropertyToID( MinkowskiPowerStr );
 
- 			m_DistFuncId = Shader.PropertyToID( DistFuncStr );
 
- 			m_MethodTypeId = Shader.PropertyToID( MethodTypeStr );
 
- 			m_SearchQualityId = Shader.PropertyToID( SearchQualityStr );
 
- 			m_OctavesId = Shader.PropertyToID( OctavesStr );
 
- 			m_UseSmoothnessId = Shader.PropertyToID( UseSmoothnessStr );
 
- 		}
 
- 		public override void SetPreviewInputs()
 
- 		{
 
- 			base.SetPreviewInputs();
 
- 			if( m_cachedUvsId == -1 )
 
- 				m_cachedUvsId = Shader.PropertyToID( "_CustomUVs" );
 
- 			PreviewMaterial.SetInt( m_cachedUvsId, ( m_inputPorts[ 0 ].IsConnected ? 1 : 0 ) );
 
- 			m_previewMaterialPassId = m_useUnity ? 0 : 1;
 
- 			if( !m_useUnity )
 
- 			{
 
- 				PreviewMaterial.SetInt( m_SearchQualityId, m_searchQuality + 1 );
 
- 				if( m_functionType == 4)
 
- 				{
 
- 					PreviewMaterial.SetInt( m_DistFuncId, 0 );
 
- 				} else
 
- 				{
 
- 					PreviewMaterial.SetInt( m_DistFuncId, m_distanceFunction );
 
- 				}
 
- 				if( m_distanceFunction == 4 )
 
- 				{
 
- 					PreviewMaterial.SetFloat( m_MinkowskiPowerId, m_minkowskiPower );
 
- 				}
 
- 				PreviewMaterial.SetInt( m_MethodTypeId, m_functionType );
 
- 				int smoothnessValue = m_calculateSmoothValue ? 1 : 0;
 
- 				PreviewMaterial.SetInt( m_UseSmoothnessId, smoothnessValue );
 
- 				PreviewMaterial.SetFloat( m_UseTileScaleId, m_tileable ? 1.0f : 0.0f );
 
- 				if( m_tileable )
 
- 					PreviewMaterial.SetInt( m_TileScaleId, m_tileScale );
 
- 				PreviewMaterial.SetInt( m_OctavesId, m_octaves );
 
- 			}
 
- 		}
 
- 		public override void RenderNodePreview()
 
- 		{
 
- 			//Runs at least one time
 
- 			if( !m_initialized )
 
- 			{
 
- 				// nodes with no preview don't update at all
 
- 				PreviewIsDirty = false;
 
- 				return;
 
- 			}
 
- 			if( !PreviewIsDirty )
 
- 				return;
 
- 			SetPreviewInputs();
 
- 			if( !Preferences.User.DisablePreviews )
 
- 			{
 
- 				RenderTexture temp = RenderTexture.active;
 
- 				RenderTexture.active = m_outputPorts[ 0 ].OutputPreviewTexture;
 
- 				PreviewMaterial.SetInt( "_PreviewID" , 0 );
 
- 				Graphics.Blit( null , m_outputPorts[ 0 ].OutputPreviewTexture , PreviewMaterial , m_previewMaterialPassId );
 
- 				RenderTexture.active = m_outputPorts[ 1 ].OutputPreviewTexture;
 
- 				PreviewMaterial.SetInt( "_PreviewID" , 1 );
 
- 				Graphics.Blit( null , m_outputPorts[ 1 ].OutputPreviewTexture , PreviewMaterial , m_previewMaterialPassId );
 
- 				RenderTexture.active = m_outputPorts[ 2 ].OutputPreviewTexture;
 
- 				PreviewMaterial.SetInt( "_PreviewID" , 2 );
 
- 				Graphics.Blit( null , m_outputPorts[ 2 ].OutputPreviewTexture , PreviewMaterial , m_previewMaterialPassId );
 
- 				RenderTexture.active = temp;
 
- 			}
 
- 			PreviewIsDirty = m_continuousPreviewRefresh;
 
- 			FinishPreviewRender = true;
 
- 		}
 
- 		public override void DrawProperties()
 
- 		{
 
- 			base.DrawProperties();
 
- 			EditorGUI.BeginChangeCheck();
 
- 			{
 
- 				EditorGUI.BeginDisabledGroup( m_useUnity );
 
- 				{
 
- 					EditorGUI.BeginChangeCheck();
 
- 					m_functionType = EditorGUILayoutPopup( FunctionTypeStr, m_functionType, m_functionTypeStr );
 
- 					if( EditorGUI.EndChangeCheck() )
 
- 					{
 
- 						ChechSmoothPorts();
 
- 					}
 
- 					EditorGUI.BeginDisabledGroup( m_functionType == 4 );
 
- 					m_distanceFunction = EditorGUILayoutPopup( DistanceFunctionLabelStr, m_distanceFunction, m_distanceFunctionStr );
 
- 					if( m_distanceFunction == 4 )
 
- 					{
 
- 						m_minkowskiPower = EditorGUILayoutSlider( "Minkowski Power", m_minkowskiPower, 1, 5 );
 
- 					}
 
- 					EditorGUI.EndDisabledGroup();
 
- 					m_searchQuality = EditorGUILayoutPopup( SearchQualityLabelStr, m_searchQuality, m_searchQualityStr );
 
- 					m_octaves = EditorGUILayoutIntSlider( "Octaves", m_octaves, 1, 8 );
 
- 					m_tileable = EditorGUILayoutToggle( "Tileable", m_tileable );
 
- 					EditorGUI.BeginDisabledGroup( !m_tileable );
 
- 					m_tileScale = EditorGUILayoutIntField( "Tile Scale", m_tileScale );
 
- 					EditorGUI.EndDisabledGroup();
 
- 					//Only smoothing cells type for now
 
- 					if( m_functionType == 0 )
 
- 					{
 
- 						EditorGUI.BeginChangeCheck();
 
- 						m_calculateSmoothValue = EditorGUILayoutToggle( "Smooth", m_calculateSmoothValue );
 
- 						if( EditorGUI.EndChangeCheck() )
 
- 						{
 
- 							ChechSmoothPorts();
 
- 						}
 
- 						if( m_calculateSmoothValue )
 
- 						{
 
- 							m_applySmoothToIds = EditorGUILayoutToggle( "  Apply To ID" , m_applySmoothToIds );
 
- 						}
 
- 					}
 
- 				}
 
- 				EditorGUI.EndDisabledGroup();
 
- 				EditorGUI.BeginChangeCheck();
 
- 				m_useUnity = EditorGUILayoutToggle( "Unity's Voronoi", m_useUnity );
 
- 				if( EditorGUI.EndChangeCheck() )
 
- 				{
 
- 					ChangePorts();
 
- 					ChechSmoothPorts();
 
- 				}
 
- 			}
 
- 			if( EditorGUI.EndChangeCheck() )
 
- 			{
 
- 				PreviewIsDirty = true;
 
- 			}
 
- 			NodeUtils.DrawPropertyGroup( ref m_internalDataFoldout, Constants.InternalDataLabelStr, () =>
 
- 			{
 
- 				for( int i = 0; i < m_inputPorts.Count; i++ )
 
- 				{
 
- 					if( m_inputPorts[ i ].ValidInternalData && !m_inputPorts[ i ].IsConnected && m_inputPorts[ i ].Visible && m_inputPorts[ i ].AutoDrawInternalData )
 
- 					{
 
- 						m_inputPorts[ i ].ShowInternalData( this );
 
- 					}
 
- 				}
 
- 			} );
 
- 		}
 
- 		void ChangeFunction( string scale )
 
- 		{
 
- 			VoronoiBody[ 10 ] = "\t\to = ( sin( time + o * 6.2831 ) * 0.5 + 0.5 ); float2 r = f - g - o;";
 
- 			int q = m_searchQuality + 1;
 
- 			VoronoiBody[ 4 ] = "for ( int j = -" + q + "; j <= " + q + "; j++ )";
 
- 			VoronoiBody[ 6 ] = "\tfor ( int i = -" + q + "; i <= " + q + "; i++ )";
 
- 			int dFunction = m_distanceFunction;
 
- 			if( m_functionType == 4 )
 
- 				dFunction = 0;
 
- 			switch( dFunction )
 
- 			{
 
- 				default:
 
- 				case 0:
 
- 				VoronoiBody[ 11 ] = "\t\tfloat d = 0.5 * dot( r, r );";
 
- 				break;
 
- 				case 1:
 
- 				VoronoiBody[ 11 ] = "\t\tfloat d = 0.707 * sqrt(dot( r, r ));";
 
- 				break;
 
- 				case 2:
 
- 				VoronoiBody[ 11 ] = "\t\tfloat d = 0.5 * ( abs(r.x) + abs(r.y) );";
 
- 				break;
 
- 				case 3:
 
- 				VoronoiBody[ 11 ] = "\t\tfloat d = max(abs(r.x), abs(r.y));";
 
- 				break;
 
- 				case 4:
 
- 				VoronoiBody[ 11 ] = "\t\tfloat d = " + ( 1 / Mathf.Pow( 2, 1 / m_minkowskiPower ) ).ToString( "n3" ) + " * pow( ( pow( abs( r.x ), " + m_minkowskiPower + " ) + pow( abs( r.y ), " + m_minkowskiPower + " ) ), " + ( 1 / m_minkowskiPower ).ToString( "n3" ) + " );";
 
- 				break;
 
- 			}
 
- 			if( m_functionType == 0 )
 
- 			{
 
- 				if( m_calculateSmoothValue )
 
- 				{
 
- 					VoronoiBody[ 12 ] = " //\t\tif( d<F1 ) {";
 
- 					VoronoiBody[ 13 ] = " //\t\t\tF2 = F1;";
 
- 					VoronoiBody[ 14 ] = " \t\t\tfloat h = smoothstep(0.0, 1.0, 0.5 + 0.5 * (F1 - d) / smoothness); F1 = lerp(F1, d, h) - smoothness * h * (1.0 - h);mg = g; mr = r; id = o;";
 
- 					VoronoiBody[ 15 ] = " //\t\t} else if( d<F2 ) {";
 
- 					VoronoiBody[ 16 ] = " //\t\t\tF2 = d;";
 
- 					VoronoiBody[ 17 ] = m_applySmoothToIds? "\t\t\tfloat correctionFactor = smoothness * h * (1.0f - h) / ( 1.0f + 3.0f * smoothness ); smoothId = lerp( smoothId,id, h ) - correctionFactor;":string.Empty;
 
- 					VoronoiBody[ 18 ] = " //\t\t}";
 
- 				}
 
- 				else
 
- 				{
 
- 					VoronoiBody[ 12 ] = " \t\tif( d<F1 ) {";
 
- 					VoronoiBody[ 13 ] = " \t\t\tF2 = F1;";
 
- 					VoronoiBody[ 14 ] = " \t\t\tF1 = d; mg = g; mr = r; id = o;";
 
- 					VoronoiBody[ 15 ] = " \t\t} else if( d<F2 ) {";
 
- 					VoronoiBody[ 16 ] = " \t\t\tF2 = d;";
 
- 					VoronoiBody[ 17 ] = string.Empty;
 
- 					VoronoiBody[ 18 ] = " \t\t}";
 
- 				}
 
- 				
 
- 				
 
- 			}
 
- 			else
 
- 			{
 
- 				VoronoiBody[ 12 ] = " \t\tif( d<F1 ) {";
 
- 				VoronoiBody[ 13 ] = " \t\t\tF2 = F1;";
 
- 				VoronoiBody[ 14 ] = " \t\t\tF1 = d; mg = g; mr = r; id = o;";
 
- 				VoronoiBody[ 15 ] = " \t\t} else if( d<F2 ) {";
 
- 				VoronoiBody[ 16 ] = " \t\t\tF2 = d;";
 
- 				VoronoiBody[ 17 ] = string.Empty;
 
- 				VoronoiBody[ 18 ] = " \t\t}";
 
- 			}
 
- 			switch( m_functionType )
 
- 			{
 
- 				default:
 
- 				case 0:
 
- 				VoronoiBody[ 21 ] = "return F1;";
 
- 				break;
 
- 				case 1:
 
- 				VoronoiBody[ 21 ] = "return F2;";
 
- 				break;
 
- 				case 2:
 
- 				VoronoiBody[ 21 ] = "return F2 - F1;";
 
- 				break;
 
- 				case 3:
 
- 				VoronoiBody[ 21 ] = "return (F2 + F1) * 0.5;";
 
- 				break;
 
- 				case 4:
 
- 				VoronoiBody[ 21 ] = string.Format( VoronoiDistanceBody , VoronoiBody[ 10 ], OutputId );
 
- 				break;
 
- 			}
 
- 			if( m_tileable )
 
- 			{
 
- 				VoronoiHashBody[ 0 ] = "p = p - " + m_tileScale + " * floor( p / " + m_tileScale + " );";
 
- 			}
 
- 			else
 
- 			{
 
- 				VoronoiHashBody[ 0 ] = "";
 
- 			}
 
- 		}
 
- 		public override string GenerateShaderForOutput( int outputId, ref MasterNodeDataCollector dataCollector, bool ignoreLocalvar )
 
- 		{
 
- 			if( m_outputPorts[ outputId ].IsLocalValue( dataCollector.PortCategory ) )
 
- 			{
 
- 				return m_outputPorts[ outputId ].LocalValue( dataCollector.PortCategory );
 
- 			}
 
- 			if( m_useUnity )
 
- 			{
 
- 				string uvValue = string.Empty;
 
- 				if( m_inputPorts[ 0 ].IsConnected )
 
- 					uvValue = m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector );
 
- 				else
 
- 				{
 
- 					if( dataCollector.IsTemplate )
 
- 						uvValue = dataCollector.TemplateDataCollectorInstance.GenerateAutoUVs( 0 );
 
- 					else
 
- 						uvValue = GeneratorUtils.GenerateAutoUVs( ref dataCollector, UniqueId, 0 );
 
- 				}
 
- 				string angleOffset = m_inputPorts[ 1 ].GeneratePortInstructions( ref dataCollector );
 
- 				string cellDensity = m_inputPorts[ 2 ].GeneratePortInstructions( ref dataCollector );
 
- 				dataCollector.AddLocalVariable( UniqueId, string.Format( "float2 uv{0} = 0;", OutputId ) );
 
- 				dataCollector.AddFunction( UnityVoroniNoiseFunctionsBody[ 0 ], UnityVoroniNoiseFunctionsBody, false );
 
- 				string varName = "unityVoronoy" + OutputId;
 
- 				string varValue = string.Format( UnityVoronoiNoiseFunc, uvValue, angleOffset, cellDensity, "uv" + OutputId );
 
- 				dataCollector.AddLocalVariable( UniqueId, CurrentPrecisionType, WirePortDataType.FLOAT3, varName, varValue );
 
- 				m_outputPorts[ 0 ].SetLocalValue( varName + ".x", dataCollector.PortCategory );
 
- 				m_outputPorts[ 1 ].SetLocalValue( varName + ".yz", dataCollector.PortCategory );
 
- 				m_outputPorts[ 2 ].SetLocalValue( "uv" + OutputId, dataCollector.PortCategory );
 
- 				return m_outputPorts[ outputId ].LocalValue( dataCollector.PortCategory );
 
- 			}
 
- 			else
 
- 			{
 
- 				string scaleValue = m_inputPorts[ 2 ].GeneratePortInstructions( ref dataCollector );
 
- 				string timeVarValue = m_inputPorts[ 1 ].GeneratePortInstructions( ref dataCollector );
 
- 				string timeVarName = "time" + OutputId;
 
- 				dataCollector.AddLocalVariable( UniqueId, CurrentPrecisionType, WirePortDataType.FLOAT, timeVarName, timeVarValue );
 
- 				ChangeFunction( scaleValue );
 
- 				string voronoiHashFunc = string.Empty;
 
- 				string VoronoiHashHeaderFormatted = string.Format( VoronoiHashHeader, OutputId );
 
- 				IOUtils.AddFunctionHeader( ref voronoiHashFunc, VoronoiHashHeaderFormatted );
 
- 				for( int i = 0; i < VoronoiHashBody.Length; i++ )
 
- 				{
 
- 					IOUtils.AddFunctionLine( ref voronoiHashFunc, VoronoiHashBody[ i ] );
 
- 				}
 
- 				IOUtils.CloseFunctionBody( ref voronoiHashFunc );
 
- 				dataCollector.AddFunction( VoronoiHashHeaderFormatted, voronoiHashFunc );
 
- 				string smoothnessName = "0";
 
- 				//need to add a local value to send to function since its an inout and sending a numeric value to it generates a compilation error
 
- 				string smoothIdName = "voronoiSmoothId" + OutputId;
 
- 				dataCollector.AddLocalVariable( UniqueId , CurrentPrecisionType , WirePortDataType.FLOAT2 , smoothIdName , "0" );
 
- 				if( m_calculateSmoothValue )
 
- 				{
 
- 					smoothnessName = "voronoiSmooth" + OutputId;
 
- 					string smoothnessValue = m_inputPorts[ 3 ].GeneratePortInstructions( ref dataCollector );
 
- 					dataCollector.AddLocalVariable( UniqueId, CurrentPrecisionType, WirePortDataType.FLOAT, smoothnessName, smoothnessValue );
 
- 				}
 
- 				string voronoiFunc = string.Empty;
 
- 				IOUtils.AddFunctionHeader( ref voronoiFunc, string.Format( VoronoiHeader, OutputId ) );
 
- 				for( int i = 0; i < VoronoiBody.Length; i++ )
 
- 				{
 
- 					if( i == 9 )
 
- 					{
 
- 						IOUtils.AddFunctionLine( ref voronoiFunc, string.Format( VoronoiBody[ i ],OutputId ) );
 
- 					}
 
- 					else
 
- 					{
 
- 						IOUtils.AddFunctionLine( ref voronoiFunc, VoronoiBody[ i ] );
 
- 					}
 
- 				}
 
- 				IOUtils.CloseFunctionBody( ref voronoiFunc );
 
- 				dataCollector.AddFunction( string.Format( VoronoiHeader, OutputId ), voronoiFunc );
 
- 				string uvs = string.Empty;
 
- 				if( m_inputPorts[ 0 ].IsConnected )
 
- 					uvs = m_inputPorts[ 0 ].GeneratePortInstructions( ref dataCollector );
 
- 				else
 
- 				{
 
- 					if( dataCollector.IsTemplate )
 
- 					{
 
- 						uvs = dataCollector.TemplateDataCollectorInstance.GenerateAutoUVs( 0 );
 
- 					}
 
- 					else
 
- 					{
 
- 						uvs = GeneratorUtils.GenerateAutoUVs( ref dataCollector, UniqueId, 0 );
 
- 					}
 
- 				}
 
- 				dataCollector.AddLocalVariable( UniqueId, string.Format( "float2 coords{0} = {1} * {2};", OutputId, uvs, scaleValue ) );
 
- 				dataCollector.AddLocalVariable( UniqueId, string.Format( "float2 id{0} = 0;", OutputId ) );
 
- 				dataCollector.AddLocalVariable( UniqueId, string.Format( "float2 uv{0} = 0;", OutputId ) );
 
- 				if( m_octaves == 1 )
 
- 				{
 
- 					dataCollector.AddLocalVariable( UniqueId, string.Format( "float voroi{0} = {1};", OutputId, string.Format( VoronoiFunc, OutputId, "coords" + OutputId,timeVarName, "id"+ OutputId, "uv" + OutputId, smoothnessName , smoothIdName ) ) );
 
- 				}
 
- 				else
 
- 				{
 
- 					dataCollector.AddLocalVariable( UniqueId, string.Format( "float fade{0} = 0.5;", OutputId ) );
 
- 					dataCollector.AddLocalVariable( UniqueId, string.Format( "float voroi{0} = 0;", OutputId ) );
 
- 					dataCollector.AddLocalVariable( UniqueId, string.Format( "float rest{0} = 0;", OutputId ) );
 
- 					dataCollector.AddLocalVariable( UniqueId, string.Format( "for( int it{0} = 0; it{0} <" + m_octaves + "; it{0}++ ){{", OutputId)  );
 
- 					dataCollector.AddLocalVariable( UniqueId, string.Format( "voroi{0} += fade{0} * voronoi{0}( coords{0}, time{0}, id{0}, uv{0}, {1},{2} );", OutputId, smoothnessName, smoothIdName ) );
 
- 					dataCollector.AddLocalVariable( UniqueId, string.Format( "rest{0} += fade{0};", OutputId ) );
 
- 					dataCollector.AddLocalVariable( UniqueId, string.Format( "coords{0} *= 2;", OutputId ) );
 
- 					dataCollector.AddLocalVariable( UniqueId, string.Format( "fade{0} *= 0.5;", OutputId ) );
 
- 					dataCollector.AddLocalVariable( UniqueId, "}" + "//Voronoi" + OutputId );
 
- 					dataCollector.AddLocalVariable( UniqueId, string.Format( "voroi{0} /= rest{0};", OutputId ) );
 
- 				}
 
- 				m_outputPorts[ 0 ].SetLocalValue( "voroi" + OutputId, dataCollector.PortCategory );
 
- 				
 
- 				m_outputPorts[ 1 ].SetLocalValue( ( m_functionType == 0 && m_calculateSmoothValue && m_applySmoothToIds ) ? smoothIdName : ( "id" + OutputId ), dataCollector.PortCategory );
 
- 				m_outputPorts[ 2 ].SetLocalValue( "uv" + OutputId, dataCollector.PortCategory );
 
- 				return m_outputPorts[ outputId ].LocalValue( dataCollector.PortCategory );
 
- 			}
 
- 		}
 
- 		public override void ReadFromString( ref string[] nodeParams )
 
- 		{
 
- 			base.ReadFromString( ref nodeParams );
 
- 			m_searchQuality = Convert.ToInt32( GetCurrentParam( ref nodeParams ) );
 
- 			m_distanceFunction = Convert.ToInt32( GetCurrentParam( ref nodeParams ) );
 
- 			m_minkowskiPower = Convert.ToSingle( GetCurrentParam( ref nodeParams ) );
 
- 			m_functionType = Convert.ToInt32( GetCurrentParam( ref nodeParams ) );
 
- 			m_octaves = Convert.ToInt32( GetCurrentParam( ref nodeParams ) );
 
- 			m_tileable = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) );
 
- 			m_tileScale = Convert.ToInt32( GetCurrentParam( ref nodeParams ) );
 
- 			m_useUnity = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) );
 
- 			if( UIUtils.CurrentShaderVersion() > 17402 )
 
- 			{
 
- 				m_calculateSmoothValue = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) );
 
- 			}
 
- 			if( UIUtils.CurrentShaderVersion() > 18902 )
 
- 			{
 
- 				m_applySmoothToIds = Convert.ToBoolean( GetCurrentParam( ref nodeParams ) );
 
- 			}
 
- 			ChangePorts();
 
- 			ChechSmoothPorts();
 
- 		}
 
- 		public override void WriteToString( ref string nodeInfo, ref string connectionsInfo )
 
- 		{
 
- 			base.WriteToString( ref nodeInfo, ref connectionsInfo );
 
- 			IOUtils.AddFieldValueToString( ref nodeInfo, m_searchQuality );
 
- 			IOUtils.AddFieldValueToString( ref nodeInfo, m_distanceFunction );
 
- 			IOUtils.AddFieldValueToString( ref nodeInfo, m_minkowskiPower );
 
- 			IOUtils.AddFieldValueToString( ref nodeInfo, m_functionType );
 
- 			IOUtils.AddFieldValueToString( ref nodeInfo, m_octaves );
 
- 			IOUtils.AddFieldValueToString( ref nodeInfo, m_tileable.ToString() );
 
- 			IOUtils.AddFieldValueToString( ref nodeInfo, m_tileScale );
 
- 			IOUtils.AddFieldValueToString( ref nodeInfo, m_useUnity );
 
- 			IOUtils.AddFieldValueToString( ref nodeInfo, m_calculateSmoothValue );
 
- 			IOUtils.AddFieldValueToString( ref nodeInfo , m_applySmoothToIds );
 
- 		}
 
- 	}
 
- }
 
 
  |