add options for gizmo brightness and opacity
This commit is contained in:
@@ -1,6 +1,9 @@
|
|||||||
// Copyright (c) 2012-2024 Wojciech Figat. All rights reserved.
|
// Copyright (c) 2012-2024 Wojciech Figat. All rights reserved.
|
||||||
|
|
||||||
|
using FlaxEditor.Options;
|
||||||
|
using FlaxEditor.SceneGraph;
|
||||||
using FlaxEngine;
|
using FlaxEngine;
|
||||||
|
using System;
|
||||||
|
|
||||||
namespace FlaxEditor.Gizmo
|
namespace FlaxEditor.Gizmo
|
||||||
{
|
{
|
||||||
@@ -18,8 +21,13 @@ namespace FlaxEditor.Gizmo
|
|||||||
private MaterialInstance _materialAxisY;
|
private MaterialInstance _materialAxisY;
|
||||||
private MaterialInstance _materialAxisZ;
|
private MaterialInstance _materialAxisZ;
|
||||||
private MaterialInstance _materialAxisFocus;
|
private MaterialInstance _materialAxisFocus;
|
||||||
|
private MaterialInstance _materialAxisLocked;
|
||||||
private MaterialBase _materialSphere;
|
private MaterialBase _materialSphere;
|
||||||
|
|
||||||
|
// Material Parameter Names
|
||||||
|
const String _brightnessParamName = "Brightness";
|
||||||
|
const String _opacityParamName = "Opacity";
|
||||||
|
|
||||||
private void InitDrawing()
|
private void InitDrawing()
|
||||||
{
|
{
|
||||||
// Axis Models
|
// Axis Models
|
||||||
@@ -34,6 +42,7 @@ namespace FlaxEditor.Gizmo
|
|||||||
_materialAxisY = FlaxEngine.Content.LoadAsyncInternal<MaterialInstance>("Editor/Gizmo/MaterialAxisY");
|
_materialAxisY = FlaxEngine.Content.LoadAsyncInternal<MaterialInstance>("Editor/Gizmo/MaterialAxisY");
|
||||||
_materialAxisZ = FlaxEngine.Content.LoadAsyncInternal<MaterialInstance>("Editor/Gizmo/MaterialAxisZ");
|
_materialAxisZ = FlaxEngine.Content.LoadAsyncInternal<MaterialInstance>("Editor/Gizmo/MaterialAxisZ");
|
||||||
_materialAxisFocus = FlaxEngine.Content.LoadAsyncInternal<MaterialInstance>("Editor/Gizmo/MaterialAxisFocus");
|
_materialAxisFocus = FlaxEngine.Content.LoadAsyncInternal<MaterialInstance>("Editor/Gizmo/MaterialAxisFocus");
|
||||||
|
_materialAxisLocked = FlaxEngine.Content.LoadAsyncInternal<MaterialInstance>("Editor/Gizmo/MaterialAxisLocked");
|
||||||
_materialSphere = FlaxEngine.Content.LoadAsyncInternal<MaterialInstance>("Editor/Gizmo/MaterialSphere");
|
_materialSphere = FlaxEngine.Content.LoadAsyncInternal<MaterialInstance>("Editor/Gizmo/MaterialSphere");
|
||||||
|
|
||||||
// Ensure that every asset was loaded
|
// Ensure that every asset was loaded
|
||||||
@@ -50,6 +59,23 @@ namespace FlaxEditor.Gizmo
|
|||||||
{
|
{
|
||||||
Platform.Fatal("Failed to load transform gizmo resources.");
|
Platform.Fatal("Failed to load transform gizmo resources.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ApplyGizmoOptionsToMaterials(Editor.Instance.Options.Options);
|
||||||
|
|
||||||
|
Editor.Instance.Options.OptionsChanged += ApplyGizmoOptionsToMaterials;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ApplyGizmoOptionsToMaterials(EditorOptions o)
|
||||||
|
{
|
||||||
|
_materialAxisX.SetParameterValue(_brightnessParamName, o.Visual.transformGizmoBrightness);
|
||||||
|
_materialAxisY.SetParameterValue(_brightnessParamName, o.Visual.transformGizmoBrightness);
|
||||||
|
_materialAxisZ.SetParameterValue(_brightnessParamName, o.Visual.transformGizmoBrightness);
|
||||||
|
_materialAxisLocked.SetParameterValue(_brightnessParamName, o.Visual.transformGizmoBrightness);
|
||||||
|
|
||||||
|
_materialAxisX.SetParameterValue(_opacityParamName, o.Visual.transformGizmoOpacity);
|
||||||
|
_materialAxisY.SetParameterValue(_opacityParamName, o.Visual.transformGizmoOpacity);
|
||||||
|
_materialAxisZ.SetParameterValue(_opacityParamName, o.Visual.transformGizmoOpacity);
|
||||||
|
_materialAxisLocked.SetParameterValue(_opacityParamName, o.Visual.transformGizmoOpacity);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
@@ -60,6 +86,21 @@ namespace FlaxEditor.Gizmo
|
|||||||
if (!_modelCube || !_modelCube.IsLoaded)
|
if (!_modelCube || !_modelCube.IsLoaded)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
bool gizmoLocked = false;
|
||||||
|
|
||||||
|
// Find out if any of the selected objects can not be moved.
|
||||||
|
if (Editor.Instance.StateMachine.IsPlayMode)
|
||||||
|
{
|
||||||
|
foreach (SceneGraphNode obj in Editor.Instance.SceneEditing.Selection)
|
||||||
|
{
|
||||||
|
if (obj.CanTransform == false)
|
||||||
|
{
|
||||||
|
gizmoLocked = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// As all axisMesh have the same pivot, add a little offset to the x axisMesh, this way SortDrawCalls is able to sort the draw order
|
// As all axisMesh have the same pivot, add a little offset to the x axisMesh, this way SortDrawCalls is able to sort the draw order
|
||||||
// https://github.com/FlaxEngine/FlaxEngine/issues/680
|
// https://github.com/FlaxEngine/FlaxEngine/issues/680
|
||||||
|
|
||||||
@@ -92,32 +133,38 @@ namespace FlaxEditor.Gizmo
|
|||||||
// X axis
|
// X axis
|
||||||
Matrix.RotationY(-Mathf.PiOverTwo, out m2);
|
Matrix.RotationY(-Mathf.PiOverTwo, out m2);
|
||||||
Matrix.Multiply(ref m2, ref m1, out m3);
|
Matrix.Multiply(ref m2, ref m1, out m3);
|
||||||
transAxisMesh.Draw(ref renderContext, isXAxis ? _materialAxisFocus : _materialAxisX, ref m3);
|
MaterialInstance xAxisMaterialTransform = gizmoLocked ? _materialAxisLocked : (isXAxis ? _materialAxisFocus : _materialAxisX);
|
||||||
|
transAxisMesh.Draw(ref renderContext, xAxisMaterialTransform, ref m3);
|
||||||
|
|
||||||
// Y axis
|
// Y axis
|
||||||
Matrix.RotationX(Mathf.PiOverTwo, out m2);
|
Matrix.RotationX(Mathf.PiOverTwo, out m2);
|
||||||
Matrix.Multiply(ref m2, ref m1, out m3);
|
Matrix.Multiply(ref m2, ref m1, out m3);
|
||||||
transAxisMesh.Draw(ref renderContext, isYAxis ? _materialAxisFocus : _materialAxisY, ref m3);
|
MaterialInstance yAxisMaterialTransform = gizmoLocked ? _materialAxisLocked : (isYAxis ? _materialAxisFocus : _materialAxisY);
|
||||||
|
transAxisMesh.Draw(ref renderContext, yAxisMaterialTransform, ref m3);
|
||||||
|
|
||||||
// Z axis
|
// Z axis
|
||||||
Matrix.RotationX(Mathf.Pi, out m2);
|
Matrix.RotationX(Mathf.Pi, out m2);
|
||||||
Matrix.Multiply(ref m2, ref m1, out m3);
|
Matrix.Multiply(ref m2, ref m1, out m3);
|
||||||
transAxisMesh.Draw(ref renderContext, isZAxis ? _materialAxisFocus : _materialAxisZ, ref m3);
|
MaterialInstance zAxisMaterialTransform = gizmoLocked ? _materialAxisLocked : (isZAxis ? _materialAxisFocus : _materialAxisZ);
|
||||||
|
transAxisMesh.Draw(ref renderContext, zAxisMaterialTransform, ref m3);
|
||||||
|
|
||||||
// XY plane
|
// XY plane
|
||||||
m2 = Matrix.Transformation(new Vector3(boxSize, boxSize * 0.1f, boxSize), Quaternion.RotationX(Mathf.PiOverTwo), new Vector3(boxSize * boxScale, boxSize * boxScale, 0.0f));
|
m2 = Matrix.Transformation(new Vector3(boxSize, boxSize * 0.1f, boxSize), Quaternion.RotationX(Mathf.PiOverTwo), new Vector3(boxSize * boxScale, boxSize * boxScale, 0.0f));
|
||||||
Matrix.Multiply(ref m2, ref m1, out m3);
|
Matrix.Multiply(ref m2, ref m1, out m3);
|
||||||
cubeMesh.Draw(ref renderContext, _activeAxis == Axis.XY ? _materialAxisFocus : _materialAxisX, ref m3);
|
MaterialInstance xyPlaneMaterialTransform = gizmoLocked ? _materialAxisLocked : (_activeAxis == Axis.XY ? _materialAxisFocus : _materialAxisX);
|
||||||
|
cubeMesh.Draw(ref renderContext, xyPlaneMaterialTransform, ref m3);
|
||||||
|
|
||||||
// ZX plane
|
// ZX plane
|
||||||
m2 = Matrix.Transformation(new Vector3(boxSize, boxSize * 0.1f, boxSize), Quaternion.Identity, new Vector3(boxSize * boxScale, 0.0f, boxSize * boxScale));
|
m2 = Matrix.Transformation(new Vector3(boxSize, boxSize * 0.1f, boxSize), Quaternion.Identity, new Vector3(boxSize * boxScale, 0.0f, boxSize * boxScale));
|
||||||
Matrix.Multiply(ref m2, ref m1, out m3);
|
Matrix.Multiply(ref m2, ref m1, out m3);
|
||||||
cubeMesh.Draw(ref renderContext, _activeAxis == Axis.ZX ? _materialAxisFocus : _materialAxisZ, ref m3);
|
MaterialInstance zxPlaneMaterialTransform = gizmoLocked ? _materialAxisLocked : (_activeAxis == Axis.ZX ? _materialAxisFocus : _materialAxisY);
|
||||||
|
cubeMesh.Draw(ref renderContext, zxPlaneMaterialTransform, ref m3);
|
||||||
|
|
||||||
// YZ plane
|
// YZ plane
|
||||||
m2 = Matrix.Transformation(new Vector3(boxSize, boxSize * 0.1f, boxSize), Quaternion.RotationZ(Mathf.PiOverTwo), new Vector3(0.0f, boxSize * boxScale, boxSize * boxScale));
|
m2 = Matrix.Transformation(new Vector3(boxSize, boxSize * 0.1f, boxSize), Quaternion.RotationZ(Mathf.PiOverTwo), new Vector3(0.0f, boxSize * boxScale, boxSize * boxScale));
|
||||||
Matrix.Multiply(ref m2, ref m1, out m3);
|
Matrix.Multiply(ref m2, ref m1, out m3);
|
||||||
cubeMesh.Draw(ref renderContext, _activeAxis == Axis.YZ ? _materialAxisFocus : _materialAxisY, ref m3);
|
MaterialInstance yzPlaneMaterialTransform = gizmoLocked ? _materialAxisLocked : (_activeAxis == Axis.YZ ? _materialAxisFocus : _materialAxisZ);
|
||||||
|
cubeMesh.Draw(ref renderContext, yzPlaneMaterialTransform, ref m3);
|
||||||
|
|
||||||
// Center sphere
|
// Center sphere
|
||||||
Matrix.Scaling(gizmoModelsScale2RealGizmoSize, out m2);
|
Matrix.Scaling(gizmoModelsScale2RealGizmoSize, out m2);
|
||||||
@@ -136,15 +183,18 @@ namespace FlaxEditor.Gizmo
|
|||||||
// X axis
|
// X axis
|
||||||
Matrix.RotationZ(Mathf.PiOverTwo, out m2);
|
Matrix.RotationZ(Mathf.PiOverTwo, out m2);
|
||||||
Matrix.Multiply(ref m2, ref m1, out m3);
|
Matrix.Multiply(ref m2, ref m1, out m3);
|
||||||
rotationAxisMesh.Draw(ref renderContext, isXAxis ? _materialAxisFocus : _materialAxisX, ref m3);
|
MaterialInstance xAxisMaterialRotate = gizmoLocked ? _materialAxisLocked : (isXAxis ? _materialAxisFocus : _materialAxisX);
|
||||||
|
rotationAxisMesh.Draw(ref renderContext, xAxisMaterialRotate, ref m3);
|
||||||
|
|
||||||
// Y axis
|
// Y axis
|
||||||
rotationAxisMesh.Draw(ref renderContext, isYAxis ? _materialAxisFocus : _materialAxisY, ref m1);
|
MaterialInstance yAxisMaterialRotate = gizmoLocked ? _materialAxisLocked : (isYAxis ? _materialAxisFocus : _materialAxisY);
|
||||||
|
rotationAxisMesh.Draw(ref renderContext, yAxisMaterialRotate, ref m1);
|
||||||
|
|
||||||
// Z axis
|
// Z axis
|
||||||
Matrix.RotationX(-Mathf.PiOverTwo, out m2);
|
Matrix.RotationX(-Mathf.PiOverTwo, out m2);
|
||||||
Matrix.Multiply(ref m2, ref m1, out m3);
|
Matrix.Multiply(ref m2, ref m1, out m3);
|
||||||
rotationAxisMesh.Draw(ref renderContext, isZAxis ? _materialAxisFocus : _materialAxisZ, ref m3);
|
MaterialInstance zAxisMaterialRotate = gizmoLocked ? _materialAxisLocked : (isZAxis ? _materialAxisFocus : _materialAxisZ);
|
||||||
|
rotationAxisMesh.Draw(ref renderContext, zAxisMaterialRotate, ref m3);
|
||||||
|
|
||||||
// Center box
|
// Center box
|
||||||
Matrix.Scaling(gizmoModelsScale2RealGizmoSize, out m2);
|
Matrix.Scaling(gizmoModelsScale2RealGizmoSize, out m2);
|
||||||
@@ -163,32 +213,38 @@ namespace FlaxEditor.Gizmo
|
|||||||
// X axis
|
// X axis
|
||||||
Matrix.RotationY(-Mathf.PiOverTwo, out m2);
|
Matrix.RotationY(-Mathf.PiOverTwo, out m2);
|
||||||
Matrix.Multiply(ref m2, ref mx1, out m3);
|
Matrix.Multiply(ref m2, ref mx1, out m3);
|
||||||
scaleAxisMesh.Draw(ref renderContext, isXAxis ? _materialAxisFocus : _materialAxisX, ref m3);
|
MaterialInstance xAxisMaterialRotate = gizmoLocked ? _materialAxisLocked : (isXAxis ? _materialAxisFocus : _materialAxisX);
|
||||||
|
scaleAxisMesh.Draw(ref renderContext, xAxisMaterialRotate, ref m3);
|
||||||
|
|
||||||
// Y axis
|
// Y axis
|
||||||
Matrix.RotationX(Mathf.PiOverTwo, out m2);
|
Matrix.RotationX(Mathf.PiOverTwo, out m2);
|
||||||
Matrix.Multiply(ref m2, ref m1, out m3);
|
Matrix.Multiply(ref m2, ref m1, out m3);
|
||||||
scaleAxisMesh.Draw(ref renderContext, isYAxis ? _materialAxisFocus : _materialAxisY, ref m3);
|
MaterialInstance yAxisMaterialRotate = gizmoLocked ? _materialAxisLocked : (isYAxis ? _materialAxisFocus : _materialAxisY);
|
||||||
|
scaleAxisMesh.Draw(ref renderContext, yAxisMaterialRotate, ref m3);
|
||||||
|
|
||||||
// Z axis
|
// Z axis
|
||||||
Matrix.RotationX(Mathf.Pi, out m2);
|
Matrix.RotationX(Mathf.Pi, out m2);
|
||||||
Matrix.Multiply(ref m2, ref m1, out m3);
|
Matrix.Multiply(ref m2, ref m1, out m3);
|
||||||
scaleAxisMesh.Draw(ref renderContext, isZAxis ? _materialAxisFocus : _materialAxisZ, ref m3);
|
MaterialInstance zAxisMaterialRotate = gizmoLocked ? _materialAxisLocked : (isZAxis ? _materialAxisFocus : _materialAxisZ);
|
||||||
|
scaleAxisMesh.Draw(ref renderContext, zAxisMaterialRotate, ref m3);
|
||||||
|
|
||||||
// XY plane
|
// XY plane
|
||||||
m2 = Matrix.Transformation(new Vector3(boxSize, boxSize * 0.1f, boxSize), Quaternion.RotationX(Mathf.PiOverTwo), new Vector3(boxSize * boxScale, boxSize * boxScale, 0.0f));
|
m2 = Matrix.Transformation(new Vector3(boxSize, boxSize * 0.1f, boxSize), Quaternion.RotationX(Mathf.PiOverTwo), new Vector3(boxSize * boxScale, boxSize * boxScale, 0.0f));
|
||||||
Matrix.Multiply(ref m2, ref m1, out m3);
|
Matrix.Multiply(ref m2, ref m1, out m3);
|
||||||
cubeMesh.Draw(ref renderContext, _activeAxis == Axis.XY ? _materialAxisFocus : _materialAxisX, ref m3);
|
MaterialInstance xyPlaneMaterialScale = gizmoLocked ? _materialAxisLocked : (_activeAxis == Axis.XY ? _materialAxisFocus : _materialAxisX);
|
||||||
|
cubeMesh.Draw(ref renderContext, xyPlaneMaterialScale, ref m3);
|
||||||
|
|
||||||
// ZX plane
|
// ZX plane
|
||||||
m2 = Matrix.Transformation(new Vector3(boxSize, boxSize * 0.1f, boxSize), Quaternion.Identity, new Vector3(boxSize * boxScale, 0.0f, boxSize * boxScale));
|
m2 = Matrix.Transformation(new Vector3(boxSize, boxSize * 0.1f, boxSize), Quaternion.Identity, new Vector3(boxSize * boxScale, 0.0f, boxSize * boxScale));
|
||||||
Matrix.Multiply(ref m2, ref m1, out m3);
|
Matrix.Multiply(ref m2, ref m1, out m3);
|
||||||
cubeMesh.Draw(ref renderContext, _activeAxis == Axis.ZX ? _materialAxisFocus : _materialAxisZ, ref m3);
|
MaterialInstance zxPlaneMaterialScale = gizmoLocked ? _materialAxisLocked : (_activeAxis == Axis.ZX ? _materialAxisFocus : _materialAxisZ);
|
||||||
|
cubeMesh.Draw(ref renderContext, zxPlaneMaterialScale, ref m3);
|
||||||
|
|
||||||
// YZ plane
|
// YZ plane
|
||||||
m2 = Matrix.Transformation(new Vector3(boxSize, boxSize * 0.1f, boxSize), Quaternion.RotationZ(Mathf.PiOverTwo), new Vector3(0.0f, boxSize * boxScale, boxSize * boxScale));
|
m2 = Matrix.Transformation(new Vector3(boxSize, boxSize * 0.1f, boxSize), Quaternion.RotationZ(Mathf.PiOverTwo), new Vector3(0.0f, boxSize * boxScale, boxSize * boxScale));
|
||||||
Matrix.Multiply(ref m2, ref m1, out m3);
|
Matrix.Multiply(ref m2, ref m1, out m3);
|
||||||
cubeMesh.Draw(ref renderContext, _activeAxis == Axis.YZ ? _materialAxisFocus : _materialAxisY, ref m3);
|
MaterialInstance yzPlaneMaterialScale = gizmoLocked ? _materialAxisLocked : (_activeAxis == Axis.YZ ? _materialAxisFocus : _materialAxisY);
|
||||||
|
cubeMesh.Draw(ref renderContext, yzPlaneMaterialScale, ref m3);
|
||||||
|
|
||||||
// Center box
|
// Center box
|
||||||
Matrix.Scaling(gizmoModelsScale2RealGizmoSize, out m2);
|
Matrix.Scaling(gizmoModelsScale2RealGizmoSize, out m2);
|
||||||
|
|||||||
@@ -53,6 +53,20 @@ namespace FlaxEditor.Options
|
|||||||
[EditorDisplay("Transform Gizmo"), EditorOrder(200), Tooltip("The color used to highlight selected meshes and CSG surfaces.")]
|
[EditorDisplay("Transform Gizmo"), EditorOrder(200), Tooltip("The color used to highlight selected meshes and CSG surfaces.")]
|
||||||
public Color HighlightColor { get; set; } = new Color(0.0f, 0.533f, 1.0f, 1.0f);
|
public Color HighlightColor { get; set; } = new Color(0.0f, 0.533f, 1.0f, 1.0f);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or set a value indicating how bright the transform gizmo is. Value over 1 will result in the gizmo emitting light.
|
||||||
|
/// </summary>
|
||||||
|
[DefaultValue(1f), Range(0f, 5f)]
|
||||||
|
[EditorDisplay("Transform Gizmo", "Gizmo Brightness"), EditorOrder(210)]
|
||||||
|
public float transformGizmoBrightness { get; set; } = 1f;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or set a value indicating the opactiy of the transform gizmo.
|
||||||
|
/// </summary>
|
||||||
|
[DefaultValue(1f), Range(0f, 1f)]
|
||||||
|
[EditorDisplay("Transform Gizmo", "Gizmo Opacity"), EditorOrder(211)]
|
||||||
|
public float transformGizmoOpacity { get; set; } = 1f;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets a value indicating whether enable MSAA for DebugDraw primitives rendering. Helps with pixel aliasing but reduces performance.
|
/// Gets or sets a value indicating whether enable MSAA for DebugDraw primitives rendering. Helps with pixel aliasing but reduces performance.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
Reference in New Issue
Block a user