TF editor improvements: Made it easier to select control points, especially at the borders.

This commit is contained in:
Matias Lavik 2022-01-02 19:40:03 +01:00
Родитель ba54467609
Коммит d76ad808c1
1 изменённых файлов: 28 добавлений и 22 удалений

Просмотреть файл

@ -69,11 +69,15 @@ namespace UnityVolumeRendering
Color oldColour = GUI.color; // Used for setting GUI.color when drawing UI elements
float contentWidth = Mathf.Min(this.position.width - 20.0f, (this.position.height - 100.0f) * 2.0f);
float contentWidth = Mathf.Min(this.position.width, (this.position.height - 100.0f) * 2.0f);
float contentHeight = contentWidth * 0.5f;
Rect bgRect = new Rect(0.0f, 0.0f, contentWidth, contentHeight);
Rect paletteRect = new Rect(bgRect.x, bgRect.y + bgRect.height + 20, contentWidth, 20.0f);
// Interaction area (slightly larger than the histogram rect)
Rect interactRect = new Rect(0.0f, 0.0f, contentWidth, contentHeight);
// Histogram rect (histogram view and alpha control points)
Rect histRect = new Rect(interactRect.x + 20.0f, interactRect.y + 20.0f, interactRect.width - 40.0f, interactRect.height - 40.0f);
// Colour palette rect (colour control points)
Rect paletteRect = new Rect(histRect.x, histRect.y + histRect.height + 20, histRect.width, 20.0f);
// TODO: Don't do this every frame
tf.GenerateTexture();
@ -90,7 +94,7 @@ namespace UnityVolumeRendering
// Draw histogram
tfGUIMat.SetTexture("_TFTex", tf.GetTexture());
tfGUIMat.SetTexture("_HistTex", histTex);
Graphics.DrawTexture(bgRect, tf.GetTexture(), tfGUIMat);
Graphics.DrawTexture(histRect, tf.GetTexture(), tfGUIMat);
// Draw colour palette
Texture2D tfTexture = tf.GetTexture();
@ -98,15 +102,15 @@ namespace UnityVolumeRendering
Graphics.DrawTexture(new Rect(paletteRect.x, paletteRect.y, paletteRect.width, paletteRect.height), tfTexture, tfPaletteGUIMat);
// Release selected colour/alpha points if mouse leaves window
if (movingAlphaPointIndex != -1 && !bgRect.Contains(currentEvent.mousePosition))
if (movingAlphaPointIndex != -1 && !interactRect.Contains(currentEvent.mousePosition))
movingAlphaPointIndex = -1;
if (movingColPointIndex != -1 && !(currentEvent.mousePosition.x >= bgRect.x && currentEvent.mousePosition.x <= bgRect.x + bgRect.width))
if (movingColPointIndex != -1 && !(currentEvent.mousePosition.x >= paletteRect.x && currentEvent.mousePosition.x <= paletteRect.x + paletteRect.width))
movingColPointIndex = -1;
// Mouse down => Move or remove selected colour control point
if (currentEvent.type == EventType.MouseDown && paletteRect.Contains(currentEvent.mousePosition))
{
float mousePos = (currentEvent.mousePosition.x - bgRect.x) / bgRect.width;
float mousePos = (currentEvent.mousePosition.x - paletteRect.x) / paletteRect.width;
int pointIndex = PickColourControlPoint(mousePos);
if (pointIndex != -1)
{
@ -130,7 +134,7 @@ namespace UnityVolumeRendering
// Mouse down => Move or remove selected alpha control point
if (currentEvent.type == EventType.MouseDown)
{
Vector2 mousePos = new Vector2((currentEvent.mousePosition.x - bgRect.x) / bgRect.width, 1.0f - (currentEvent.mousePosition.y - bgRect.y) / bgRect.height);
Vector2 mousePos = new Vector2((currentEvent.mousePosition.x - histRect.x) / histRect.width, 1.0f - (currentEvent.mousePosition.y - histRect.y) / histRect.height);
int pointIndex = PickAlphaControlPoint(mousePos);
if (pointIndex != -1)
{
@ -153,8 +157,8 @@ namespace UnityVolumeRendering
if (movingAlphaPointIndex != -1)
{
TFAlphaControlPoint alphaPoint = tf.alphaControlPoints[movingAlphaPointIndex];
alphaPoint.dataValue = Mathf.Clamp((currentEvent.mousePosition.x - bgRect.x) / bgRect.width, 0.0f, 1.0f);
alphaPoint.alphaValue = Mathf.Clamp(1.0f - (currentEvent.mousePosition.y - bgRect.y) / bgRect.height, 0.0f, 1.0f);
alphaPoint.dataValue = Mathf.Clamp((currentEvent.mousePosition.x - histRect.x) / histRect.width, 0.0f, 1.0f);
alphaPoint.alphaValue = Mathf.Clamp(1.0f - (currentEvent.mousePosition.y - histRect.y) / histRect.height, 0.0f, 1.0f);
tf.alphaControlPoints[movingAlphaPointIndex] = alphaPoint;
}
@ -162,7 +166,7 @@ namespace UnityVolumeRendering
if (movingColPointIndex != -1)
{
TFColourControlPoint colPoint = tf.colourControlPoints[movingColPointIndex];
colPoint.dataValue = Mathf.Clamp((currentEvent.mousePosition.x - bgRect.x) / bgRect.width, 0.0f, 1.0f);
colPoint.dataValue = Mathf.Clamp((currentEvent.mousePosition.x - paletteRect.x) / paletteRect.width, 0.0f, 1.0f);
tf.colourControlPoints[movingColPointIndex] = colPoint;
}
@ -170,7 +174,7 @@ namespace UnityVolumeRendering
for (int iCol = 0; iCol < tf.colourControlPoints.Count; iCol++)
{
TFColourControlPoint colPoint = tf.colourControlPoints[iCol];
Rect ctrlBox = new Rect(bgRect.x + bgRect.width * colPoint.dataValue, bgRect.y + bgRect.height + 20, 10, 20);
Rect ctrlBox = new Rect(histRect.x + histRect.width * colPoint.dataValue, histRect.y + histRect.height + 20, 10, 20);
GUI.color = Color.red;
GUI.skin.box.fontSize = 6;
GUI.Box(ctrlBox, "*");
@ -179,11 +183,13 @@ namespace UnityVolumeRendering
// Draw alpha control points
for (int iAlpha = 0; iAlpha < tf.alphaControlPoints.Count; iAlpha++)
{
const int pointSize = 10;
TFAlphaControlPoint alphaPoint = tf.alphaControlPoints[iAlpha];
Rect ctrlBox = new Rect(bgRect.x + bgRect.width * alphaPoint.dataValue, bgRect.y + (1.0f - alphaPoint.alphaValue) * bgRect.height, 10, 10);
GUI.color = oldColour;
Rect ctrlBox = new Rect(histRect.x + histRect.width * alphaPoint.dataValue - pointSize / 2, histRect.y + (1.0f - alphaPoint.alphaValue) * histRect.height - pointSize / 2, pointSize, pointSize);
GUI.color = Color.red;
GUI.skin.box.fontSize = 6;
GUI.Box(ctrlBox, "*");
GUI.color = oldColour;
}
if (currentEvent.type == EventType.MouseUp)
@ -195,15 +201,15 @@ namespace UnityVolumeRendering
// Add points
if (currentEvent.type == EventType.MouseDown && currentEvent.button == 1)
{
if (bgRect.Contains(new Vector2(currentEvent.mousePosition.x, currentEvent.mousePosition.y)))
tf.alphaControlPoints.Add(new TFAlphaControlPoint(Mathf.Clamp((currentEvent.mousePosition.x - bgRect.x) / bgRect.width, 0.0f, 1.0f), Mathf.Clamp(1.0f - (currentEvent.mousePosition.y - bgRect.y) / bgRect.height, 0.0f, 1.0f)));
if (histRect.Contains(new Vector2(currentEvent.mousePosition.x, currentEvent.mousePosition.y)))
tf.alphaControlPoints.Add(new TFAlphaControlPoint(Mathf.Clamp((currentEvent.mousePosition.x - histRect.x) / histRect.width, 0.0f, 1.0f), Mathf.Clamp(1.0f - (currentEvent.mousePosition.y - histRect.y) / histRect.height, 0.0f, 1.0f)));
else
tf.colourControlPoints.Add(new TFColourControlPoint(Mathf.Clamp((currentEvent.mousePosition.x - bgRect.x) / bgRect.width, 0.0f, 1.0f), Random.ColorHSV()));
tf.colourControlPoints.Add(new TFColourControlPoint(Mathf.Clamp((currentEvent.mousePosition.x - histRect.x) / histRect.width, 0.0f, 1.0f), Random.ColorHSV()));
selectedColPointIndex = -1;
}
// Save TF
if(GUI.Button(new Rect(0.0f, bgRect.y + bgRect.height + 50.0f, 70.0f, 30.0f), "Save"))
if(GUI.Button(new Rect(histRect.x, histRect.y + histRect.height + 50.0f, 70.0f, 30.0f), "Save"))
{
string filepath = EditorUtility.SaveFilePanel("Save transfer function", "", "default.tf", "tf");
if(filepath != "")
@ -211,7 +217,7 @@ namespace UnityVolumeRendering
}
// Load TF
if(GUI.Button(new Rect(75.0f, bgRect.y + bgRect.height + 50.0f, 70.0f, 30.0f), "Load"))
if(GUI.Button(new Rect(histRect.x + 75.0f, histRect.y + histRect.height + 50.0f, 70.0f, 30.0f), "Load"))
{
string filepath = EditorUtility.OpenFilePanel("Save transfer function", "", "tf");
if(filepath != "")
@ -222,7 +228,7 @@ namespace UnityVolumeRendering
}
}
// Clear TF
if(GUI.Button(new Rect(150.0f, bgRect.y + bgRect.height + 50.0f, 70.0f, 30.0f), "Clear"))
if(GUI.Button(new Rect(histRect.x + 150.0f, histRect.y + histRect.height + 50.0f, 70.0f, 30.0f), "Clear"))
{
tf = volRendObject.transferFunction = new TransferFunction();
tf.alphaControlPoints.Add(new TFAlphaControlPoint(0.1f, 0.0f));
@ -235,12 +241,12 @@ namespace UnityVolumeRendering
if (selectedColPointIndex != -1)
{
TFColourControlPoint colPoint = tf.colourControlPoints[selectedColPointIndex];
colPoint.colourValue = EditorGUI.ColorField(new Rect(225, bgRect.y + bgRect.height + 50, 100.0f, 40.0f), colPoint.colourValue);
colPoint.colourValue = EditorGUI.ColorField(new Rect(histRect.x + 225, histRect.y + histRect.height + 50, 100.0f, 40.0f), colPoint.colourValue);
tf.colourControlPoints[selectedColPointIndex] = colPoint;
}
GUI.skin.label.wordWrap = false;
GUI.Label(new Rect(0.0f, bgRect.y + bgRect.height + 85.0f, 700.0f, 30.0f), "Left click to select and move a control point. Right click to add a control point, and ctrl + right click to delete.");
GUI.Label(new Rect(histRect.x, histRect.y + histRect.height + 85.0f, 720.0f, 30.0f), "Left click to select and move a control point. Right click to add a control point, and ctrl + right click to delete.");
GUI.color = oldColour;
}