Merge pull request #70 from mlavik1/origin
Improved Generate2DHistogramTexture.
This commit is contained in:
Коммит
e6cc256c69
|
@ -93,10 +93,10 @@ namespace UnityVolumeRendering
|
||||||
TransferFunction2D.TF2DBox box = tf2d.boxes[selectedBoxIndex];
|
TransferFunction2D.TF2DBox box = tf2d.boxes[selectedBoxIndex];
|
||||||
float oldX = box.rect.x;
|
float oldX = box.rect.x;
|
||||||
float oldY = box.rect.y;
|
float oldY = box.rect.y;
|
||||||
box.rect.x = EditorGUI.Slider(new Rect(startX, startY, 200.0f, 20.0f), "x", box.rect.x, 0.0f, 0.99f);
|
box.rect.x = EditorGUI.Slider(new Rect(startX, startY, 200.0f, 20.0f), "min x", box.rect.x, 0.0f, 0.99f);
|
||||||
box.rect.width = EditorGUI.Slider(new Rect(startX + 220.0f, startY, 200.0f, 20.0f), "width", oldX + box.rect.width, box.rect.x + 0.01f, 1.0f) - box.rect.x;
|
box.rect.width = EditorGUI.Slider(new Rect(startX + 220.0f, startY, 200.0f, 20.0f), "max x", oldX + box.rect.width, box.rect.x + 0.01f, 1.0f) - box.rect.x;
|
||||||
box.rect.y = EditorGUI.Slider(new Rect(startX, startY + 50, 200.0f, 20.0f), "y", box.rect.y, 0.0f, 1.0f);
|
box.rect.y = EditorGUI.Slider(new Rect(startX, startY + 50, 200.0f, 20.0f), "min y", box.rect.y, 0.0f, 1.0f);
|
||||||
box.rect.height = EditorGUI.Slider(new Rect(startX + 220.0f, startY + 50, 200.0f, 20.0f), "height", oldY + box.rect.height, box.rect.y + 0.01f, 1.0f) - box.rect.y;
|
box.rect.height = EditorGUI.Slider(new Rect(startX + 220.0f, startY + 50, 200.0f, 20.0f), "max y", oldY + box.rect.height, box.rect.y + 0.01f, 1.0f) - box.rect.y;
|
||||||
box.colour = EditorGUI.ColorField(new Rect(startX + 450.0f, startY + 10, 100.0f, 20.0f), box.colour);
|
box.colour = EditorGUI.ColorField(new Rect(startX + 450.0f, startY + 10, 100.0f, 20.0f), box.colour);
|
||||||
box.minAlpha = EditorGUI.Slider(new Rect(startX + 450.0f, startY + 30, 200.0f, 20.0f), "min alpha", box.minAlpha, 0.0f, 1.0f);
|
box.minAlpha = EditorGUI.Slider(new Rect(startX + 450.0f, startY + 30, 200.0f, 20.0f), "min alpha", box.minAlpha, 0.0f, 1.0f);
|
||||||
box.alpha = EditorGUI.Slider(new Rect(startX + 450.0f, startY + 60, 200.0f, 20.0f), "max alpha", box.alpha, 0.0f, 1.0f);
|
box.alpha = EditorGUI.Slider(new Rect(startX + 450.0f, startY + 60, 200.0f, 20.0f), "max alpha", box.alpha, 0.0f, 1.0f);
|
||||||
|
@ -110,7 +110,7 @@ namespace UnityVolumeRendering
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add new rectangle
|
// Add new rectangle
|
||||||
if (GUI.Button(new Rect(startX, startY + 100, 110.0f, 30.0f), "Add rectangle"))
|
if (GUI.Button(new Rect(startX, startY + 100, 150.0f, 30.0f), "Add rectangle"))
|
||||||
{
|
{
|
||||||
tf2d.AddBox(0.1f, 0.1f, 0.8f, 0.8f, Color.white, 0.5f);
|
tf2d.AddBox(0.1f, 0.1f, 0.8f, 0.8f, Color.white, 0.5f);
|
||||||
needsRegenTexture = true;
|
needsRegenTexture = true;
|
||||||
|
@ -118,20 +118,21 @@ namespace UnityVolumeRendering
|
||||||
// Remove selected shape
|
// Remove selected shape
|
||||||
if (selectedBoxIndex != -1)
|
if (selectedBoxIndex != -1)
|
||||||
{
|
{
|
||||||
if (GUI.Button(new Rect(startX, startY + 140, 110.0f, 30.0f), "Remove selected shape"))
|
if (GUI.Button(new Rect(startX, startY + 140, 150.0f, 30.0f), "Remove selected shape"))
|
||||||
{
|
{
|
||||||
tf2d.boxes.RemoveAt(selectedBoxIndex);
|
tf2d.boxes.RemoveAt(selectedBoxIndex);
|
||||||
|
selectedBoxIndex = -1;
|
||||||
needsRegenTexture = true;
|
needsRegenTexture = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(GUI.Button(new Rect(startX, startY + 180, 110.0f, 30.0f), "Save"))
|
if(GUI.Button(new Rect(startX, startY + 180, 150.0f, 30.0f), "Save"))
|
||||||
{
|
{
|
||||||
string filepath = EditorUtility.SaveFilePanel("Save transfer function", "", "default.tf2d", "tf2d");
|
string filepath = EditorUtility.SaveFilePanel("Save transfer function", "", "default.tf2d", "tf2d");
|
||||||
if(filepath != "")
|
if(filepath != "")
|
||||||
TransferFunctionDatabase.SaveTransferFunction2D(tf2d, filepath);
|
TransferFunctionDatabase.SaveTransferFunction2D(tf2d, filepath);
|
||||||
}
|
}
|
||||||
if(GUI.Button(new Rect(startX, startY + 220, 110.0f, 30.0f), "Load"))
|
if(GUI.Button(new Rect(startX, startY + 220, 150.0f, 30.0f), "Load"))
|
||||||
{
|
{
|
||||||
string filepath = EditorUtility.OpenFilePanel("Save transfer function", "", "tf2d");
|
string filepath = EditorUtility.OpenFilePanel("Save transfer function", "", "tf2d");
|
||||||
if(filepath != "")
|
if(filepath != "")
|
||||||
|
@ -151,8 +152,6 @@ namespace UnityVolumeRendering
|
||||||
tf2d.GenerateTexture();
|
tf2d.GenerateTexture();
|
||||||
needsRegenTexture = false;
|
needsRegenTexture = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnSelectionChange()
|
private void OnSelectionChange()
|
||||||
|
|
|
@ -110,11 +110,20 @@ namespace UnityVolumeRendering
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public static Texture2D Generate2DHistogramTexture(VolumeDataset dataset)
|
public static Texture2D Generate2DHistogramTexture(VolumeDataset dataset)
|
||||||
{
|
{
|
||||||
int numSamples = dataset.GetMaxDataValue() + 1;
|
int minValue = dataset.GetMinDataValue();
|
||||||
int numGradientSamples = 256;
|
int maxValue = dataset.GetMaxDataValue();
|
||||||
Color[] cols = new Color[numSamples * numGradientSamples];
|
|
||||||
Texture2D texture = new Texture2D(numSamples, numGradientSamples, TextureFormat.RGBAFloat, false);
|
|
||||||
|
|
||||||
|
// Value range of the density values.
|
||||||
|
int densityValRange = maxValue - minValue + 1;
|
||||||
|
float densityRangeRecip = 1.0f / (maxValue - minValue); // reciprocal
|
||||||
|
// Clamp density value samples.
|
||||||
|
int numDensitySamples = System.Math.Min(densityValRange, 512);
|
||||||
|
int numGradientSamples = 256;
|
||||||
|
|
||||||
|
Color[] cols = new Color[numDensitySamples * numGradientSamples];
|
||||||
|
Texture2D texture = new Texture2D(numDensitySamples, numGradientSamples, TextureFormat.RGBAFloat, false);
|
||||||
|
|
||||||
|
// Zero-initialise colours.
|
||||||
for (int iCol = 0; iCol < cols.Length; iCol++)
|
for (int iCol = 0; iCol < cols.Length; iCol++)
|
||||||
cols[iCol] = new Color(0.0f, 0.0f, 0.0f, 0.0f);
|
cols[iCol] = new Color(0.0f, 0.0f, 0.0f, 0.0f);
|
||||||
|
|
||||||
|
@ -137,8 +146,16 @@ namespace UnityVolumeRendering
|
||||||
int z1 = dataset.data[x + y * dataset.dimX + (z + 1) * (dataset.dimX * dataset.dimY)];
|
int z1 = dataset.data[x + y * dataset.dimX + (z + 1) * (dataset.dimX * dataset.dimY)];
|
||||||
int z2 = dataset.data[x + y * dataset.dimX + (z - 1) * (dataset.dimX * dataset.dimY)];
|
int z2 = dataset.data[x + y * dataset.dimX + (z - 1) * (dataset.dimX * dataset.dimY)];
|
||||||
|
|
||||||
|
// Calculate gradient
|
||||||
Vector3 grad = new Vector3((x2 - x1) / (float)maxRange, (y2 - y1) / (float)maxRange, (z2 - z1) / (float)maxRange);
|
Vector3 grad = new Vector3((x2 - x1) / (float)maxRange, (y2 - y1) / (float)maxRange, (z2 - z1) / (float)maxRange);
|
||||||
cols[density + (int)(grad.magnitude * numGradientSamples / maxNormalisedMagnitude) * numSamples] = Color.white;
|
|
||||||
|
// Calculate density and gradient value indices (in flattened 2D array)
|
||||||
|
float tDensity = (density - minValue) * densityRangeRecip;
|
||||||
|
int iDensity = Mathf.RoundToInt((numDensitySamples - 1) * tDensity);
|
||||||
|
int iGrad = (int)(grad.magnitude * numGradientSamples / maxNormalisedMagnitude);
|
||||||
|
|
||||||
|
// Assign a white colour to all samples (in a histogram where x = density and y = gradient magnitude).
|
||||||
|
cols[iDensity + iGrad * numDensitySamples] = Color.white;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Загрузка…
Ссылка в новой задаче