Skip to content

Commit 35124f4

Browse files
committed
GradientType
1 parent d292ba8 commit 35124f4

File tree

6 files changed

+106
-67
lines changed

6 files changed

+106
-67
lines changed

Assets/Editor/ImportSettingsEditorWindow.cs

+8
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,14 @@ private void OnGUI()
4343
PlayerPrefs.SetInt("ClampHounsfield", clampHounsfield ? 1 : 0);
4444
EditorGUILayout.EndHorizontal();
4545

46+
EditorGUILayout.BeginHorizontal();
47+
EditorGUILayout.LabelField("Default gradient computation method");
48+
GradientType gradientType = GradientType.CentralDifference;
49+
Enum.TryParse(PlayerPrefs.GetString("DefaultGradientType"), out gradientType);
50+
gradientType = (GradientType)EditorGUILayout.EnumPopup(gradientType, "");
51+
PlayerPrefs.SetString("DefaultGradientType", gradientType.ToString());
52+
EditorGUILayout.EndHorizontal();
53+
4654
EditorGUILayout.Space();
4755
EditorGUILayout.Space();
4856

Assets/Editor/VolumeRenderedObjectCustomInspector.cs

+8
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,14 @@ public override void OnInspectorGUI()
112112
else
113113
volrendObj.SetLightingEnabled(false);
114114

115+
GradientType oldGradientType = volrendObj.GetGradientType();
116+
GradientType newGradientType = (GradientType)EditorGUILayout.EnumPopup("Gradient", oldGradientType);
117+
118+
if (newGradientType != oldGradientType)
119+
{
120+
volrendObj.SetGradientTypeAsync(newGradientType, new ProgressHandler(this));
121+
}
122+
115123
if (volrendObj.GetLightingEnabled() || volrendObj.GetRenderMode() == RenderMode.IsosurfaceRendering)
116124
{
117125
LightSource oldLightSource = volrendObj.GetLightSource();
+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
using System;
2+
using UnityEngine;
3+
4+
namespace UnityVolumeRendering
5+
{
6+
public enum GradientType
7+
{
8+
CentralDifference,
9+
Sobel
10+
}
11+
12+
public class GradientTypeUtils
13+
{
14+
public static GradientType GetDefaultGradientType()
15+
{
16+
GradientType gradientType = GradientType.CentralDifference;
17+
Enum.TryParse(PlayerPrefs.GetString("DefaultGradientType"), out gradientType);
18+
return gradientType;
19+
}
20+
}
21+
}

Assets/Scripts/Gradients/SobelGradientComputator.cs

+18-46
Original file line numberDiff line numberDiff line change
@@ -32,56 +32,26 @@ private float Convolve(int x, int y, int z, float[,,] matrix)
3232
return result;
3333
}
3434

35-
private static readonly float[,,] kernelx = {
35+
private static readonly float[,,] kernelx = new float[,,]
3636
{
37-
{-1, 0, 1},
38-
{-2, 0, 2},
39-
{-1, 0, 1}
40-
},
41-
{
42-
{-2, 0, 2},
43-
{-4, 0, 4},
44-
{-2, 0, 2}
45-
},
46-
{
47-
{-1, 0, 1},
48-
{-2, 0, 2},
49-
{-1, 0, 1}
50-
}};
37+
{ { -1, 0, 1 }, { -2, 0, 2 }, { -1, 0, 1 } },
38+
{ { -2, 0, 2 }, { -4, 0, 4 }, { -2, 0, 2 } },
39+
{ { -1, 0, 1 }, { -2, 0, 2 }, { -1, 0, 1 } }
40+
};
5141

52-
private static readonly float[,,] kernely = {
53-
{
54-
{-1, -2, -1},
55-
{0, 0, 0},
56-
{1, 2, 1}
57-
},
58-
{
59-
{-2, -4, -2},
60-
{0, 0, 0},
61-
{2, 4, 2}
62-
},
42+
private static readonly float[,,] kernely = new float[,,]
6343
{
64-
{-1, -2, -1},
65-
{0, 0, 0},
66-
{1, 2, 1}
67-
}};
44+
{ { -1, -2, -1 }, { 0, 0, 0 }, { 1, 2, 1 } },
45+
{ { -2, -4, -2 }, { 0, 0, 0 }, { 2, 4, 2 } },
46+
{ { -1, -2, -1 }, { 0, 0, 0 }, { 1, 2, 1 } }
47+
};
6848

