Skip to content

Commit

Permalink
Merge pull request stride3d#1083 from salahchafai/GizmoImprovements
Browse files Browse the repository at this point in the history
Improve the editor gizmos
  • Loading branch information
xen2 authored Jul 7, 2021
2 parents 1dbd2f7 + 6871490 commit 54688bd
Show file tree
Hide file tree
Showing 17 changed files with 458 additions and 145 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -45,12 +45,32 @@ protected AxialGizmo()

protected override Entity Create()
{
RedUniformMaterial = CreateUniformColorMaterial(RedUniformColor);
GreenUniformMaterial = CreateUniformColorMaterial(GreenUniformColor);
BlueUniformMaterial = CreateUniformColorMaterial(BlueUniformColor);
RedUniformMaterial = CreateEmissiveColorMaterial(RedUniformColor);
GreenUniformMaterial = CreateEmissiveColorMaterial(GreenUniformColor);
BlueUniformMaterial = CreateEmissiveColorMaterial(BlueUniformColor);
return null;
}

/// <summary>
/// Gets the default color associated to the provided axis index.
/// </summary>
/// <param name="axisIndex">The index of the axis</param>
/// <returns>The default color associated</returns>
protected Color GetAxisDefaultColor(int axisIndex)
{
switch (axisIndex)
{
case 0:
return RedUniformColor;
case 1:
return GreenUniformColor;
case 2:
return BlueUniformColor;
default:
throw new ArgumentOutOfRangeException("axisIndex");
}
}

/// <summary>
/// Gets the default material associated to the provided axis index.
/// </summary>
Expand Down Expand Up @@ -78,16 +98,36 @@ protected Material GetAxisDefaultMaterial(int axisIndex)
/// <returns>the material</returns>
protected Material CreateUniformColorMaterial(Color color)
{
return GizmoUniformColorMaterial.Create(GraphicsDevice, color, false);
return GizmoUniformColorMaterial.Create(GraphicsDevice, color);
}

/// <summary>
/// Creates an emissive color material.
/// </summary>
/// <param name="color">The color of the material</param>
/// <returns>the material</returns>
protected Material CreateEmissiveColorMaterial(Color color)
{
return GizmoEmissiveColorMaterial.Create(GraphicsDevice, color, 0.75f);
}

/// <summary>
/// Creates a material from a shader.
/// </summary>
/// <param name="shaderName">the shader's name</param>
/// <returns>the material</returns>
protected Material CreateShaderMaterial(string shaderName)
{
return GizmoShaderMaterial.Create(GraphicsDevice, shaderName);
}

