109 lines
3.6 KiB
C#
109 lines
3.6 KiB
C#
// Copyright (c) 2012-2022 Wojciech Figat. All rights reserved.
|
|
|
|
using FlaxEditor.SceneGraph.Actors;
|
|
using FlaxEditor.Viewport;
|
|
using FlaxEditor.Viewport.Modes;
|
|
using FlaxEngine;
|
|
|
|
namespace FlaxEditor.Tools.Foliage
|
|
{
|
|
/// <summary>
|
|
/// Foliage painting tool mode.
|
|
/// </summary>
|
|
/// <seealso cref="FlaxEditor.Viewport.Modes.EditorGizmoMode" />
|
|
public class PaintFoliageGizmoMode : EditorGizmoMode
|
|
{
|
|
/// <summary>
|
|
/// The foliage painting gizmo.
|
|
/// </summary>
|
|
public PaintFoliageGizmo Gizmo;
|
|
|
|
/// <summary>
|
|
/// Gets the current brush.
|
|
/// </summary>
|
|
public readonly Brush CurrentBrush = new Brush();
|
|
|
|
/// <summary>
|
|
/// The last valid cursor position of the brush (in world space).
|
|
/// </summary>
|
|
public Vector3 CursorPosition { get; private set; }
|
|
|
|
/// <summary>
|
|
/// The last valid cursor hit point normal vector of the brush (in world space).
|
|
/// </summary>
|
|
public Vector3 CursorNormal { get; private set; }
|
|
|
|
/// <summary>
|
|
/// Flag used to indicate whenever last cursor position of the brush is valid.
|
|
/// </summary>
|
|
public bool HasValidHit { get; private set; }
|
|
|
|
/// <summary>
|
|
/// Gets the selected foliage actor (see <see cref="Modules.SceneEditingModule"/>).
|
|
/// </summary>
|
|
public FlaxEngine.Foliage SelectedFoliage
|
|
{
|
|
get
|
|
{
|
|
var sceneEditing = Editor.Instance.SceneEditing;
|
|
var foliageNode = sceneEditing.SelectionCount == 1 ? sceneEditing.Selection[0] as FoliageNode : null;
|
|
return (FlaxEngine.Foliage)foliageNode?.Actor;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets the world bounds of the brush located at the current cursor position (defined by <see cref="CursorPosition"/>). Valid only if <see cref="HasValidHit"/> is set to true.
|
|
/// </summary>
|
|
public BoundingBox CursorBrushBounds
|
|
{
|
|
get
|
|
{
|
|
float brushSizeHalf = CurrentBrush.Size * 0.5f;
|
|
Vector3 center = CursorPosition;
|
|
|
|
BoundingBox box;
|
|
box.Minimum = new Vector3(center.X - brushSizeHalf, center.Y - brushSizeHalf - brushSizeHalf, center.Z - brushSizeHalf);
|
|
box.Maximum = new Vector3(center.X + brushSizeHalf, center.Y + brushSizeHalf + brushSizeHalf, center.Z + brushSizeHalf);
|
|
return box;
|
|
}
|
|
}
|
|
|
|
/// <inheritdoc />
|
|
public override void Init(MainEditorGizmoViewport viewport)
|
|
{
|
|
base.Init(viewport);
|
|
|
|
Gizmo = new PaintFoliageGizmo(viewport, this);
|
|
}
|
|
|
|
/// <inheritdoc />
|
|
public override void OnActivated()
|
|
{
|
|
base.OnActivated();
|
|
|
|
Viewport.Gizmos.Active = Gizmo;
|
|
ClearCursor();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Clears the cursor location information cached within the gizmo mode.
|
|
/// </summary>
|
|
public void ClearCursor()
|
|
{
|
|
HasValidHit = false;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Sets the cursor location in the world space. Updates the brush location and cached affected chunks.
|
|
/// </summary>
|
|
/// <param name="hitPosition">The cursor hit location on the selected foliage.</param>
|
|
/// <param name="hitNormal">The cursor hit location normal vector fot he surface.</param>
|
|
public void SetCursor(ref Vector3 hitPosition, ref Vector3 hitNormal)
|
|
{
|
|
HasValidHit = true;
|
|
CursorPosition = hitPosition;
|
|
CursorNormal = hitNormal;
|
|
}
|
|
}
|
|
}
|