69-
private static readonly float[,,] kernelz = {
49+
private static readonly float[,,] kernelz = new float[,,]
7050
{
71-
{-1, -2, -1},
72-
{-2, -4, -2},
73-
{-1, -2, -1}
74-
},
75-
{
76-
{0, 0, 0},
77-
{0, 0, 0},
78-
{0, 0, 0}
79-
},
80-
{
81-
{1, 2, 1},
82-
{2, 4, 2},
83-
{1, 2, 1}
84-
}};
51+
{ { -1, -2, -1 }, { -2, -4, -2 }, { -1, -2, -1 } },
52+
{ { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 } },
53+
{ { 1, 2, 1 }, { 2, 4, 2 }, { 1, 2, 1 } }
54+
};
8555

8656
public override Vector3 ComputeGradient(int x, int y, int z, float minValue, float maxRange)
8757
{
@@ -97,7 +67,9 @@ public override Vector3 ComputeGradient(int x, int y, int z, float minValue, flo
9767

9868
Vector3 gradient = new Vector3(dx, dy, dz);
9969

100-
return new Vector3(gradient.x / maxRange, gradient.y / maxRange, gradient.z / maxRange);
70+
float divident = maxRange * 3;
71+
72+
return new Vector3(gradient.x / divident, gradient.y / divident, gradient.z / divident);
10173
}
10274
}
10375
}

Assets/Scripts/VolumeData/VolumeDataset.cs

+28-21
Original file line numberDiff line numberDiff line change
@@ -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,23 +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-
try {
141-
gradientTexture = await CreateGradientTextureInternalAsync(progressHandler != null ? progressHandler : NullProgressHandler.instance);
142-
}
143-
catch(System.Exception exception)
144-
{
145-
Debug.LogException(exception);
146-
}
147-
}
148-
finally
149-
{
150-
createGradientTextureLock.Release();
151-
}
158+
gradientTexture = await RegenerateGradientTextureAsync(GradientTypeUtils.GetDefaultGradientType(), progressHandler);
152159
}
153160
return gradientTexture;
154161
}
@@ -338,7 +345,7 @@ await Task.Run(() => {
338345
return texture;
339346
}
340347

341-
private async Task<Texture3D> CreateGradientTextureInternalAsync(IProgressHandler progressHandler)
348+
private async Task<Texture3D> CreateGradientTextureInternalAsync(GradientType gradientType, IProgressHandler progressHandler)
342349
{
343350
Debug.Log("Async gradient generation. Hold on.");
344351

@@ -370,7 +377,7 @@ await Task.Run(() => {
370377
Texture3D textureTmp = new Texture3D(dimX, dimY, dimZ, texformat, false);
371378
textureTmp.wrapMode = TextureWrapMode.Clamp;
372379

373-
GradientComputator gradientComputator = new SobelGradientComputator(this);
380+
GradientComputator gradientComputator = gradientType == GradientType.Sobel ? new SobelGradientComputator(this) : new CentralDifferenceGradientComputator(this);
374381

375382
for (int x = 0; x < dimX; x++)
376383
{
@@ -398,7 +405,7 @@ await Task.Run(() => {
398405

399406
progressHandler.StartStage(0.6f, "Creating gradient texture");
400407
await Task.Run(() => {
401-
GradientComputator gradientComputator = new SobelGradientComputator(this);
408+
GradientComputator gradientComputator = gradientType == GradientType.Sobel ? new SobelGradientComputator(this) : new CentralDifferenceGradientComputator(this);
402409

403410
for (int z = 0; z < dimZ; z++)
404411
{

Assets/Scripts/VolumeObject/VolumeRenderedObject.cs

+23
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,9 @@ public class VolumeRenderedObject : MonoBehaviour
7777
[SerializeField, HideInInspector]
7878
private float samplingRateMultiplier = 1.0f;
7979

80+
[SerializeField, HideInInspector]
81+
private GradientType gradientType = GradientType.CentralDifference;
82+
8083
private CrossSectionManager crossSectionManager;
8184

8285
private SemaphoreSlim updateMatLock = new SemaphoreSlim(1, 1);
@@ -373,6 +376,26 @@ public void SetLightSource(LightSource source)
373376
}
374377
}
375378

379+
public GradientType GetGradientType()
380+
{
381+
return this.gradientType;
382+
}
383+
384+
public void SetGradientType(GradientType gradientType)
385+
{
386+
_ = SetGradientTypeAsync(gradientType);
387+
}
388+
389+
public async Task SetGradientTypeAsync(GradientType gradientType, IProgressHandler progressHandler = null)
390+
{
391+
if (gradientType != this.gradientType)
392+
{
393+
this.gradientType = gradientType;
394+
await dataset.RegenerateGradientTextureAsync(gradientType, progressHandler);
395+
await UpdateMaterialPropertiesAsync();
396+
}
397+
}
398+
376399
public void SetGradientLightingThreshold(Vector2 threshold)
377400
{
378401
if (gradientLightingThreshold != threshold)

0 commit comments

Comments
 (0)