@@ -113,7 +113,7 @@ public Texture3D GetGradientTexture()
113113 {
114114 if ( gradientTexture == null )
115115 {
116- gradientTexture = AsyncHelper . RunSync < Texture3D > ( ( ) => CreateGradientTextureInternalAsync ( NullProgressHandler . instance ) ) ;
116+ gradientTexture = AsyncHelper . RunSync < Texture3D > ( ( ) => CreateGradientTextureInternalAsync ( GradientTypeUtils . GetDefaultGradientType ( ) , NullProgressHandler . instance ) ) ;
117117 return gradientTexture ;
118118 }
119119 else
@@ -122,6 +122,29 @@ public Texture3D GetGradientTexture()
122122 }
123123 }
124124
125+ public async Task < Texture3D > RegenerateGradientTextureAsync ( GradientType gradientType , IProgressHandler progressHandler = null )
126+ {
127+ await createGradientTextureLock . WaitAsync ( ) ;
128+ try
129+ {
130+ if ( progressHandler == null )
131+ progressHandler = new NullProgressHandler ( ) ;
132+ try
133+ {
134+ gradientTexture = await CreateGradientTextureInternalAsync ( gradientType , progressHandler != null ? progressHandler : NullProgressHandler . instance ) ;
135+ }
136+ catch ( System . Exception exception )
137+ {
138+ Debug . LogException ( exception ) ;
139+ }
140+ }
141+ finally
142+ {
143+ createGradientTextureLock . Release ( ) ;
144+ }
145+ return gradientTexture ;
146+ }
147+
125148 /// <summary>
126149 /// Gets the gradient texture, containing the gradient values (direction of change) of the dataset.
127150 /// Will create the gradient texture if it does not exist, without blocking the main thread.
@@ -132,17 +155,7 @@ public async Task<Texture3D> GetGradientTextureAsync(IProgressHandler progressHa
132155 {
133156 if ( gradientTexture == null )
134157 {
135- await createGradientTextureLock . WaitAsync ( ) ;
136- try
137- {
138- if ( progressHandler == null )
139- progressHandler = new NullProgressHandler ( ) ;
140- gradientTexture = await CreateGradientTextureInternalAsync ( progressHandler != null ? progressHandler : NullProgressHandler . instance ) ;
141- }
142- finally
143- {
144- createGradientTextureLock . Release ( ) ;
145- }
158+ gradientTexture = await RegenerateGradientTextureAsync ( GradientTypeUtils . GetDefaultGradientType ( ) , progressHandler ) ;
146159 }
147160 return gradientTexture ;
148161 }
@@ -332,7 +345,7 @@ await Task.Run(() => {
332345 return texture ;
333346 }
334347
335- private async Task < Texture3D > CreateGradientTextureInternalAsync ( IProgressHandler progressHandler )
348+ private async Task < Texture3D > CreateGradientTextureInternalAsync ( GradientType gradientType , IProgressHandler progressHandler )
336349 {
337350 Debug . Log ( "Async gradient generation. Hold on." ) ;
338351
@@ -364,6 +377,8 @@ await Task.Run(() => {
364377 Texture3D textureTmp = new Texture3D ( dimX , dimY , dimZ , texformat , false ) ;
365378 textureTmp . wrapMode = TextureWrapMode . Clamp ;
366379
380+ GradientComputator gradientComputator = GradientComputatorFactory . CreateGradientComputator ( this , gradientType ) ;
381+
367382 for ( int x = 0 ; x < dimX ; x ++ )
368383 {
369384 progressHandler . ReportProgress ( x , dimX , "Calculating gradients for slice" ) ;
@@ -372,7 +387,7 @@ await Task.Run(() => {
372387 for ( int z = 0 ; z < dimZ ; z ++ )
373388 {
374389 int iData = x + y * dimX + z * ( dimX * dimY ) ;
375- Vector3 grad = GetGrad ( x , y , z , minValue , maxRange ) ;
390+ Vector3 grad = gradientComputator . ComputeGradient ( x , y , z , minValue , maxRange ) ;
376391
377392 textureTmp . SetPixel ( x , y , z , new Color ( grad . x , grad . y , grad . z , ( float ) ( data [ iData ] - minValue ) / maxRange ) ) ;
378393 }
@@ -390,6 +405,8 @@ await Task.Run(() => {
390405
391406 progressHandler . StartStage ( 0.6f , "Creating gradient texture" ) ;
392407 await Task . Run ( ( ) => {
408+ GradientComputator gradientComputator = GradientComputatorFactory . CreateGradientComputator ( this , gradientType ) ;
409+
393410 for ( int z = 0 ; z < dimZ ; z ++ )
394411 {
395412 progressHandler . ReportProgress ( z , dimZ , "Calculating gradients for slice" ) ;
@@ -398,7 +415,7 @@ await Task.Run(() => {
398415 for ( int x = 0 ; x < dimX ; x ++ )
399416 {
400417 int iData = x + y * dimX + z * ( dimX * dimY ) ;
401- Vector3 grad = GetGrad ( x , y , z , minValue , maxRange ) ;
418+ Vector3 grad = gradientComputator . ComputeGradient ( x , y , z , minValue , maxRange ) ;
402419
403420 cols [ iData ] = new Color ( grad . x , grad . y , grad . z , ( float ) ( data [ iData ] - minValue ) / maxRange ) ;
404421 }
@@ -418,17 +435,6 @@ await Task.Run(() => {
418435 return texture ;
419436
420437 }
421- public Vector3 GetGrad ( int x , int y , int z , float minValue , float maxRange )
422- {
423- float x1 = data [ Math . Min ( x + 1 , dimX - 1 ) + y * dimX + z * ( dimX * dimY ) ] - minValue ;
424- float x2 = data [ Math . Max ( x - 1 , 0 ) + y * dimX + z * ( dimX * dimY ) ] - minValue ;
425- float y1 = data [ x + Math . Min ( y + 1 , dimY - 1 ) * dimX + z * ( dimX * dimY ) ] - minValue ;
426- float y2 = data [ x + Math . Max ( y - 1 , 0 ) * dimX + z * ( dimX * dimY ) ] - minValue ;
427- float z1 = data [ x + y * dimX + Math . Min ( z + 1 , dimZ - 1 ) * ( dimX * dimY ) ] - minValue ;
428- float z2 = data [ x + y * dimX + Math . Max ( z - 1 , 0 ) * ( dimX * dimY ) ] - minValue ;
429-
430- return new Vector3 ( ( x2 - x1 ) / maxRange , ( y2 - y1 ) / maxRange , ( z2 - z1 ) / maxRange ) ;
431- }
432438
433439 public float GetAvgerageVoxelValues ( int x , int y , int z )
434440 {
0 commit comments