@@ -113,7 +113,7 @@ public Texture3D GetGradientTexture()
113
113
{
114
114
if ( gradientTexture == null )
115
115
{
116
- gradientTexture = AsyncHelper . RunSync < Texture3D > ( ( ) => CreateGradientTextureInternalAsync ( NullProgressHandler . instance ) ) ;
116
+ gradientTexture = AsyncHelper . RunSync < Texture3D > ( ( ) => CreateGradientTextureInternalAsync ( GradientTypeUtils . GetDefaultGradientType ( ) , NullProgressHandler . instance ) ) ;
117
117
return gradientTexture ;
118
118
}
119
119
else
@@ -122,6 +122,29 @@ public Texture3D GetGradientTexture()
122
122
}
123
123
}
124
124
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
+
125
148
/// <summary>
126
149
/// Gets the gradient texture, containing the gradient values (direction of change) of the dataset.
127
150
/// 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
132
155
{
133
156
if ( gradientTexture == null )
134
157
{
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 ) ;
146
159
}
147
160
return gradientTexture ;
148
161
}
@@ -332,7 +345,7 @@ await Task.Run(() => {
332
345
return texture ;
333
346
}
334
347
335
- private async Task < Texture3D > CreateGradientTextureInternalAsync ( IProgressHandler progressHandler )
348
+ private async Task < Texture3D > CreateGradientTextureInternalAsync ( GradientType gradientType , IProgressHandler progressHandler )
336
349
{
337
350
Debug . Log ( "Async gradient generation. Hold on." ) ;
338
351
@@ -364,6 +377,8 @@ await Task.Run(() => {
364
377
Texture3D textureTmp = new Texture3D ( dimX , dimY , dimZ , texformat , false ) ;
365
378
textureTmp . wrapMode = TextureWrapMode . Clamp ;
366
379
380
+ GradientComputator gradientComputator = GradientComputatorFactory . CreateGradientComputator ( this , gradientType ) ;
381
+
367
382
for ( int x = 0 ; x < dimX ; x ++ )
368
383
{
369
384
progressHandler . ReportProgress ( x , dimX , "Calculating gradients for slice" ) ;
@@ -372,7 +387,7 @@ await Task.Run(() => {
372
387
for ( int z = 0 ; z < dimZ ; z ++ )
373
388
{
374
389
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 ) ;
376
391
377
392
textureTmp . SetPixel ( x , y , z , new Color ( grad . x , grad . y , grad . z , ( float ) ( data [ iData ] - minValue ) / maxRange ) ) ;
378
393
}
@@ -390,6 +405,8 @@ await Task.Run(() => {
390
405
391
406
progressHandler . StartStage ( 0.6f , "Creating gradient texture" ) ;
392
407
await Task . Run ( ( ) => {
408
+ GradientComputator gradientComputator = GradientComputatorFactory . CreateGradientComputator ( this , gradientType ) ;
409
+
393
410
for ( int z = 0 ; z < dimZ ; z ++ )
394
411
{
395
412
progressHandler . ReportProgress ( z , dimZ , "Calculating gradients for slice" ) ;
@@ -398,7 +415,7 @@ await Task.Run(() => {
398
415
for ( int x = 0 ; x < dimX ; x ++ )
399
416
{
400
417
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 ) ;
402
419
403
420
cols [ iData ] = new Color ( grad . x , grad . y , grad . z , ( float ) ( data [ iData ] - minValue ) / maxRange ) ;
404
421
}
@@ -418,17 +435,6 @@ await Task.Run(() => {
418
435
return texture ;
419
436
420
437
}
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
- }
432
438
433
439
public float GetAvgerageVoxelValues ( int x , int y , int z )
434
440
{
0 commit comments