Merge remote-tracking branch 'origin/master' into 1.7
This commit is contained in:
BIN
Content/Editor/IconsAtlas.flax
(Stored with Git LFS)
BIN
Content/Editor/IconsAtlas.flax
(Stored with Git LFS)
Binary file not shown.
@@ -45,8 +45,14 @@ namespace FlaxEditor.Content.GUI
|
|||||||
|
|
||||||
private void ImportActors(DragActors actors, ContentFolder location)
|
private void ImportActors(DragActors actors, ContentFolder location)
|
||||||
{
|
{
|
||||||
// Use only the first actor
|
foreach (var actorNode in actors.Objects)
|
||||||
Editor.Instance.Prefabs.CreatePrefab(actors.Objects[0].Actor);
|
{
|
||||||
|
var actor = actorNode.Actor;
|
||||||
|
if (actors.Objects.Contains(actorNode.ParentNode as ActorNode))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
Editor.Instance.Prefabs.CreatePrefab(actor, false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
|
|||||||
@@ -96,6 +96,7 @@ namespace FlaxEditor
|
|||||||
public SpriteHandle Link64;
|
public SpriteHandle Link64;
|
||||||
public SpriteHandle Build64;
|
public SpriteHandle Build64;
|
||||||
public SpriteHandle Add64;
|
public SpriteHandle Add64;
|
||||||
|
public SpriteHandle ShipIt64;
|
||||||
|
|
||||||
// 96px
|
// 96px
|
||||||
public SpriteHandle Toolbox96;
|
public SpriteHandle Toolbox96;
|
||||||
|
|||||||
@@ -0,0 +1,93 @@
|
|||||||
|
// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved.
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using FlaxEngine;
|
||||||
|
|
||||||
|
namespace FlaxEditor.GUI.ContextMenu
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Context menu for a single selectable option from range of values (eg. enum).
|
||||||
|
/// </summary>
|
||||||
|
[HideInEditor]
|
||||||
|
class ContextMenuSingleSelectGroup<T>
|
||||||
|
{
|
||||||
|
private struct SingleSelectGroupItem
|
||||||
|
{
|
||||||
|
public string Text;
|
||||||
|
public string Tooltip;
|
||||||
|
public T Value;
|
||||||
|
public Action Selected;
|
||||||
|
public List<ContextMenuButton> Buttons;
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<ContextMenu> _menus = new List<ContextMenu>();
|
||||||
|
private List<SingleSelectGroupItem> _items = new List<SingleSelectGroupItem>();
|
||||||
|
private SingleSelectGroupItem _selectedItem;
|
||||||
|
|
||||||
|
public T Selected
|
||||||
|
{
|
||||||
|
get => _selectedItem.Value;
|
||||||
|
set
|
||||||
|
{
|
||||||
|
var index = _items.FindIndex(x => x.Value.Equals(value));
|
||||||
|
if (index != -1 && !_selectedItem.Value.Equals(value))
|
||||||
|
{
|
||||||
|
SetSelected(_items[index]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public Action<T> SelectedChanged;
|
||||||
|
|
||||||
|
public ContextMenuSingleSelectGroup<T> AddItem(string text, T value, Action selected = null, string tooltip = null)
|
||||||
|
{
|
||||||
|
var item = new SingleSelectGroupItem
|
||||||
|
{
|
||||||
|
Text = text,
|
||||||
|
Tooltip = tooltip,
|
||||||
|
Value = value,
|
||||||
|
Selected = selected,
|
||||||
|
Buttons = new List<ContextMenuButton>()
|
||||||
|
};
|
||||||
|
_items.Add(item);
|
||||||
|
foreach (var contextMenu in _menus)
|
||||||
|
AddItemToContextMenu(contextMenu, item);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ContextMenuSingleSelectGroup<T> AddItemsToContextMenu(ContextMenu contextMenu)
|
||||||
|
{
|
||||||
|
_menus.Add(contextMenu);
|
||||||
|
for (int i = 0; i < _items.Count; i++)
|
||||||
|
AddItemToContextMenu(contextMenu, _items[i]);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void AddItemToContextMenu(ContextMenu contextMenu, SingleSelectGroupItem item)
|
||||||
|
{
|
||||||
|
var btn = contextMenu.AddButton(item.Text, () => { SetSelected(item); });
|
||||||
|
if (item.Tooltip != null)
|
||||||
|
btn.TooltipText = item.Tooltip;
|
||||||
|
item.Buttons.Add(btn);
|
||||||
|
if (item.Equals(_selectedItem))
|
||||||
|
btn.Checked = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void SetSelected(SingleSelectGroupItem item)
|
||||||
|
{
|
||||||
|
foreach (var e in _items)
|
||||||
|
{
|
||||||
|
foreach (var btn in e.Buttons)
|
||||||
|
btn.Checked = false;
|
||||||
|
}
|
||||||
|
_selectedItem = item;
|
||||||
|
|
||||||
|
SelectedChanged?.Invoke(item.Value);
|
||||||
|
item.Selected?.Invoke();
|
||||||
|
|
||||||
|
foreach (var btn in item.Buttons)
|
||||||
|
btn.Checked = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -23,10 +23,15 @@ namespace FlaxEditor.GUI
|
|||||||
public const int DefaultMarginH = 2;
|
public const int DefaultMarginH = 2;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Event fired when button gets clicked.
|
/// Event fired when button gets clicked with the primary mouse button.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public Action<ToolStripButton> ButtonClicked;
|
public Action<ToolStripButton> ButtonClicked;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Event fired when button gets clicked with the secondary mouse button.
|
||||||
|
/// </summary>
|
||||||
|
public Action<ToolStripButton> SecondaryButtonClicked;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Tries to get the last button.
|
/// Tries to get the last button.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -146,6 +151,11 @@ namespace FlaxEditor.GUI
|
|||||||
ButtonClicked?.Invoke(button);
|
ButtonClicked?.Invoke(button);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal void OnSecondaryButtonClicked(ToolStripButton button)
|
||||||
|
{
|
||||||
|
SecondaryButtonClicked?.Invoke(button);
|
||||||
|
}
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
protected override void PerformLayoutBeforeChildren()
|
protected override void PerformLayoutBeforeChildren()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -20,13 +20,19 @@ namespace FlaxEditor.GUI
|
|||||||
|
|
||||||
private SpriteHandle _icon;
|
private SpriteHandle _icon;
|
||||||
private string _text;
|
private string _text;
|
||||||
private bool _mouseDown;
|
private bool _primaryMouseDown;
|
||||||
|
private bool _secondaryMouseDown;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Event fired when user clicks the button.
|
/// Event fired when user clicks the button.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public Action Clicked;
|
public Action Clicked;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Event fired when user clicks the button.
|
||||||
|
/// </summary>
|
||||||
|
public Action SecondaryClicked;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The checked state.
|
/// The checked state.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -63,6 +69,11 @@ namespace FlaxEditor.GUI
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// A reference to a context menu to raise when the secondary mouse button is pressed.
|
||||||
|
/// </summary>
|
||||||
|
public ContextMenu.ContextMenu ContextMenu;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Initializes a new instance of the <see cref="ToolStripButton"/> class.
|
/// Initializes a new instance of the <see cref="ToolStripButton"/> class.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -108,10 +119,11 @@ namespace FlaxEditor.GUI
|
|||||||
var iconRect = new Rectangle(DefaultMargin, DefaultMargin, iconSize, iconSize);
|
var iconRect = new Rectangle(DefaultMargin, DefaultMargin, iconSize, iconSize);
|
||||||
var textRect = new Rectangle(DefaultMargin, 0, 0, Height);
|
var textRect = new Rectangle(DefaultMargin, 0, 0, Height);
|
||||||
bool enabled = EnabledInHierarchy;
|
bool enabled = EnabledInHierarchy;
|
||||||
|
bool mouseButtonDown = _primaryMouseDown || _secondaryMouseDown;
|
||||||
|
|
||||||
// Draw background
|
// Draw background
|
||||||
if (enabled && (IsMouseOver || IsNavFocused || Checked))
|
if (enabled && (IsMouseOver || IsNavFocused || Checked))
|
||||||
Render2D.FillRectangle(clientRect, Checked ? style.BackgroundSelected : _mouseDown ? style.BackgroundHighlighted : (style.LightBackground * 1.3f));
|
Render2D.FillRectangle(clientRect, Checked ? style.BackgroundSelected : mouseButtonDown ? style.BackgroundHighlighted : (style.LightBackground * 1.3f));
|
||||||
|
|
||||||
// Draw icon
|
// Draw icon
|
||||||
if (_icon.IsValid)
|
if (_icon.IsValid)
|
||||||
@@ -124,13 +136,7 @@ namespace FlaxEditor.GUI
|
|||||||
if (!string.IsNullOrEmpty(_text))
|
if (!string.IsNullOrEmpty(_text))
|
||||||
{
|
{
|
||||||
textRect.Size.X = Width - DefaultMargin - textRect.Left;
|
textRect.Size.X = Width - DefaultMargin - textRect.Left;
|
||||||
Render2D.DrawText(
|
Render2D.DrawText(style.FontMedium, _text, textRect, enabled ? style.Foreground : style.ForegroundDisabled, TextAlignment.Near, TextAlignment.Center);
|
||||||
style.FontMedium,
|
|
||||||
_text,
|
|
||||||
textRect,
|
|
||||||
enabled ? style.Foreground : style.ForegroundDisabled,
|
|
||||||
TextAlignment.Near,
|
|
||||||
TextAlignment.Center);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -155,9 +161,13 @@ namespace FlaxEditor.GUI
|
|||||||
{
|
{
|
||||||
if (button == MouseButton.Left)
|
if (button == MouseButton.Left)
|
||||||
{
|
{
|
||||||
// Set flag
|
_primaryMouseDown = true;
|
||||||
_mouseDown = true;
|
Focus();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (button == MouseButton.Right)
|
||||||
|
{
|
||||||
|
_secondaryMouseDown = true;
|
||||||
Focus();
|
Focus();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -168,12 +178,9 @@ namespace FlaxEditor.GUI
|
|||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public override bool OnMouseUp(Float2 location, MouseButton button)
|
public override bool OnMouseUp(Float2 location, MouseButton button)
|
||||||
{
|
{
|
||||||
if (button == MouseButton.Left && _mouseDown)
|
if (button == MouseButton.Left && _primaryMouseDown)
|
||||||
{
|
{
|
||||||
// Clear flag
|
_primaryMouseDown = false;
|
||||||
_mouseDown = false;
|
|
||||||
|
|
||||||
// Fire events
|
|
||||||
if (AutoCheck)
|
if (AutoCheck)
|
||||||
Checked = !Checked;
|
Checked = !Checked;
|
||||||
Clicked?.Invoke();
|
Clicked?.Invoke();
|
||||||
@@ -181,6 +188,14 @@ namespace FlaxEditor.GUI
|
|||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
if (button == MouseButton.Right && _secondaryMouseDown)
|
||||||
|
{
|
||||||
|
_secondaryMouseDown = false;
|
||||||
|
SecondaryClicked?.Invoke();
|
||||||
|
(Parent as ToolStrip)?.OnSecondaryButtonClicked(this);
|
||||||
|
ContextMenu?.Show(this, new Float2(0, Height));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
return base.OnMouseUp(location, button);
|
return base.OnMouseUp(location, button);
|
||||||
}
|
}
|
||||||
@@ -188,8 +203,8 @@ namespace FlaxEditor.GUI
|
|||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public override void OnMouseLeave()
|
public override void OnMouseLeave()
|
||||||
{
|
{
|
||||||
// Clear flag
|
_primaryMouseDown = false;
|
||||||
_mouseDown = false;
|
_secondaryMouseDown = false;
|
||||||
|
|
||||||
base.OnMouseLeave();
|
base.OnMouseLeave();
|
||||||
}
|
}
|
||||||
@@ -197,8 +212,8 @@ namespace FlaxEditor.GUI
|
|||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public override void OnLostFocus()
|
public override void OnLostFocus()
|
||||||
{
|
{
|
||||||
// Clear flag
|
_primaryMouseDown = false;
|
||||||
_mouseDown = false;
|
_secondaryMouseDown = false;
|
||||||
|
|
||||||
base.OnLostFocus();
|
base.OnLostFocus();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -46,20 +46,19 @@ namespace FlaxEditor.Gizmo
|
|||||||
var plane = new Plane(Vector3.Zero, Vector3.UnitY);
|
var plane = new Plane(Vector3.Zero, Vector3.UnitY);
|
||||||
var dst = CollisionsHelper.DistancePlanePoint(ref plane, ref viewPos);
|
var dst = CollisionsHelper.DistancePlanePoint(ref plane, ref viewPos);
|
||||||
|
|
||||||
float space, size;
|
float space = Editor.Instance.Options.Options.Viewport.ViewportGridScale, size;
|
||||||
if (dst <= 500.0f)
|
if (dst <= 500.0f)
|
||||||
{
|
{
|
||||||
space = 50;
|
|
||||||
size = 8000;
|
size = 8000;
|
||||||
}
|
}
|
||||||
else if (dst <= 2000.0f)
|
else if (dst <= 2000.0f)
|
||||||
{
|
{
|
||||||
space = 100;
|
space *= 2;
|
||||||
size = 8000;
|
size = 8000;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
space = 1000;
|
space *= 20;
|
||||||
size = 100000;
|
size = 100000;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -469,7 +469,7 @@ namespace FlaxEditor.Gizmo
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Apply transformation (but to the parents, not whole selection pool)
|
// Apply transformation (but to the parents, not whole selection pool)
|
||||||
if (anyValid || (!_isTransforming && Owner.UseDuplicate))
|
if (anyValid || (_isTransforming && Owner.UseDuplicate))
|
||||||
{
|
{
|
||||||
StartTransforming();
|
StartTransforming();
|
||||||
LastDelta = new Transform(translationDelta, rotationDelta, scaleDelta);
|
LastDelta = new Transform(translationDelta, rotationDelta, scaleDelta);
|
||||||
|
|||||||
@@ -37,6 +37,11 @@ namespace FlaxEditor.Modules
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public event Action<Prefab, Actor> PrefabApplied;
|
public event Action<Prefab, Actor> PrefabApplied;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Locally cached actor for prefab creation.
|
||||||
|
/// </summary>
|
||||||
|
private Actor _prefabCreationActor;
|
||||||
|
|
||||||
internal PrefabsModule(Editor editor)
|
internal PrefabsModule(Editor editor)
|
||||||
: base(editor)
|
: base(editor)
|
||||||
{
|
{
|
||||||
@@ -78,6 +83,16 @@ namespace FlaxEditor.Modules
|
|||||||
/// </remarks>
|
/// </remarks>
|
||||||
/// <param name="actor">The root prefab actor.</param>
|
/// <param name="actor">The root prefab actor.</param>
|
||||||
public void CreatePrefab(Actor actor)
|
public void CreatePrefab(Actor actor)
|
||||||
|
{
|
||||||
|
CreatePrefab(actor, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Starts the creating prefab for the given actor by showing the new item creation dialog in <see cref="ContentWindow"/>.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="actor">The root prefab actor.</param>
|
||||||
|
/// <param name="rename">Allow renaming or not</param>
|
||||||
|
public void CreatePrefab(Actor actor, bool rename)
|
||||||
{
|
{
|
||||||
// Skip in invalid states
|
// Skip in invalid states
|
||||||
if (!Editor.StateMachine.CurrentState.CanEditContent)
|
if (!Editor.StateMachine.CurrentState.CanEditContent)
|
||||||
@@ -90,7 +105,8 @@ namespace FlaxEditor.Modules
|
|||||||
PrefabCreating?.Invoke(actor);
|
PrefabCreating?.Invoke(actor);
|
||||||
|
|
||||||
var proxy = Editor.ContentDatabase.GetProxy<Prefab>();
|
var proxy = Editor.ContentDatabase.GetProxy<Prefab>();
|
||||||
Editor.Windows.ContentWin.NewItem(proxy, actor, OnPrefabCreated, actor.Name);
|
_prefabCreationActor = actor;
|
||||||
|
Editor.Windows.ContentWin.NewItem(proxy, actor, OnPrefabCreated, actor.Name, rename);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void OnPrefabCreated(ContentItem contentItem)
|
private void OnPrefabCreated(ContentItem contentItem)
|
||||||
@@ -107,25 +123,21 @@ namespace FlaxEditor.Modules
|
|||||||
// Record undo for prefab creating (backend links the target instance with the prefab)
|
// Record undo for prefab creating (backend links the target instance with the prefab)
|
||||||
if (Editor.Undo.Enabled)
|
if (Editor.Undo.Enabled)
|
||||||
{
|
{
|
||||||
var selection = Editor.SceneEditing.Selection.Where(x => x is ActorNode).ToList().BuildNodesParents();
|
if (!_prefabCreationActor)
|
||||||
if (selection.Count == 0)
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (selection.Count == 1)
|
var actorsList = new List<Actor>();
|
||||||
|
Utilities.Utils.GetActorsTree(actorsList, _prefabCreationActor);
|
||||||
|
|
||||||
|
var actions = new IUndoAction[actorsList.Count];
|
||||||
|
for (int i = 0; i < actorsList.Count; i++)
|
||||||
{
|
{
|
||||||
var action = BreakPrefabLinkAction.Linked(((ActorNode)selection[0]).Actor);
|
var action = BreakPrefabLinkAction.Linked(actorsList[i]);
|
||||||
Undo.AddAction(action);
|
actions[i] = action;
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
var actions = new IUndoAction[selection.Count];
|
|
||||||
for (int i = 0; i < selection.Count; i++)
|
|
||||||
{
|
|
||||||
var action = BreakPrefabLinkAction.Linked(((ActorNode)selection[i]).Actor);
|
|
||||||
actions[i] = action;
|
|
||||||
}
|
|
||||||
Undo.AddAction(new MultiUndoAction(actions));
|
|
||||||
}
|
}
|
||||||
|
Undo.AddAction(new MultiUndoAction(actions));
|
||||||
|
|
||||||
|
_prefabCreationActor = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
Editor.Instance.Windows.PropertiesWin.Presenter.BuildLayout();
|
Editor.Instance.Windows.PropertiesWin.Presenter.BuildLayout();
|
||||||
|
|||||||
@@ -20,6 +20,8 @@ using FlaxEngine.GUI;
|
|||||||
using FlaxEngine.Json;
|
using FlaxEngine.Json;
|
||||||
using DockHintWindow = FlaxEditor.GUI.Docking.DockHintWindow;
|
using DockHintWindow = FlaxEditor.GUI.Docking.DockHintWindow;
|
||||||
using MasterDockPanel = FlaxEditor.GUI.Docking.MasterDockPanel;
|
using MasterDockPanel = FlaxEditor.GUI.Docking.MasterDockPanel;
|
||||||
|
using FlaxEditor.Content.Settings;
|
||||||
|
using FlaxEditor.Options;
|
||||||
|
|
||||||
namespace FlaxEditor.Modules
|
namespace FlaxEditor.Modules
|
||||||
{
|
{
|
||||||
@@ -36,6 +38,9 @@ namespace FlaxEditor.Modules
|
|||||||
private ContentStats _contentStats;
|
private ContentStats _contentStats;
|
||||||
private bool _progressFailed;
|
private bool _progressFailed;
|
||||||
|
|
||||||
|
ContextMenuSingleSelectGroup<int> _numberOfClientsGroup = new ContextMenuSingleSelectGroup<int>();
|
||||||
|
private Scene[] _scenesToReload;
|
||||||
|
|
||||||
private ContextMenuButton _menuFileSaveScenes;
|
private ContextMenuButton _menuFileSaveScenes;
|
||||||
private ContextMenuButton _menuFileCloseScenes;
|
private ContextMenuButton _menuFileCloseScenes;
|
||||||
private ContextMenuButton _menuFileGenerateScriptsProjectFiles;
|
private ContextMenuButton _menuFileGenerateScriptsProjectFiles;
|
||||||
@@ -54,7 +59,9 @@ namespace FlaxEditor.Modules
|
|||||||
private ContextMenuButton _menuSceneAlignViewportWithActor;
|
private ContextMenuButton _menuSceneAlignViewportWithActor;
|
||||||
private ContextMenuButton _menuScenePilotActor;
|
private ContextMenuButton _menuScenePilotActor;
|
||||||
private ContextMenuButton _menuSceneCreateTerrain;
|
private ContextMenuButton _menuSceneCreateTerrain;
|
||||||
private ContextMenuButton _menuGamePlay;
|
private ContextMenuButton _menuGamePlayGame;
|
||||||
|
private ContextMenuButton _menuGamePlayCurrentScenes;
|
||||||
|
private ContextMenuButton _menuGameStop;
|
||||||
private ContextMenuButton _menuGamePause;
|
private ContextMenuButton _menuGamePause;
|
||||||
private ContextMenuButton _menuToolsBuildScenes;
|
private ContextMenuButton _menuToolsBuildScenes;
|
||||||
private ContextMenuButton _menuToolsBakeLightmaps;
|
private ContextMenuButton _menuToolsBakeLightmaps;
|
||||||
@@ -74,6 +81,7 @@ namespace FlaxEditor.Modules
|
|||||||
private ToolStripButton _toolStripRotate;
|
private ToolStripButton _toolStripRotate;
|
||||||
private ToolStripButton _toolStripScale;
|
private ToolStripButton _toolStripScale;
|
||||||
private ToolStripButton _toolStripBuildScenes;
|
private ToolStripButton _toolStripBuildScenes;
|
||||||
|
private ToolStripButton _toolStripCook;
|
||||||
private ToolStripButton _toolStripPlay;
|
private ToolStripButton _toolStripPlay;
|
||||||
private ToolStripButton _toolStripPause;
|
private ToolStripButton _toolStripPause;
|
||||||
private ToolStripButton _toolStripStep;
|
private ToolStripButton _toolStripStep;
|
||||||
@@ -195,6 +203,7 @@ namespace FlaxEditor.Modules
|
|||||||
_toolStripScale.Checked = gizmoMode == TransformGizmoBase.Mode.Scale;
|
_toolStripScale.Checked = gizmoMode == TransformGizmoBase.Mode.Scale;
|
||||||
//
|
//
|
||||||
_toolStripBuildScenes.Enabled = (canEditScene && !isPlayMode) || Editor.StateMachine.BuildingScenesState.IsActive;
|
_toolStripBuildScenes.Enabled = (canEditScene && !isPlayMode) || Editor.StateMachine.BuildingScenesState.IsActive;
|
||||||
|
_toolStripCook.Enabled = Editor.Windows.GameCookerWin.CanBuild(Platform.PlatformType) && !GameCooker.IsRunning;
|
||||||
//
|
//
|
||||||
var play = _toolStripPlay;
|
var play = _toolStripPlay;
|
||||||
var pause = _toolStripPause;
|
var pause = _toolStripPause;
|
||||||
@@ -351,6 +360,7 @@ namespace FlaxEditor.Modules
|
|||||||
// Update window background
|
// Update window background
|
||||||
mainWindow.BackgroundColor = Style.Current.Background;
|
mainWindow.BackgroundColor = Style.Current.Background;
|
||||||
|
|
||||||
|
InitSharedMenus();
|
||||||
InitMainMenu(mainWindow);
|
InitMainMenu(mainWindow);
|
||||||
InitToolstrip(mainWindow);
|
InitToolstrip(mainWindow);
|
||||||
InitStatusBar(mainWindow);
|
InitStatusBar(mainWindow);
|
||||||
@@ -409,6 +419,7 @@ namespace FlaxEditor.Modules
|
|||||||
Editor.Undo.UndoDone += OnUndoEvent;
|
Editor.Undo.UndoDone += OnUndoEvent;
|
||||||
Editor.Undo.RedoDone += OnUndoEvent;
|
Editor.Undo.RedoDone += OnUndoEvent;
|
||||||
Editor.Undo.ActionDone += OnUndoEvent;
|
Editor.Undo.ActionDone += OnUndoEvent;
|
||||||
|
GameCooker.Event += OnGameCookerEvent;
|
||||||
|
|
||||||
UpdateToolstrip();
|
UpdateToolstrip();
|
||||||
}
|
}
|
||||||
@@ -424,6 +435,11 @@ namespace FlaxEditor.Modules
|
|||||||
UpdateStatusBar();
|
UpdateStatusBar();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void OnGameCookerEvent(GameCooker.EventType type)
|
||||||
|
{
|
||||||
|
UpdateToolstrip();
|
||||||
|
}
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public override void OnExit()
|
public override void OnExit()
|
||||||
{
|
{
|
||||||
@@ -466,6 +482,22 @@ namespace FlaxEditor.Modules
|
|||||||
return dialog;
|
return dialog;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void InitSharedMenus()
|
||||||
|
{
|
||||||
|
for (int i = 1; i <= 4; i++)
|
||||||
|
_numberOfClientsGroup.AddItem(i.ToString(), i);
|
||||||
|
|
||||||
|
_numberOfClientsGroup.Selected = Editor.Options.Options.Interface.NumberOfGameClientsToLaunch;
|
||||||
|
_numberOfClientsGroup.SelectedChanged = value =>
|
||||||
|
{
|
||||||
|
var options = Editor.Options.Options;
|
||||||
|
options.Interface.NumberOfGameClientsToLaunch = value;
|
||||||
|
Editor.Options.Apply(options);
|
||||||
|
};
|
||||||
|
|
||||||
|
Editor.Options.OptionsChanged += options => { _numberOfClientsGroup.Selected = options.Interface.NumberOfGameClientsToLaunch; };
|
||||||
|
}
|
||||||
|
|
||||||
private void InitMainMenu(RootControl mainWindow)
|
private void InitMainMenu(RootControl mainWindow)
|
||||||
{
|
{
|
||||||
MainMenu = new MainMenu(mainWindow)
|
MainMenu = new MainMenu(mainWindow)
|
||||||
@@ -523,11 +555,19 @@ namespace FlaxEditor.Modules
|
|||||||
MenuGame = MainMenu.AddButton("Game");
|
MenuGame = MainMenu.AddButton("Game");
|
||||||
cm = MenuGame.ContextMenu;
|
cm = MenuGame.ContextMenu;
|
||||||
cm.VisibleChanged += OnMenuGameShowHide;
|
cm.VisibleChanged += OnMenuGameShowHide;
|
||||||
_menuGamePlay = cm.AddButton("Play", inputOptions.Play.ToString(), Editor.Simulation.RequestStartPlay);
|
|
||||||
|
_menuGamePlayGame = cm.AddButton("Play Game", PlayGame);
|
||||||
|
_menuGamePlayCurrentScenes = cm.AddButton("Play Current Scenes", inputOptions.Play.ToString(), PlayScenes);
|
||||||
|
_menuGameStop = cm.AddButton("Stop Game", Editor.Simulation.RequestStopPlay);
|
||||||
_menuGamePause = cm.AddButton("Pause", inputOptions.Pause.ToString(), Editor.Simulation.RequestPausePlay);
|
_menuGamePause = cm.AddButton("Pause", inputOptions.Pause.ToString(), Editor.Simulation.RequestPausePlay);
|
||||||
|
|
||||||
cm.AddSeparator();
|
cm.AddSeparator();
|
||||||
cm.AddButton("Cook & Run", Editor.Windows.GameCookerWin.BuildAndRun).LinkTooltip("Runs Game Cooker to build the game for this platform and runs the game after.");
|
var numberOfClientsMenu = cm.AddChildMenu("Number of game clients");
|
||||||
cm.AddButton("Run cooked game", Editor.Windows.GameCookerWin.RunCooked).LinkTooltip("Runs the game build from the last cooking output. Use Cook&Play or Game Cooker first.");
|
_numberOfClientsGroup.AddItemsToContextMenu(numberOfClientsMenu.ContextMenu);
|
||||||
|
|
||||||
|
cm.AddSeparator();
|
||||||
|
cm.AddButton("Cook & Run", CookAndRun).LinkTooltip("Runs Game Cooker to build the game for this platform and runs the game after.");
|
||||||
|
cm.AddButton("Run cooked game", RunCookedGame).LinkTooltip("Runs the game build from the last cooking output. Use Cook&Play or Game Cooker first.");
|
||||||
|
|
||||||
// Tools
|
// Tools
|
||||||
MenuTools = MainMenu.AddButton("Tools");
|
MenuTools = MainMenu.AddButton("Tools");
|
||||||
@@ -603,7 +643,7 @@ namespace FlaxEditor.Modules
|
|||||||
_menuEditDuplicate.ShortKeys = inputOptions.Duplicate.ToString();
|
_menuEditDuplicate.ShortKeys = inputOptions.Duplicate.ToString();
|
||||||
_menuEditSelectAll.ShortKeys = inputOptions.SelectAll.ToString();
|
_menuEditSelectAll.ShortKeys = inputOptions.SelectAll.ToString();
|
||||||
_menuEditFind.ShortKeys = inputOptions.Search.ToString();
|
_menuEditFind.ShortKeys = inputOptions.Search.ToString();
|
||||||
_menuGamePlay.ShortKeys = inputOptions.Play.ToString();
|
_menuGamePlayCurrentScenes.ShortKeys = inputOptions.Play.ToString();
|
||||||
_menuGamePause.ShortKeys = inputOptions.Pause.ToString();
|
_menuGamePause.ShortKeys = inputOptions.Pause.ToString();
|
||||||
|
|
||||||
MainMenuShortcutKeysUpdated?.Invoke();
|
MainMenuShortcutKeysUpdated?.Invoke();
|
||||||
@@ -611,6 +651,8 @@ namespace FlaxEditor.Modules
|
|||||||
|
|
||||||
private void InitToolstrip(RootControl mainWindow)
|
private void InitToolstrip(RootControl mainWindow)
|
||||||
{
|
{
|
||||||
|
var inputOptions = Editor.Options.Options.Input;
|
||||||
|
|
||||||
ToolStrip = new ToolStrip(34.0f, MainMenu.Bottom)
|
ToolStrip = new ToolStrip(34.0f, MainMenu.Bottom)
|
||||||
{
|
{
|
||||||
Parent = mainWindow,
|
Parent = mainWindow,
|
||||||
@@ -625,10 +667,33 @@ namespace FlaxEditor.Modules
|
|||||||
_toolStripRotate = (ToolStripButton)ToolStrip.AddButton(Editor.Icons.Rotate32, () => Editor.MainTransformGizmo.ActiveMode = TransformGizmoBase.Mode.Rotate).LinkTooltip("Change Gizmo tool mode to Rotate (2)");
|
_toolStripRotate = (ToolStripButton)ToolStrip.AddButton(Editor.Icons.Rotate32, () => Editor.MainTransformGizmo.ActiveMode = TransformGizmoBase.Mode.Rotate).LinkTooltip("Change Gizmo tool mode to Rotate (2)");
|
||||||
_toolStripScale = (ToolStripButton)ToolStrip.AddButton(Editor.Icons.Scale32, () => Editor.MainTransformGizmo.ActiveMode = TransformGizmoBase.Mode.Scale).LinkTooltip("Change Gizmo tool mode to Scale (3)");
|
_toolStripScale = (ToolStripButton)ToolStrip.AddButton(Editor.Icons.Scale32, () => Editor.MainTransformGizmo.ActiveMode = TransformGizmoBase.Mode.Scale).LinkTooltip("Change Gizmo tool mode to Scale (3)");
|
||||||
ToolStrip.AddSeparator();
|
ToolStrip.AddSeparator();
|
||||||
|
|
||||||
|
// Cook scenes
|
||||||
_toolStripBuildScenes = (ToolStripButton)ToolStrip.AddButton(Editor.Icons.Build64, Editor.BuildScenesOrCancel).LinkTooltip("Build scenes data - CSG, navmesh, static lighting, env probes - configurable via Build Actions in editor options (Ctrl+F10)");
|
_toolStripBuildScenes = (ToolStripButton)ToolStrip.AddButton(Editor.Icons.Build64, Editor.BuildScenesOrCancel).LinkTooltip("Build scenes data - CSG, navmesh, static lighting, env probes - configurable via Build Actions in editor options (Ctrl+F10)");
|
||||||
|
|
||||||
|
// Cook and run
|
||||||
|
_toolStripCook = (ToolStripButton)ToolStrip.AddButton(Editor.Icons.ShipIt64, CookAndRun).LinkTooltip("Cook & Run - build game for the current platform and run it locally");
|
||||||
|
_toolStripCook.ContextMenu = new ContextMenu();
|
||||||
|
_toolStripCook.ContextMenu.AddButton("Run cooked game", RunCookedGame);
|
||||||
|
_toolStripCook.ContextMenu.AddSeparator();
|
||||||
|
var numberOfClientsMenu = _toolStripCook.ContextMenu.AddChildMenu("Number of game clients");
|
||||||
|
_numberOfClientsGroup.AddItemsToContextMenu(numberOfClientsMenu.ContextMenu);
|
||||||
|
|
||||||
ToolStrip.AddSeparator();
|
ToolStrip.AddSeparator();
|
||||||
_toolStripPlay = (ToolStripButton)ToolStrip.AddButton(Editor.Icons.Play64, Editor.Simulation.RequestPlayOrStopPlay).LinkTooltip("Start/Stop game (F5)");
|
|
||||||
_toolStripPause = (ToolStripButton)ToolStrip.AddButton(Editor.Icons.Pause64, Editor.Simulation.RequestResumeOrPause).LinkTooltip("Pause/Resume game(F6)");
|
// Play
|
||||||
|
_toolStripPlay = (ToolStripButton)ToolStrip.AddButton(Editor.Icons.Play64, OnPlayPressed).LinkTooltip("Play Game");
|
||||||
|
_toolStripPlay.ContextMenu = new ContextMenu();
|
||||||
|
var playSubMenu = _toolStripPlay.ContextMenu.AddChildMenu("Play button action");
|
||||||
|
var playActionGroup = new ContextMenuSingleSelectGroup<InterfaceOptions.PlayAction>();
|
||||||
|
playActionGroup.AddItem("Play Game", InterfaceOptions.PlayAction.PlayGame, null, "Launches the game from the First Scene defined in the project settings.");
|
||||||
|
playActionGroup.AddItem("Play Scenes", InterfaceOptions.PlayAction.PlayScenes, null, "Launches the game using the scenes currently loaded in the editor.");
|
||||||
|
playActionGroup.AddItemsToContextMenu(playSubMenu.ContextMenu);
|
||||||
|
playActionGroup.Selected = Editor.Options.Options.Interface.PlayButtonAction;
|
||||||
|
playActionGroup.SelectedChanged = SetPlayAction;
|
||||||
|
Editor.Options.OptionsChanged += options => { playActionGroup.Selected = options.Interface.PlayButtonAction; };
|
||||||
|
|
||||||
|
_toolStripPause = (ToolStripButton)ToolStrip.AddButton(Editor.Icons.Pause64, Editor.Simulation.RequestResumeOrPause).LinkTooltip($"Pause/Resume game({inputOptions.Pause})");
|
||||||
_toolStripStep = (ToolStripButton)ToolStrip.AddButton(Editor.Icons.Skip64, Editor.Simulation.RequestPlayOneFrame).LinkTooltip("Step one frame in game");
|
_toolStripStep = (ToolStripButton)ToolStrip.AddButton(Editor.Icons.Skip64, Editor.Simulation.RequestPlayOneFrame).LinkTooltip("Step one frame in game");
|
||||||
|
|
||||||
UpdateToolstrip();
|
UpdateToolstrip();
|
||||||
@@ -663,10 +728,7 @@ namespace FlaxEditor.Modules
|
|||||||
var defaultTextColor = StatusBar.TextColor;
|
var defaultTextColor = StatusBar.TextColor;
|
||||||
_outputLogButton.HoverBegin += () => StatusBar.TextColor = Style.Current.BackgroundSelected;
|
_outputLogButton.HoverBegin += () => StatusBar.TextColor = Style.Current.BackgroundSelected;
|
||||||
_outputLogButton.HoverEnd += () => StatusBar.TextColor = defaultTextColor;
|
_outputLogButton.HoverEnd += () => StatusBar.TextColor = defaultTextColor;
|
||||||
_outputLogButton.Clicked += () =>
|
_outputLogButton.Clicked += () => { Editor.Windows.OutputLogWin.FocusOrShow(); };
|
||||||
{
|
|
||||||
Editor.Windows.OutputLogWin.FocusOrShow();
|
|
||||||
};
|
|
||||||
|
|
||||||
// Progress bar with label
|
// Progress bar with label
|
||||||
const float progressBarWidth = 120.0f;
|
const float progressBarWidth = 120.0f;
|
||||||
@@ -786,7 +848,9 @@ namespace FlaxEditor.Modules
|
|||||||
var isPlayMode = Editor.StateMachine.IsPlayMode;
|
var isPlayMode = Editor.StateMachine.IsPlayMode;
|
||||||
var canPlay = Level.IsAnySceneLoaded;
|
var canPlay = Level.IsAnySceneLoaded;
|
||||||
|
|
||||||
_menuGamePlay.Enabled = !isPlayMode && canPlay;
|
_menuGamePlayGame.Enabled = !isPlayMode && canPlay;
|
||||||
|
_menuGamePlayCurrentScenes.Enabled = !isPlayMode && canPlay;
|
||||||
|
_menuGameStop.Enabled = isPlayMode && canPlay;
|
||||||
_menuGamePause.Enabled = isPlayMode && canPlay;
|
_menuGamePause.Enabled = isPlayMode && canPlay;
|
||||||
|
|
||||||
c.PerformLayout();
|
c.PerformLayout();
|
||||||
@@ -968,6 +1032,72 @@ namespace FlaxEditor.Modules
|
|||||||
projectInfo.Save();
|
projectInfo.Save();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void SetPlayAction(InterfaceOptions.PlayAction newPlayAction)
|
||||||
|
{
|
||||||
|
var options = Editor.Options.Options;
|
||||||
|
options.Interface.PlayButtonAction = newPlayAction;
|
||||||
|
Editor.Options.Apply(options);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnPlayPressed()
|
||||||
|
{
|
||||||
|
switch (Editor.Options.Options.Interface.PlayButtonAction)
|
||||||
|
{
|
||||||
|
case InterfaceOptions.PlayAction.PlayGame:
|
||||||
|
if (Editor.IsPlayMode)
|
||||||
|
Editor.Simulation.RequestStopPlay();
|
||||||
|
else
|
||||||
|
PlayGame();
|
||||||
|
return;
|
||||||
|
case InterfaceOptions.PlayAction.PlayScenes:
|
||||||
|
PlayScenes();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void PlayGame()
|
||||||
|
{
|
||||||
|
var firstScene = GameSettings.Load().FirstScene;
|
||||||
|
if (firstScene == Guid.Empty)
|
||||||
|
{
|
||||||
|
if (Level.IsAnySceneLoaded)
|
||||||
|
Editor.Simulation.RequestStartPlay();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
_scenesToReload = Level.Scenes;
|
||||||
|
Level.UnloadAllScenes();
|
||||||
|
Level.LoadScene(firstScene);
|
||||||
|
|
||||||
|
Editor.PlayModeEnd += OnPlayGameSceneEnding;
|
||||||
|
Editor.Simulation.RequestPlayOrStopPlay();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnPlayGameSceneEnding()
|
||||||
|
{
|
||||||
|
Editor.PlayModeEnd -= OnPlayGameSceneEnding;
|
||||||
|
|
||||||
|
Level.UnloadAllScenes();
|
||||||
|
|
||||||
|
foreach (var scene in _scenesToReload)
|
||||||
|
Level.LoadScene(scene.ID);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void PlayScenes()
|
||||||
|
{
|
||||||
|
Editor.Simulation.RequestPlayOrStopPlay();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CookAndRun()
|
||||||
|
{
|
||||||
|
Editor.Windows.GameCookerWin.BuildAndRun();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void RunCookedGame()
|
||||||
|
{
|
||||||
|
Editor.Windows.GameCookerWin.RunCooked();
|
||||||
|
}
|
||||||
|
|
||||||
private void OnMainWindowClosing()
|
private void OnMainWindowClosing()
|
||||||
{
|
{
|
||||||
// Clear UI references (GUI cannot be used after window closing)
|
// Clear UI references (GUI cannot be used after window closing)
|
||||||
|
|||||||
@@ -74,6 +74,22 @@ namespace FlaxEditor.Options
|
|||||||
DockBottom = DockState.DockBottom
|
DockBottom = DockState.DockBottom
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Options for the action taken by the play button.
|
||||||
|
/// </summary>
|
||||||
|
public enum PlayAction
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Launches the game from the First Scene defined in the project settings.
|
||||||
|
/// </summary>
|
||||||
|
PlayGame,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Launches the game using the scenes currently loaded in the editor.
|
||||||
|
/// </summary>
|
||||||
|
PlayScenes,
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the Editor User Interface scale. Applied to all UI elements, windows and text. Can be used to scale the interface up on a bigger display. Editor restart required.
|
/// Gets or sets the Editor User Interface scale. Applied to all UI elements, windows and text. Can be used to scale the interface up on a bigger display. Editor restart required.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -82,14 +98,12 @@ namespace FlaxEditor.Options
|
|||||||
public float InterfaceScale { get; set; } = 1.0f;
|
public float InterfaceScale { get; set; } = 1.0f;
|
||||||
|
|
||||||
#if PLATFORM_WINDOWS
|
#if PLATFORM_WINDOWS
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets a value indicating whether use native window title bar. Editor restart required.
|
/// Gets or sets a value indicating whether use native window title bar. Editor restart required.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[DefaultValue(false)]
|
[DefaultValue(false)]
|
||||||
[EditorDisplay("Interface"), EditorOrder(70), Tooltip("Determines whether use native window title bar. Editor restart required.")]
|
[EditorDisplay("Interface"), EditorOrder(70), Tooltip("Determines whether use native window title bar. Editor restart required.")]
|
||||||
public bool UseNativeWindowSystem { get; set; } = false;
|
public bool UseNativeWindowSystem { get; set; } = false;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -196,30 +210,44 @@ namespace FlaxEditor.Options
|
|||||||
[EditorDisplay("Play In-Editor", "Focus Game Window On Play"), EditorOrder(400), Tooltip("Determines whether auto-focus game window on play mode start.")]
|
[EditorDisplay("Play In-Editor", "Focus Game Window On Play"), EditorOrder(400), Tooltip("Determines whether auto-focus game window on play mode start.")]
|
||||||
public bool FocusGameWinOnPlay { get; set; } = true;
|
public bool FocusGameWinOnPlay { get; set; } = true;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets a value indicating what action should be taken upon pressing the play button.
|
||||||
|
/// </summary>
|
||||||
|
[DefaultValue(PlayAction.PlayScenes)]
|
||||||
|
[EditorDisplay("Play In-Editor", "Play Button Action"), EditorOrder(410)]
|
||||||
|
public PlayAction PlayButtonAction { get; set; } = PlayAction.PlayScenes;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets a value indicating the number of game clients to launch when building and/or running cooked game.
|
||||||
|
/// </summary>
|
||||||
|
[DefaultValue(1), Range(1, 4)]
|
||||||
|
[EditorDisplay("Cook & Run"), EditorOrder(500)]
|
||||||
|
public int NumberOfGameClientsToLaunch = 1;
|
||||||
|
|
||||||
private static FontAsset DefaultFont => FlaxEngine.Content.LoadAsyncInternal<FontAsset>(EditorAssets.PrimaryFont);
|
private static FontAsset DefaultFont => FlaxEngine.Content.LoadAsyncInternal<FontAsset>(EditorAssets.PrimaryFont);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the title font for editor UI.
|
/// Gets or sets the title font for editor UI.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[EditorDisplay("Fonts"), EditorOrder(500), Tooltip("The title font for editor UI.")]
|
[EditorDisplay("Fonts"), EditorOrder(600), Tooltip("The title font for editor UI.")]
|
||||||
public FontReference TitleFont { get; set; } = new FontReference(DefaultFont, 18);
|
public FontReference TitleFont { get; set; } = new FontReference(DefaultFont, 18);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the large font for editor UI.
|
/// Gets or sets the large font for editor UI.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[EditorDisplay("Fonts"), EditorOrder(510), Tooltip("The large font for editor UI.")]
|
[EditorDisplay("Fonts"), EditorOrder(610), Tooltip("The large font for editor UI.")]
|
||||||
public FontReference LargeFont { get; set; } = new FontReference(DefaultFont, 14);
|
public FontReference LargeFont { get; set; } = new FontReference(DefaultFont, 14);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the medium font for editor UI.
|
/// Gets or sets the medium font for editor UI.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[EditorDisplay("Fonts"), EditorOrder(520), Tooltip("The medium font for editor UI.")]
|
[EditorDisplay("Fonts"), EditorOrder(620), Tooltip("The medium font for editor UI.")]
|
||||||
public FontReference MediumFont { get; set; } = new FontReference(DefaultFont, 9);
|
public FontReference MediumFont { get; set; } = new FontReference(DefaultFont, 9);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the small font for editor UI.
|
/// Gets or sets the small font for editor UI.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[EditorDisplay("Fonts"), EditorOrder(530), Tooltip("The small font for editor UI.")]
|
[EditorDisplay("Fonts"), EditorOrder(630), Tooltip("The small font for editor UI.")]
|
||||||
public FontReference SmallFont { get; set; } = new FontReference(DefaultFont, 9);
|
public FontReference SmallFont { get; set; } = new FontReference(DefaultFont, 9);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -59,5 +59,12 @@ namespace FlaxEditor.Options
|
|||||||
[DefaultValue(false)]
|
[DefaultValue(false)]
|
||||||
[EditorDisplay("Defaults"), EditorOrder(150), Tooltip("Invert the panning direction for the viewport camera.")]
|
[EditorDisplay("Defaults"), EditorOrder(150), Tooltip("Invert the panning direction for the viewport camera.")]
|
||||||
public bool DefaultInvertPanning { get; set; } = false;
|
public bool DefaultInvertPanning { get; set; } = false;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Scales editor viewport grid.
|
||||||
|
/// </summary>
|
||||||
|
[DefaultValue(50.0f), Limit(25.0f, 500.0f, 5.0f)]
|
||||||
|
[EditorDisplay("Defaults"), EditorOrder(160), Tooltip("Scales editor viewport grid.")]
|
||||||
|
public float ViewportGridScale { get; set; } = 50.0f;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -238,6 +238,7 @@ namespace FlaxEditor.Windows
|
|||||||
{
|
{
|
||||||
[EditorDisplay(null, "arm64")]
|
[EditorDisplay(null, "arm64")]
|
||||||
ARM64,
|
ARM64,
|
||||||
|
|
||||||
[EditorDisplay(null, "x64")]
|
[EditorDisplay(null, "x64")]
|
||||||
x64,
|
x64,
|
||||||
}
|
}
|
||||||
@@ -614,6 +615,18 @@ namespace FlaxEditor.Windows
|
|||||||
_exitOnBuildEnd = true;
|
_exitOnBuildEnd = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Returns true if can build for the given platform (both supported and available).
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="platformType">The platform.</param>
|
||||||
|
/// <returns>True if can build, otherwise false.</returns>
|
||||||
|
public bool CanBuild(PlatformType platformType)
|
||||||
|
{
|
||||||
|
if (_buildTabProxy.PerPlatformOptions.TryGetValue(platformType, out var platform))
|
||||||
|
return platform.IsAvailable && platform.IsSupported;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Builds all the targets from the given preset.
|
/// Builds all the targets from the given preset.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -659,16 +672,24 @@ namespace FlaxEditor.Windows
|
|||||||
{
|
{
|
||||||
Editor.Log("Building and running");
|
Editor.Log("Building and running");
|
||||||
GameCooker.GetCurrentPlatform(out var platform, out var buildPlatform, out var buildConfiguration);
|
GameCooker.GetCurrentPlatform(out var platform, out var buildPlatform, out var buildConfiguration);
|
||||||
_buildingQueue.Enqueue(new QueueItem
|
var numberOfClients = Editor.Options.Options.Interface.NumberOfGameClientsToLaunch;
|
||||||
|
for (int i = 0; i < numberOfClients; i++)
|
||||||
{
|
{
|
||||||
Target = new BuildTarget
|
var buildOptions = BuildOptions.AutoRun;
|
||||||
|
if (i > 0)
|
||||||
|
buildOptions |= BuildOptions.NoCook;
|
||||||
|
|
||||||
|
_buildingQueue.Enqueue(new QueueItem
|
||||||
{
|
{
|
||||||
Output = _buildTabProxy.PerPlatformOptions[platform].Output,
|
Target = new BuildTarget
|
||||||
Platform = buildPlatform,
|
{
|
||||||
Mode = buildConfiguration,
|
Output = _buildTabProxy.PerPlatformOptions[platform].Output,
|
||||||
},
|
Platform = buildPlatform,
|
||||||
Options = BuildOptions.AutoRun,
|
Mode = buildConfiguration,
|
||||||
});
|
},
|
||||||
|
Options = buildOptions,
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -678,16 +699,20 @@ namespace FlaxEditor.Windows
|
|||||||
{
|
{
|
||||||
Editor.Log("Running cooked build");
|
Editor.Log("Running cooked build");
|
||||||
GameCooker.GetCurrentPlatform(out var platform, out var buildPlatform, out var buildConfiguration);
|
GameCooker.GetCurrentPlatform(out var platform, out var buildPlatform, out var buildConfiguration);
|
||||||
_buildingQueue.Enqueue(new QueueItem
|
var numberOfClients = Editor.Options.Options.Interface.NumberOfGameClientsToLaunch;
|
||||||
|
for (int i = 0; i < numberOfClients; i++)
|
||||||
{
|
{
|
||||||
Target = new BuildTarget
|
_buildingQueue.Enqueue(new QueueItem
|
||||||
{
|
{
|
||||||
Output = _buildTabProxy.PerPlatformOptions[platform].Output,
|
Target = new BuildTarget
|
||||||
Platform = buildPlatform,
|
{
|
||||||
Mode = buildConfiguration,
|
Output = _buildTabProxy.PerPlatformOptions[platform].Output,
|
||||||
},
|
Platform = buildPlatform,
|
||||||
Options = BuildOptions.AutoRun | BuildOptions.NoCook,
|
Mode = buildConfiguration,
|
||||||
});
|
},
|
||||||
|
Options = BuildOptions.AutoRun | BuildOptions.NoCook,
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void BuildTarget()
|
private void BuildTarget()
|
||||||
|
|||||||
@@ -876,38 +876,54 @@ namespace FlaxEngine
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Given a heading which may be outside the +/- PI range, 'unwind' it back into that range.
|
/// Given a heading which may be outside the +/- PI range, 'unwind' it back into that range.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
/// <remarks>Optimized version of <see cref="UnwindRadiansAccurate"/> that is it faster and has fixed cost but with large angle values (100 for example) starts to lose accuracy floating point problem.</remarks>
|
||||||
/// <param name="angle">Angle in radians to unwind.</param>
|
/// <param name="angle">Angle in radians to unwind.</param>
|
||||||
/// <returns>Valid angle in radians.</returns>
|
/// <returns>Valid angle in radians.</returns>
|
||||||
public static double UnwindRadians(double angle)
|
public static double UnwindRadians(double angle)
|
||||||
{
|
{
|
||||||
// TODO: make it faster?
|
var a = angle - Math.Floor(angle / TwoPi) * TwoPi; // Loop function between 0 and TwoPi
|
||||||
|
return a > Pi ? a - TwoPi : a; // Change range so it become Pi and -Pi
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The same as <see cref="UnwindRadians"/> but is more computation intensive with large <see href="angle"/> and has better accuracy with large <see href="angle"/>.
|
||||||
|
/// <br>cost of this function is <see href="angle"/> % <see cref="Pi"/></br>
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="angle">Angle in radians to unwind.</param>
|
||||||
|
/// <returns>Valid angle in radians.</returns>
|
||||||
|
public static double UnwindRadiansAccurate(double angle)
|
||||||
|
{
|
||||||
while (angle > Pi)
|
while (angle > Pi)
|
||||||
{
|
|
||||||
angle -= TwoPi;
|
angle -= TwoPi;
|
||||||
}
|
|
||||||
while (angle < -Pi)
|
while (angle < -Pi)
|
||||||
{
|
|
||||||
angle += TwoPi;
|
angle += TwoPi;
|
||||||
}
|
|
||||||
return angle;
|
return angle;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Utility to ensure angle is between +/- 180 degrees by unwinding
|
/// Utility to ensure angle is between +/- 180 degrees by unwinding.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
/// <remarks>Optimized version of <see cref="UnwindDegreesAccurate"/> that is it faster and has fixed cost but with large angle values (100 for example) starts to lose accuracy floating point problem.</remarks>
|
||||||
/// <param name="angle">Angle in degrees to unwind.</param>
|
/// <param name="angle">Angle in degrees to unwind.</param>
|
||||||
/// <returns>Valid angle in degrees.</returns>
|
/// <returns>Valid angle in degrees.</returns>
|
||||||
public static double UnwindDegrees(double angle)
|
public static double UnwindDegrees(double angle)
|
||||||
{
|
{
|
||||||
// TODO: make it faster?
|
var a = angle - Math.Floor(angle / 360.0) * 360.0; // Loop function between 0 and 360
|
||||||
while (angle > 180.0f)
|
return a > 180 ? a - 360.0 : a; // Change range so it become 180 and -180
|
||||||
{
|
}
|
||||||
angle -= 360.0f;
|
|
||||||
}
|
/// <summary>
|
||||||
while (angle < -180.0f)
|
/// The same as <see cref="UnwindDegrees"/> but is more computation intensive with large <see href="angle"/> and has better accuracy with large <see href="angle"/>.
|
||||||
{
|
/// <br>cost of this function is <see href="angle"/> % 180.0f</br>
|
||||||
angle += 360.0f;
|
/// </summary>
|
||||||
}
|
/// <param name="angle">Angle in radians to unwind.</param>
|
||||||
|
/// <returns>Valid angle in radians.</returns>
|
||||||
|
public static double UnwindDegreesAccurate(double angle)
|
||||||
|
{
|
||||||
|
while (angle > 180.0)
|
||||||
|
angle -= 360.0;
|
||||||
|
while (angle < -180.0)
|
||||||
|
angle += 360.0;
|
||||||
return angle;
|
return angle;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -927,8 +943,9 @@ namespace FlaxEngine
|
|||||||
/// Interpolates between two values using a linear function by a given amount.
|
/// Interpolates between two values using a linear function by a given amount.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <remarks>
|
/// <remarks>
|
||||||
/// See http://www.encyclopediaofmath.org/index.php/Linear_interpolation and
|
/// See:
|
||||||
/// http://fgiesen.wordpress.com/2012/08/15/linear-interpolation-past-present-and-future/
|
/// <br><seealso href="http://www.encyclopediaofmath.org/index.php/Linear_interpolation"/></br>
|
||||||
|
/// <br><seealso href="http://fgiesen.wordpress.com/2012/08/15/linear-interpolation-past-present-and-future/"/></br>
|
||||||
/// </remarks>
|
/// </remarks>
|
||||||
/// <param name="from">Value to interpolate from.</param>
|
/// <param name="from">Value to interpolate from.</param>
|
||||||
/// <param name="to">Value to interpolate to.</param>
|
/// <param name="to">Value to interpolate to.</param>
|
||||||
@@ -944,7 +961,8 @@ namespace FlaxEngine
|
|||||||
/// Performs smooth (cubic Hermite) interpolation between 0 and 1.
|
/// Performs smooth (cubic Hermite) interpolation between 0 and 1.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <remarks>
|
/// <remarks>
|
||||||
/// See https://en.wikipedia.org/wiki/Smoothstep
|
/// See:
|
||||||
|
/// <br><seealso href="https://en.wikipedia.org/wiki/Smoothstep"/></br>
|
||||||
/// </remarks>
|
/// </remarks>
|
||||||
/// <param name="amount">Value between 0 and 1 indicating interpolation amount.</param>
|
/// <param name="amount">Value between 0 and 1 indicating interpolation amount.</param>
|
||||||
public static double SmoothStep(double amount)
|
public static double SmoothStep(double amount)
|
||||||
@@ -956,7 +974,8 @@ namespace FlaxEngine
|
|||||||
/// Performs a smooth(er) interpolation between 0 and 1 with 1st and 2nd order derivatives of zero at endpoints.
|
/// Performs a smooth(er) interpolation between 0 and 1 with 1st and 2nd order derivatives of zero at endpoints.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <remarks>
|
/// <remarks>
|
||||||
/// See https://en.wikipedia.org/wiki/Smoothstep
|
/// See:
|
||||||
|
/// <br><seealso href="https://en.wikipedia.org/wiki/Smoothstep"/></br>
|
||||||
/// </remarks>
|
/// </remarks>
|
||||||
/// <param name="amount">Value between 0 and 1 indicating interpolation amount.</param>
|
/// <param name="amount">Value between 0 and 1 indicating interpolation amount.</param>
|
||||||
public static double SmootherStep(double amount)
|
public static double SmootherStep(double amount)
|
||||||
@@ -1013,7 +1032,7 @@ namespace FlaxEngine
|
|||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gauss function.
|
/// Gauss function.
|
||||||
/// http://en.wikipedia.org/wiki/Gaussian_function#Two-dimensional_Gaussian_function
|
/// <br><seealso href="http://en.wikipedia.org/wiki/Gaussian_function#Two-dimensional_Gaussian_function"/></br>
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="amplitude">Curve amplitude.</param>
|
/// <param name="amplitude">Curve amplitude.</param>
|
||||||
/// <param name="x">Position X.</param>
|
/// <param name="x">Position X.</param>
|
||||||
|
|||||||
@@ -1176,38 +1176,54 @@ namespace FlaxEngine
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Given a heading which may be outside the +/- PI range, 'unwind' it back into that range.
|
/// Given a heading which may be outside the +/- PI range, 'unwind' it back into that range.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
/// <remarks>Optimized version of <see cref="UnwindRadiansAccurate"/> that is it faster and has fixed cost but with large angle values (100 for example) starts to lose accuracy floating point problem.</remarks>
|
||||||
/// <param name="angle">Angle in radians to unwind.</param>
|
/// <param name="angle">Angle in radians to unwind.</param>
|
||||||
/// <returns>Valid angle in radians.</returns>
|
/// <returns>Valid angle in radians.</returns>
|
||||||
public static float UnwindRadians(float angle)
|
public static float UnwindRadians(float angle)
|
||||||
{
|
{
|
||||||
// TODO: make it faster?
|
var a = angle - (float)Math.Floor(angle / TwoPi) * TwoPi; // Loop function between 0 and TwoPi
|
||||||
|
return a > Pi ? a - TwoPi : a; // Change range so it become Pi and -Pi
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The same as <see cref="UnwindRadians"/> but is more computation intensive with large <see href="angle"/> and has better accuracy with large <see href="angle"/>.
|
||||||
|
/// <br>cost of this function is <see href="angle"/> % <see cref="Pi"/></br>
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="angle">Angle in radians to unwind.</param>
|
||||||
|
/// <returns>Valid angle in radians.</returns>
|
||||||
|
public static float UnwindRadiansAccurate(float angle)
|
||||||
|
{
|
||||||
while (angle > Pi)
|
while (angle > Pi)
|
||||||
{
|
|
||||||
angle -= TwoPi;
|
angle -= TwoPi;
|
||||||
}
|
|
||||||
while (angle < -Pi)
|
while (angle < -Pi)
|
||||||
{
|
|
||||||
angle += TwoPi;
|
angle += TwoPi;
|
||||||
}
|
|
||||||
return angle;
|
return angle;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Utility to ensure angle is between +/- 180 degrees by unwinding
|
/// Utility to ensure angle is between +/- 180 degrees by unwinding.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
/// <remarks>Optimized version of <see cref="UnwindDegreesAccurate"/> that is it faster and has fixed cost but with large angle values (100 for example) starts to lose accuracy floating point problem.</remarks>
|
||||||
/// <param name="angle">Angle in degrees to unwind.</param>
|
/// <param name="angle">Angle in degrees to unwind.</param>
|
||||||
/// <returns>Valid angle in degrees.</returns>
|
/// <returns>Valid angle in degrees.</returns>
|
||||||
public static float UnwindDegrees(float angle)
|
public static float UnwindDegrees(float angle)
|
||||||
{
|
{
|
||||||
// TODO: make it faster?
|
var a = angle - (float)Math.Floor(angle / 360.0f) * 360.0f; // Loop function between 0 and 360
|
||||||
|
return a > 180 ? a - 360.0f : a; // Change range so it become 180 and -180
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The same as <see cref="UnwindDegrees"/> but is more computation intensive with large <see href="angle"/> and has better accuracy with large <see href="angle"/>.
|
||||||
|
/// <br>cost of this function is <see href="angle"/> % 180.0f</br>
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="angle">Angle in radians to unwind.</param>
|
||||||
|
/// <returns>Valid angle in radians.</returns>
|
||||||
|
public static float UnwindDegreesAccurate(float angle)
|
||||||
|
{
|
||||||
while (angle > 180.0f)
|
while (angle > 180.0f)
|
||||||
{
|
|
||||||
angle -= 360.0f;
|
angle -= 360.0f;
|
||||||
}
|
|
||||||
while (angle < -180.0f)
|
while (angle < -180.0f)
|
||||||
{
|
|
||||||
angle += 360.0f;
|
angle += 360.0f;
|
||||||
}
|
|
||||||
return angle;
|
return angle;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1299,8 +1315,12 @@ namespace FlaxEngine
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Interpolates between two values using a linear function by a given amount.
|
/// Interpolates between two values using a linear function by a given amount.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <remarks>See http://www.encyclopediaofmath.org/index.php/Linear_interpolation and http://fgiesen.wordpress.com/2012/08/15/linear-interpolation-past-present-and-future/</remarks>
|
/// <remarks>
|
||||||
/// <param name="from">Value to interpolate from.</param>
|
/// See:
|
||||||
|
/// <br><seealso href="http://www.encyclopediaofmath.org/index.php/Linear_interpolation"/></br>
|
||||||
|
/// <br><seealso href="http://fgiesen.wordpress.com/2012/08/15/linear-interpolation-past-present-and-future/"/></br>
|
||||||
|
/// </remarks>
|
||||||
|
/// /// <param name="from">Value to interpolate from.</param>
|
||||||
/// <param name="to">Value to interpolate to.</param>
|
/// <param name="to">Value to interpolate to.</param>
|
||||||
/// <param name="amount">Interpolation amount.</param>
|
/// <param name="amount">Interpolation amount.</param>
|
||||||
/// <returns>The result of linear interpolation of values based on the amount.</returns>
|
/// <returns>The result of linear interpolation of values based on the amount.</returns>
|
||||||
@@ -1312,8 +1332,12 @@ namespace FlaxEngine
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Interpolates between two values using a linear function by a given amount.
|
/// Interpolates between two values using a linear function by a given amount.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <remarks>See http://www.encyclopediaofmath.org/index.php/Linear_interpolation and http://fgiesen.wordpress.com/2012/08/15/linear-interpolation-past-present-and-future/</remarks>
|
/// <remarks>
|
||||||
/// <param name="from">Value to interpolate from.</param>
|
/// See:
|
||||||
|
/// <br><seealso href="http://www.encyclopediaofmath.org/index.php/Linear_interpolation"/></br>
|
||||||
|
/// <br><seealso href="http://fgiesen.wordpress.com/2012/08/15/linear-interpolation-past-present-and-future/"/></br>
|
||||||
|
/// </remarks>
|
||||||
|
/// /// <param name="from">Value to interpolate from.</param>
|
||||||
/// <param name="to">Value to interpolate to.</param>
|
/// <param name="to">Value to interpolate to.</param>
|
||||||
/// <param name="amount">Interpolation amount.</param>
|
/// <param name="amount">Interpolation amount.</param>
|
||||||
/// <returns>The result of linear interpolation of values based on the amount.</returns>
|
/// <returns>The result of linear interpolation of values based on the amount.</returns>
|
||||||
@@ -1325,8 +1349,12 @@ namespace FlaxEngine
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Interpolates between two values using a linear function by a given amount.
|
/// Interpolates between two values using a linear function by a given amount.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <remarks>See http://www.encyclopediaofmath.org/index.php/Linear_interpolation and http://fgiesen.wordpress.com/2012/08/15/linear-interpolation-past-present-and-future/</remarks>
|
/// <remarks>
|
||||||
/// <param name="from">Value to interpolate from.</param>
|
/// See:
|
||||||
|
/// <br><seealso href="http://www.encyclopediaofmath.org/index.php/Linear_interpolation"/></br>
|
||||||
|
/// <br><seealso href="http://fgiesen.wordpress.com/2012/08/15/linear-interpolation-past-present-and-future/"/></br>
|
||||||
|
/// </remarks>
|
||||||
|
/// /// <param name="from">Value to interpolate from.</param>
|
||||||
/// <param name="to">Value to interpolate to.</param>
|
/// <param name="to">Value to interpolate to.</param>
|
||||||
/// <param name="amount">Interpolation amount.</param>
|
/// <param name="amount">Interpolation amount.</param>
|
||||||
/// <returns>The result of linear interpolation of values based on the amount.</returns>
|
/// <returns>The result of linear interpolation of values based on the amount.</returns>
|
||||||
@@ -1338,7 +1366,10 @@ namespace FlaxEngine
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Performs smooth (cubic Hermite) interpolation between 0 and 1.
|
/// Performs smooth (cubic Hermite) interpolation between 0 and 1.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <remarks>See https://en.wikipedia.org/wiki/Smoothstep</remarks>
|
/// <remarks>
|
||||||
|
/// See:
|
||||||
|
/// <br><seealso href="https://en.wikipedia.org/wiki/Smoothstep"/></br>
|
||||||
|
/// </remarks>
|
||||||
/// <param name="amount">Value between 0 and 1 indicating interpolation amount.</param>
|
/// <param name="amount">Value between 0 and 1 indicating interpolation amount.</param>
|
||||||
public static float SmoothStep(float amount)
|
public static float SmoothStep(float amount)
|
||||||
{
|
{
|
||||||
@@ -1348,7 +1379,10 @@ namespace FlaxEngine
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Performs smooth (cubic Hermite) interpolation between 0 and 1.
|
/// Performs smooth (cubic Hermite) interpolation between 0 and 1.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <remarks>See https://en.wikipedia.org/wiki/Smoothstep</remarks>
|
/// <remarks>
|
||||||
|
/// See:
|
||||||
|
/// <br><seealso href="https://en.wikipedia.org/wiki/Smoothstep"/></br>
|
||||||
|
/// </remarks>
|
||||||
/// <param name="amount">Value between 0 and 1 indicating interpolation amount.</param>
|
/// <param name="amount">Value between 0 and 1 indicating interpolation amount.</param>
|
||||||
public static double SmoothStep(double amount)
|
public static double SmoothStep(double amount)
|
||||||
{
|
{
|
||||||
@@ -1358,7 +1392,10 @@ namespace FlaxEngine
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Performs a smooth(er) interpolation between 0 and 1 with 1st and 2nd order derivatives of zero at endpoints.
|
/// Performs a smooth(er) interpolation between 0 and 1 with 1st and 2nd order derivatives of zero at endpoints.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <remarks>See https://en.wikipedia.org/wiki/Smoothstep</remarks>
|
/// <remarks>
|
||||||
|
/// See:
|
||||||
|
/// <br><seealso href="https://en.wikipedia.org/wiki/Smoothstep"/></br>
|
||||||
|
/// </remarks>
|
||||||
/// <param name="amount">Value between 0 and 1 indicating interpolation amount.</param>
|
/// <param name="amount">Value between 0 and 1 indicating interpolation amount.</param>
|
||||||
public static float SmootherStep(float amount)
|
public static float SmootherStep(float amount)
|
||||||
{
|
{
|
||||||
@@ -1368,7 +1405,10 @@ namespace FlaxEngine
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Performs a smooth(er) interpolation between 0 and 1 with 1st and 2nd order derivatives of zero at endpoints.
|
/// Performs a smooth(er) interpolation between 0 and 1 with 1st and 2nd order derivatives of zero at endpoints.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <remarks>See https://en.wikipedia.org/wiki/Smoothstep</remarks>
|
/// <remarks>
|
||||||
|
/// See:
|
||||||
|
/// <br><seealso href="https://en.wikipedia.org/wiki/Smoothstep"/></br>
|
||||||
|
/// </remarks>
|
||||||
/// <param name="amount">Value between 0 and 1 indicating interpolation amount.</param>
|
/// <param name="amount">Value between 0 and 1 indicating interpolation amount.</param>
|
||||||
public static double SmootherStep(double amount)
|
public static double SmootherStep(double amount)
|
||||||
{
|
{
|
||||||
@@ -1446,7 +1486,7 @@ namespace FlaxEngine
|
|||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gauss function.
|
/// Gauss function.
|
||||||
/// http://en.wikipedia.org/wiki/Gaussian_function#Two-dimensional_Gaussian_function
|
/// <br><seealso href="http://en.wikipedia.org/wiki/Gaussian_function#Two-dimensional_Gaussian_function"/></br>
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="amplitude">Curve amplitude.</param>
|
/// <param name="amplitude">Curve amplitude.</param>
|
||||||
/// <param name="x">Position X.</param>
|
/// <param name="x">Position X.</param>
|
||||||
@@ -1463,7 +1503,7 @@ namespace FlaxEngine
|
|||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gauss function.
|
/// Gauss function.
|
||||||
/// http://en.wikipedia.org/wiki/Gaussian_function#Two-dimensional_Gaussian_function
|
/// <br><seealso href="http://en.wikipedia.org/wiki/Gaussian_function#Two-dimensional_Gaussian_function"/></br>
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="amplitude">Curve amplitude.</param>
|
/// <param name="amplitude">Curve amplitude.</param>
|
||||||
/// <param name="x">Position X.</param>
|
/// <param name="x">Position X.</param>
|
||||||
|
|||||||
@@ -788,7 +788,9 @@ void Actor::BreakPrefabLink()
|
|||||||
|
|
||||||
void Actor::Initialize()
|
void Actor::Initialize()
|
||||||
{
|
{
|
||||||
ASSERT(!IsDuringPlay());
|
#if ENABLE_ASSERTION
|
||||||
|
CHECK(!IsDuringPlay());
|
||||||
|
#endif
|
||||||
|
|
||||||
// Cache
|
// Cache
|
||||||
if (_parent)
|
if (_parent)
|
||||||
@@ -802,7 +804,9 @@ void Actor::Initialize()
|
|||||||
|
|
||||||
void Actor::BeginPlay(SceneBeginData* data)
|
void Actor::BeginPlay(SceneBeginData* data)
|
||||||
{
|
{
|
||||||
ASSERT(!IsDuringPlay());
|
#if ENABLE_ASSERTION
|
||||||
|
CHECK(!IsDuringPlay());
|
||||||
|
#endif
|
||||||
|
|
||||||
// Set flag
|
// Set flag
|
||||||
Flags |= ObjectFlags::IsDuringPlay;
|
Flags |= ObjectFlags::IsDuringPlay;
|
||||||
@@ -832,7 +836,9 @@ void Actor::BeginPlay(SceneBeginData* data)
|
|||||||
|
|
||||||
void Actor::EndPlay()
|
void Actor::EndPlay()
|
||||||
{
|
{
|
||||||
ASSERT(IsDuringPlay());
|
#if ENABLE_ASSERTION
|
||||||
|
CHECK(IsDuringPlay());
|
||||||
|
#endif
|
||||||
|
|
||||||
// Fire event for scripting
|
// Fire event for scripting
|
||||||
if (IsActiveInHierarchy() && GetScene())
|
if (IsActiveInHierarchy() && GetScene())
|
||||||
@@ -1059,7 +1065,9 @@ void Actor::Deserialize(DeserializeStream& stream, ISerializeModifier* modifier)
|
|||||||
|
|
||||||
void Actor::OnEnable()
|
void Actor::OnEnable()
|
||||||
{
|
{
|
||||||
ASSERT(!_isEnabled);
|
#if ENABLE_ASSERTION
|
||||||
|
CHECK(!_isEnabled);
|
||||||
|
#endif
|
||||||
_isEnabled = true;
|
_isEnabled = true;
|
||||||
|
|
||||||
for (int32 i = 0; i < Scripts.Count(); i++)
|
for (int32 i = 0; i < Scripts.Count(); i++)
|
||||||
@@ -1079,7 +1087,9 @@ void Actor::OnEnable()
|
|||||||
|
|
||||||
void Actor::OnDisable()
|
void Actor::OnDisable()
|
||||||
{
|
{
|
||||||
ASSERT(_isEnabled);
|
#if ENABLE_ASSERTION
|
||||||
|
CHECK(_isEnabled);
|
||||||
|
#endif
|
||||||
_isEnabled = false;
|
_isEnabled = false;
|
||||||
|
|
||||||
for (int32 i = Scripts.Count() - 1; i >= 0; i--)
|
for (int32 i = Scripts.Count() - 1; i >= 0; i--)
|
||||||
|
|||||||
@@ -53,4 +53,23 @@ namespace FlaxEngine
|
|||||||
UseSmallPicker = useSmallPicker;
|
UseSmallPicker = useSmallPicker;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if USE_NETCORE
|
||||||
|
/// <summary>
|
||||||
|
/// Specifies a options for an asset reference picker in the editor. Allows to customize view or provide custom value assign policy.
|
||||||
|
/// </summary>
|
||||||
|
/// <seealso cref="System.Attribute" />
|
||||||
|
[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property)]
|
||||||
|
public class AssetReferenceAttribute<T> : AssetReferenceAttribute
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Initializes a new instance of the <see cref="AssetReferenceAttribute"/> class for generic type T.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="useSmallPicker">True if use asset picker with a smaller height (single line), otherwise will use with full icon.</param>
|
||||||
|
public AssetReferenceAttribute(bool useSmallPicker = false)
|
||||||
|
: base(typeof(T), useSmallPicker)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,10 +17,29 @@ public class Scripting : EngineModule
|
|||||||
{
|
{
|
||||||
if (EngineConfiguration.WithDotNet(options))
|
if (EngineConfiguration.WithDotNet(options))
|
||||||
{
|
{
|
||||||
|
void AddFrameworkDefines(string template, int major, int latestMinor)
|
||||||
|
{
|
||||||
|
for (int minor = latestMinor; minor >= 0; minor--)
|
||||||
|
{
|
||||||
|
options.ScriptingAPI.Defines.Add(string.Format(template, major, minor));
|
||||||
|
options.ScriptingAPI.Defines.Add(string.Format($"{template}_OR_GREATER", major, minor));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// .NET
|
// .NET
|
||||||
options.PrivateDependencies.Add("nethost");
|
options.PrivateDependencies.Add("nethost");
|
||||||
options.ScriptingAPI.Defines.Add("USE_NETCORE");
|
options.ScriptingAPI.Defines.Add("USE_NETCORE");
|
||||||
|
|
||||||
|
// .NET SDK
|
||||||
|
AddFrameworkDefines("NET{0}_{1}", 7, 0); // "NET7_0" and "NET7_0_OR_GREATER"
|
||||||
|
AddFrameworkDefines("NET{0}_{1}", 6, 0);
|
||||||
|
AddFrameworkDefines("NET{0}_{1}", 5, 0);
|
||||||
|
options.ScriptingAPI.Defines.Add("NET");
|
||||||
|
AddFrameworkDefines("NETCOREAPP{0}_{1}", 3, 1); // "NETCOREAPP3_1" and "NETCOREAPP3_1_OR_GREATER"
|
||||||
|
AddFrameworkDefines("NETCOREAPP{0}_{1}", 2, 2);
|
||||||
|
AddFrameworkDefines("NETCOREAPP{0}_{1}", 1, 1);
|
||||||
|
options.ScriptingAPI.Defines.Add("NETCOREAPP");
|
||||||
|
|
||||||
if (options.Target is EngineTarget engineTarget && engineTarget.UseSeparateMainExecutable(options))
|
if (options.Target is EngineTarget engineTarget && engineTarget.UseSeparateMainExecutable(options))
|
||||||
{
|
{
|
||||||
// Build target doesn't support linking again main executable (eg. Linux) thus additional shared library is used for the engine (eg. libFlaxEditor.so)
|
// Build target doesn't support linking again main executable (eg. Linux) thus additional shared library is used for the engine (eg. libFlaxEditor.so)
|
||||||
|
|||||||
@@ -151,6 +151,13 @@ void ShadowsOfMordor::Builder::onJobRender(GPUContext* context)
|
|||||||
auto patch = terrain->GetPatch(entry.AsTerrain.PatchIndex);
|
auto patch = terrain->GetPatch(entry.AsTerrain.PatchIndex);
|
||||||
auto chunk = &patch->Chunks[entry.AsTerrain.ChunkIndex];
|
auto chunk = &patch->Chunks[entry.AsTerrain.ChunkIndex];
|
||||||
auto chunkSize = terrain->GetChunkSize();
|
auto chunkSize = terrain->GetChunkSize();
|
||||||
|
if (!patch->Heightmap)
|
||||||
|
{
|
||||||
|
LOG(Error, "Terrain actor {0} is missing heightmap for baking, skipping baking stage.", terrain->GetName());
|
||||||
|
_wasStageDone = true;
|
||||||
|
scene->EntriesLocker.Unlock();
|
||||||
|
return;
|
||||||
|
}
|
||||||
const auto heightmap = patch->Heightmap.Get()->GetTexture();
|
const auto heightmap = patch->Heightmap.Get()->GetTexture();
|
||||||
|
|
||||||
Matrix world;
|
Matrix world;
|
||||||
@@ -171,7 +178,7 @@ void ShadowsOfMordor::Builder::onJobRender(GPUContext* context)
|
|||||||
|
|
||||||
DrawCall drawCall;
|
DrawCall drawCall;
|
||||||
if (TerrainManager::GetChunkGeometry(drawCall, chunkSize, 0))
|
if (TerrainManager::GetChunkGeometry(drawCall, chunkSize, 0))
|
||||||
return;
|
break;
|
||||||
|
|
||||||
context->UpdateCB(cb, &shaderData);
|
context->UpdateCB(cb, &shaderData);
|
||||||
context->BindCB(0, cb);
|
context->BindCB(0, cb);
|
||||||
|
|||||||
48
Source/Engine/Tests/TestMath.cs
Normal file
48
Source/Engine/Tests/TestMath.cs
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved.
|
||||||
|
|
||||||
|
#if FLAX_TESTS
|
||||||
|
using System;
|
||||||
|
using NUnit.Framework;
|
||||||
|
|
||||||
|
namespace FlaxEngine.Tests
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Tests for <see cref="Mathf"/> and <see cref="Mathd"/>.
|
||||||
|
/// </summary>
|
||||||
|
[TestFixture]
|
||||||
|
public class TestMath
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Test unwinding angles.
|
||||||
|
/// </summary>
|
||||||
|
[Test]
|
||||||
|
public void TestUnwind()
|
||||||
|
{
|
||||||
|
Assert.AreEqual(0.0f, Mathf.UnwindDegreesAccurate(0.0f));
|
||||||
|
Assert.AreEqual(45.0f, Mathf.UnwindDegreesAccurate(45.0f));
|
||||||
|
Assert.AreEqual(90.0f, Mathf.UnwindDegreesAccurate(90.0f));
|
||||||
|
Assert.AreEqual(180.0f, Mathf.UnwindDegreesAccurate(180.0f));
|
||||||
|
Assert.AreEqual(0.0f, Mathf.UnwindDegreesAccurate(360.0f));
|
||||||
|
Assert.AreEqual(0.0f, Mathf.UnwindDegrees(0.0f));
|
||||||
|
Assert.AreEqual(45.0f, Mathf.UnwindDegrees(45.0f));
|
||||||
|
Assert.AreEqual(90.0f, Mathf.UnwindDegrees(90.0f));
|
||||||
|
Assert.AreEqual(180.0f, Mathf.UnwindDegrees(180.0f));
|
||||||
|
Assert.AreEqual(0.0f, Mathf.UnwindDegrees(360.0f));
|
||||||
|
var fError = 0.001f;
|
||||||
|
var dError = 0.00001;
|
||||||
|
for (float f = -400.0f; f <= 400.0f; f += 0.1f)
|
||||||
|
{
|
||||||
|
var f1 = Mathf.UnwindDegreesAccurate(f);
|
||||||
|
var f2 = Mathf.UnwindDegrees(f);
|
||||||
|
if (Mathf.Abs(f1 - f2) >= fError)
|
||||||
|
throw new Exception($"Failed on angle={f}, {f1} != {f2}");
|
||||||
|
var d = (double)f;
|
||||||
|
var d1 = Mathd.UnwindDegreesAccurate(d);
|
||||||
|
var d2 = Mathd.UnwindDegrees(d);
|
||||||
|
if (Mathd.Abs(d1 - d2) >= dError)
|
||||||
|
throw new Exception($"Failed on angle={d}, {d1} != {d2}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
1
Source/ThirdParty/fmt/core.h
vendored
1
Source/ThirdParty/fmt/core.h
vendored
@@ -30,6 +30,7 @@ Customizations done to fmt lib:
|
|||||||
#define FMT_USE_USER_DEFINED_LITERALS 0
|
#define FMT_USE_USER_DEFINED_LITERALS 0
|
||||||
#define FMT_USE_STRING 0
|
#define FMT_USE_STRING 0
|
||||||
#define FMT_USE_LONG_DOUBLE 0
|
#define FMT_USE_LONG_DOUBLE 0
|
||||||
|
#define FMT_USE_FLOAT128 0
|
||||||
#define FMT_USE_ITERATOR 0
|
#define FMT_USE_ITERATOR 0
|
||||||
#define FMT_USE_LOCALE_GROUPING 0
|
#define FMT_USE_LOCALE_GROUPING 0
|
||||||
#define FMT_EXCEPTIONS 0
|
#define FMT_EXCEPTIONS 0
|
||||||
|
|||||||
@@ -2059,7 +2059,7 @@ namespace Flax.Build.Bindings
|
|||||||
if (code.StartsWith("using"))
|
if (code.StartsWith("using"))
|
||||||
CSharpUsedNamespaces.Add(code.Substring(6));
|
CSharpUsedNamespaces.Add(code.Substring(6));
|
||||||
else if (code.Length > 0)
|
else if (code.Length > 0)
|
||||||
contents.Append(injectCodeInfo.Code).AppendLine(";");
|
contents.Append(code).AppendLine(";");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -159,6 +159,7 @@ namespace Flax.Build
|
|||||||
var outputPath = Path.GetDirectoryName(buildData.Target.GetOutputFilePath(buildOptions));
|
var outputPath = Path.GetDirectoryName(buildData.Target.GetOutputFilePath(buildOptions));
|
||||||
var outputFile = Path.Combine(outputPath, name + ".dll");
|
var outputFile = Path.Combine(outputPath, name + ".dll");
|
||||||
var outputDocFile = Path.Combine(outputPath, name + ".xml");
|
var outputDocFile = Path.Combine(outputPath, name + ".xml");
|
||||||
|
var outputGeneratedFiles = Path.Combine(buildOptions.IntermediateFolder);
|
||||||
string cscPath, referenceAssemblies;
|
string cscPath, referenceAssemblies;
|
||||||
#if USE_NETCORE
|
#if USE_NETCORE
|
||||||
var dotnetSdk = DotNetSdk.Instance;
|
var dotnetSdk = DotNetSdk.Instance;
|
||||||
@@ -263,6 +264,9 @@ namespace Flax.Build
|
|||||||
#endif
|
#endif
|
||||||
args.Add(string.Format("/out:\"{0}\"", outputFile));
|
args.Add(string.Format("/out:\"{0}\"", outputFile));
|
||||||
args.Add(string.Format("/doc:\"{0}\"", outputDocFile));
|
args.Add(string.Format("/doc:\"{0}\"", outputDocFile));
|
||||||
|
#if USE_NETCORE
|
||||||
|
args.Add(string.Format("/generatedfilesout:\"{0}\"", outputGeneratedFiles));
|
||||||
|
#endif
|
||||||
if (buildOptions.ScriptingAPI.Defines.Count != 0)
|
if (buildOptions.ScriptingAPI.Defines.Count != 0)
|
||||||
args.Add("/define:" + string.Join(";", buildOptions.ScriptingAPI.Defines));
|
args.Add("/define:" + string.Join(";", buildOptions.ScriptingAPI.Defines));
|
||||||
if (buildData.Configuration == TargetConfiguration.Debug)
|
if (buildData.Configuration == TargetConfiguration.Debug)
|
||||||
@@ -272,8 +276,10 @@ namespace Flax.Build
|
|||||||
foreach (var reference in fileReferences)
|
foreach (var reference in fileReferences)
|
||||||
args.Add(string.Format("/reference:\"{0}\"", reference));
|
args.Add(string.Format("/reference:\"{0}\"", reference));
|
||||||
#if USE_NETCORE
|
#if USE_NETCORE
|
||||||
foreach (var analyzer in buildOptions.ScriptingAPI.SystemAnalyzers)
|
foreach (var systemAnalyzer in buildOptions.ScriptingAPI.SystemAnalyzers)
|
||||||
args.Add(string.Format("/analyzer:\"{0}{1}.dll\"", referenceAnalyzers, analyzer));
|
args.Add(string.Format("/analyzer:\"{0}{1}.dll\"", referenceAnalyzers, systemAnalyzer));
|
||||||
|
foreach (var analyzer in buildOptions.ScriptingAPI.Analyzers)
|
||||||
|
args.Add(string.Format("/analyzer:\"{0}\"", analyzer));
|
||||||
#endif
|
#endif
|
||||||
foreach (var sourceFile in sourceFiles)
|
foreach (var sourceFile in sourceFiles)
|
||||||
args.Add("\"" + sourceFile + "\"");
|
args.Add("\"" + sourceFile + "\"");
|
||||||
|
|||||||
@@ -200,14 +200,19 @@ namespace Flax.Build.NativeCpp
|
|||||||
public HashSet<string> SystemReferences;
|
public HashSet<string> SystemReferences;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The .Net libraries references (dll or exe files paths).
|
/// The system analyzers/source generators.
|
||||||
|
/// </summary>
|
||||||
|
public HashSet<string> SystemAnalyzers;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The .NET libraries references (dll or exe files paths).
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public HashSet<string> FileReferences;
|
public HashSet<string> FileReferences;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The .Net libraries references (dll or exe files paths).
|
/// The .NET analyzers (dll or exe files paths).
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public HashSet<string> SystemAnalyzers;
|
public HashSet<string> Analyzers;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// True if ignore compilation warnings due to missing code documentation comments.
|
/// True if ignore compilation warnings due to missing code documentation comments.
|
||||||
@@ -232,6 +237,7 @@ namespace Flax.Build.NativeCpp
|
|||||||
Defines.AddRange(other.Defines);
|
Defines.AddRange(other.Defines);
|
||||||
SystemReferences.AddRange(other.SystemReferences);
|
SystemReferences.AddRange(other.SystemReferences);
|
||||||
FileReferences.AddRange(other.FileReferences);
|
FileReferences.AddRange(other.FileReferences);
|
||||||
|
Analyzers.AddRange(other.Analyzers);
|
||||||
IgnoreMissingDocumentationWarnings |= other.IgnoreMissingDocumentationWarnings;
|
IgnoreMissingDocumentationWarnings |= other.IgnoreMissingDocumentationWarnings;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -305,6 +311,7 @@ namespace Flax.Build.NativeCpp
|
|||||||
"Microsoft.Interop.SourceGeneration",
|
"Microsoft.Interop.SourceGeneration",
|
||||||
},
|
},
|
||||||
FileReferences = new HashSet<string>(),
|
FileReferences = new HashSet<string>(),
|
||||||
|
Analyzers = new HashSet<string>(),
|
||||||
};
|
};
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@@ -247,6 +247,14 @@ namespace Flax.Build.Projects.VisualStudio
|
|||||||
csProjectFileContent.AppendLine(" </ItemGroup>");
|
csProjectFileContent.AppendLine(" </ItemGroup>");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
foreach (var analyzer in configuration.TargetBuildOptions.ScriptingAPI.Analyzers)
|
||||||
|
{
|
||||||
|
csProjectFileContent.AppendLine(string.Format(" <ItemGroup Condition=\" '$(Configuration)|$(Platform)' == '{0}' \">", configuration.Name));
|
||||||
|
csProjectFileContent.AppendLine(string.Format(" <Analyzer Include=\"{0}\">", Path.GetFileNameWithoutExtension(analyzer)));
|
||||||
|
csProjectFileContent.AppendLine(string.Format(" <HintPath>{0}</HintPath>", Utilities.MakePathRelativeTo(analyzer, projectDirectory).Replace('/', '\\')));
|
||||||
|
csProjectFileContent.AppendLine(" </Analyzer>");
|
||||||
|
csProjectFileContent.AppendLine(" </ItemGroup>");
|
||||||
|
}
|
||||||
|
|
||||||
csProjectFileContent.AppendLine("");
|
csProjectFileContent.AppendLine("");
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user