protected virtual void UpdateColors()
{
if (IsEnabled && RedUniformMaterial != null)
{
GizmoUniformColorMaterial.UpdateColor(GraphicsDevice, RedUniformMaterial, RedUniformColor);
GizmoUniformColorMaterial.UpdateColor(GraphicsDevice, GreenUniformMaterial, GreenUniformColor);
GizmoUniformColorMaterial.UpdateColor(GraphicsDevice, BlueUniformMaterial, BlueUniformColor);
GizmoEmissiveColorMaterial.UpdateColor(GraphicsDevice, RedUniformMaterial, RedUniformColor);
GizmoEmissiveColorMaterial.UpdateColor(GraphicsDevice, GreenUniformMaterial, GreenUniformColor);
GizmoEmissiveColorMaterial.UpdateColor(GraphicsDevice, BlueUniformMaterial, BlueUniformColor);
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ protected override Entity Create()
frustumMesh = new CameraFrustumMesh(GraphicsDevice);
frustumMesh.Build(GraphicsCommandList, cameraParameters);

var frustumMaterial = GizmoUniformColorMaterial.Create(GraphicsDevice, new Color(0.75f, 0.75f, 1f, 1f));
var frustumMaterial = GizmoEmissiveColorMaterial.Create(GraphicsDevice, new Color(0.75f, 0.75f, 1f, 1f));

frustum = new Entity("Camera frustumMesh of {0}".ToFormat(root.Id))
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
using Stride.Graphics.GeometricPrimitives;
using Stride.Rendering;
using Stride.Rendering.Compositing;
using Stride.Assets.Presentation.SceneEditor;

namespace Stride.Assets.Presentation.AssetEditors.Gizmos
{
Expand All @@ -36,12 +37,12 @@ public class CameraOrientationGizmo : AxialGizmo

private static readonly FaceData[] Faces =
{
new FaceData("Right", new Vector3(0, MathUtil.PiOverTwo, 0)),
new FaceData("Left", new Vector3(0, -MathUtil.PiOverTwo, 0)),
new FaceData("Top", new Vector3(-MathUtil.PiOverTwo, 0, 0)),
new FaceData("Bottom", new Vector3(MathUtil.PiOverTwo, 0, 0)),
new FaceData("Back", Vector3.Zero),
new FaceData("Front", new Vector3(0, MathUtil.Pi, 0))
new FaceData("Right", "X", new Vector3(0, MathUtil.PiOverTwo, 0)),
new FaceData("Left", "-X", new Vector3(0, -MathUtil.PiOverTwo, 0)),
new FaceData("Top", "Y", new Vector3(-MathUtil.PiOverTwo, 0, 0)),
new FaceData("Bottom", "-Y", new Vector3(MathUtil.PiOverTwo, 0, 0)),
new FaceData("Back", "-Z", Vector3.Zero),
new FaceData("Front", "Z", new Vector3(0, MathUtil.Pi, 0))
};

/// <summary>
Expand All @@ -58,9 +59,11 @@ public class CameraOrientationGizmo : AxialGizmo
/// </summary>
private const int DefaultSize = 25;

private const float FontSize = 7;
private const float FontSize = 25;

private const float TextScale = 0.08f;
private const float NameIndicatorScale = 0.08f;

private const float XYZIndicatorScale = 0.18f;

private const float OuterExtent = 0.25f;

Expand Down Expand Up @@ -227,8 +230,8 @@ protected override Entity Create()
{
base.Create();

DefaultMaterial = CreateUniformColorMaterial(Color.White);
ElementSelectedMaterial = CreateUniformColorMaterial(Color.Gold);
DefaultMaterial = CreateShaderMaterial("CameraOrientationGizmoShader");
ElementSelectedMaterial = CreateEmissiveColorMaterial(Color.Gray);

var entity = new Entity("View Gizmo");
cameraComponent = new CameraComponent
Expand All @@ -250,7 +253,7 @@ protected override Entity Create()
// create the sprite batch use to draw text
spriteBatch = new SpriteBatch(GraphicsDevice) { DefaultDepth = 1 };

// Add a renderer on the top right size
// Add a renderer on the top right side
var cameraOrientationGizmoRenderStage = new RenderStage("CameraOrientationGizmo", "Main");
game.EditorSceneSystem.GraphicsCompositor.RenderStages.Add(cameraOrientationGizmoRenderStage);

Expand Down Expand Up @@ -320,13 +323,17 @@ private void RenderFaceNames(RenderDrawContext context)

var textureToWorldSpace = Matrix.RotationX(MathUtil.Pi) * Matrix.Translation(0, 0, OuterExtent);

foreach (var face in Faces)
var displayDirectionNames = SceneEditorSettings.DisplayDirectionNames.GetValue();

var textScale = displayDirectionNames ? NameIndicatorScale : XYZIndicatorScale;

for (int i = 0; i < Faces.Count(); i++)
{
var text = face.Name.ToUpperInvariant();
var text = displayDirectionNames ? Faces[i].Name.ToUpperInvariant() : Faces[i].XYZComponent;

spriteBatch.Begin(context.GraphicsContext, textureToWorldSpace * face.Rotation * viewMatrix, projectionMatrix, SpriteSortMode.BackToFront, BlendStates.AlphaBlend, context.GraphicsDevice.SamplerStates.LinearClamp, DepthStencilStates.None);
spriteBatch.Begin(context.GraphicsContext, textureToWorldSpace * Faces[i].Rotation * viewMatrix, projectionMatrix, SpriteSortMode.BackToFront, BlendStates.AlphaBlend, context.GraphicsDevice.SamplerStates.LinearClamp, DepthStencilStates.None);
var textSize = spriteBatch.MeasureString(defaultFont, text, viewPortSize);
spriteBatch.DrawString(defaultFont, text, Vector2.One * 0.5f, new Color(0, 0, 0, 0.8f), 0, textSize / 2, Vector2.One / FontSize * TextScale, SpriteEffects.None, 0, TextAlignment.Center);
spriteBatch.DrawString(defaultFont, text, Vector2.One * 0.5f, GetAxisDefaultColor(i / 2), 0, textSize / 2, Vector2.One / FontSize * textScale, SpriteEffects.None, 0, TextAlignment.Center);

spriteBatch.End();
}
Expand All @@ -336,11 +343,14 @@ struct FaceData
{
public readonly string Name;

public readonly string XYZComponent;

public readonly Matrix Rotation;

public FaceData(string name, Vector3 angles)
public FaceData(string name, string xyzComponent, Vector3 angles)
{
Name = name;
XYZComponent = xyzComponent;
Rotation = Matrix.RotationYawPitchRoll(angles.Y, angles.X, angles.Z);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ namespace Stride.Assets.Presentation.AssetEditors.Gizmos
{
public static class GizmoEmissiveColorMaterial
{
public static Material Create(GraphicsDevice device, Color color, float intensity)
public static Material Create(GraphicsDevice device, Color color, float intensity = 1f)
{
var material = Material.New(device, new MaterialDescriptor
{
Expand All @@ -22,13 +22,19 @@ public static Material Create(GraphicsDevice device, Color color, float intensit
}
});

// set the color to the material
UpdateColor(device, material, color, intensity);

return material;
}

public static void UpdateColor(GraphicsDevice device, Material material, Color color, float intensity = 1f)
{
// set the color to the material
material.Passes[0].Parameters.Set(MaterialKeys.DiffuseValue, new Color4(color).ToColorSpace(device.ColorSpace));

material.Passes[0].Parameters.Set(MaterialKeys.EmissiveIntensity, intensity);
material.Passes[0].Parameters.Set(MaterialKeys.EmissiveValue, new Color4(color).ToColorSpace(device.ColorSpace));

return material;
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
// Copyright (c) .NET Foundation and Contributors (https://dotnetfoundation.org/ & https://stride3d.net) and Silicon Studio Corp. (https://www.siliconstudio.co.jp)
// Distributed under the MIT license. See the LICENSE.md file in the project root for more information.
using Stride.Graphics;
using Stride.Rendering;
using Stride.Rendering.Materials;
using Stride.Rendering.Materials.ComputeColors;

namespace Stride.Assets.Presentation.AssetEditors.Gizmos
{
public static class GizmoShaderMaterial
{
public static Material Create(GraphicsDevice device, string shaderName)
{
var material = Material.New(device, new MaterialDescriptor
{
Attributes =
{
Diffuse = new MaterialDiffuseMapFeature(new ComputeShaderClassColor() { MixinReference = shaderName }),
DiffuseModel = new MaterialDiffuseLambertModelFeature(),
Emissive = new MaterialEmissiveMapFeature(new ComputeShaderClassColor() { MixinReference = shaderName })
}
});

return material;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,20 +11,11 @@ namespace Stride.Assets.Presentation.AssetEditors.Gizmos
{
public static class GizmoUniformColorMaterial
{
public static readonly ValueParameterKey<Color4> GizmoColorKey = ParameterKeys.NewValue<Color4>();

public static Material Create(GraphicsDevice device, Color color, bool emissive = true)
public static Material Create(GraphicsDevice device, Color color)
{
var desc = new MaterialDescriptor();
if (emissive)
{
desc.Attributes.Emissive = new MaterialEmissiveMapFeature(new ComputeColor() { Key = GizmoColorKey });
}
else
{
desc.Attributes.Diffuse = new MaterialDiffuseMapFeature(new ComputeColor() { Key = GizmoColorKey });
desc.Attributes.DiffuseModel = new MaterialDiffuseLambertModelFeature();
}
desc.Attributes.Diffuse = new MaterialDiffuseMapFeature(new ComputeColor());
desc.Attributes.DiffuseModel = new MaterialDiffuseLambertModelFeature();

var material = Material.New(device, desc);

Expand All @@ -46,7 +37,7 @@ public static Material Create(GraphicsDevice device, Color color, bool emissive
public static void UpdateColor(GraphicsDevice device, Material material, Color color)
{
// set the color to the material
material.Passes[0].Parameters.Set(GizmoColorKey, new Color4(color).ToColorSpace(device.ColorSpace));
material.Passes[0].Parameters.Set(MaterialKeys.DiffuseValue, new Color4(color).ToColorSpace(device.ColorSpace));
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ protected override Entity Create()
var root = base.Create();

lightRay = new Entity($"Light ray for light gizmo {root.Id}");
rayMaterial = GizmoUniformColorMaterial.Create(GraphicsDevice, (Color)new Color4(GetLightColor(GraphicsDevice), 1f));
rayMaterial = GizmoEmissiveColorMaterial.Create(GraphicsDevice, (Color)new Color4(GetLightColor(GraphicsDevice), 1f));

// build the ray mesh
var coneMesh = GeometricPrimitive.Cone.New(GraphicsDevice, ConeRadius, ConeHeight, GizmoTessellation).ToMeshDraw();
Expand All @@ -57,7 +57,7 @@ public override void Update()
base.Update();

// update the color of the ray
GizmoUniformColorMaterial.UpdateColor(GraphicsDevice, rayMaterial, (Color)new Color4(GetLightColor(GraphicsDevice), 1f));
GizmoEmissiveColorMaterial.UpdateColor(GraphicsDevice, rayMaterial, (Color)new Color4(GetLightColor(GraphicsDevice), 1f));
}

public override bool IsSelected
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ protected override Entity Create()
pointMesh= new LightPointMesh(GraphicsDevice);
pointMesh.Build();

pointMaterial = GizmoUniformColorMaterial.Create(GraphicsDevice, (Color)new Color4(GetLightColor(GraphicsDevice), 1f));
pointMaterial = GizmoEmissiveColorMaterial.Create(GraphicsDevice, (Color)new Color4(GetLightColor(GraphicsDevice), 1f));

pointEntity = new Entity("Point Mesh of {0}".ToFormat(root.Id))
{
Expand All @@ -71,7 +71,7 @@ public override void Update()
pointEntity.Transform.Scale = new Vector3(LightPoint.Radius);

// update the spot color
GizmoUniformColorMaterial.UpdateColor(GraphicsDevice, pointMaterial, (Color)new Color4(GetLightColor(GraphicsDevice), 1f));
GizmoEmissiveColorMaterial.UpdateColor(GraphicsDevice, pointMaterial, (Color)new Color4(GetLightColor(GraphicsDevice), 1f));
}

public override bool IsSelected
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ protected override Entity Create()
spotMesh = new LightSpotMesh(GraphicsDevice);
spotMesh.Build(GraphicsCommandList, LightSpot);

spotMaterial = GizmoUniformColorMaterial.Create(GraphicsDevice, (Color)new Color4(GetLightColor(GraphicsDevice), 1f));
spotMaterial = GizmoEmissiveColorMaterial.Create(GraphicsDevice, (Color)new Color4(GetLightColor(GraphicsDevice), 1f));

spotEntity = new Entity("Spot Mesh of {0}".ToFormat(root.Id))
{
Expand Down Expand Up @@ -113,7 +113,7 @@ public override void Update()
}

// update the spot color
GizmoUniformColorMaterial.UpdateColor(GraphicsDevice, spotMaterial, (Color)new Color4(GetLightColor(GraphicsDevice), 1f));
GizmoEmissiveColorMaterial.UpdateColor(GraphicsDevice, spotMaterial, (Color)new Color4(GetLightColor(GraphicsDevice), 1f));
}

public override bool IsSelected
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ public NavigationBoundingBoxGizmo(EntityComponent component) : base(component)

protected override Entity Create()
{
material = GizmoUniformColorMaterial.Create(GraphicsDevice, Color.CornflowerBlue);
material = GizmoEmissiveColorMaterial.Create(GraphicsDevice, Color.CornflowerBlue);

box = new BoxMesh(GraphicsDevice);
box.Build();
Expand Down
Loading

0 comments on commit 54688bd

Please sign in to comment.