Add support for viewport icons rendering in prefab editor window
This commit is contained in:
@@ -57,30 +57,46 @@ public:
|
||||
|
||||
ViewportIconsRendererService ViewportIconsRendererServiceInstance;
|
||||
|
||||
void ViewportIconsRenderer::DrawIcons(RenderContext& renderContext, Scene* scene)
|
||||
namespace
|
||||
{
|
||||
auto& view = renderContext.View;
|
||||
if ((view.Flags & ViewFlags::EditorSprites) == 0 || QuadModel == nullptr || !QuadModel->IsLoaded())
|
||||
return;
|
||||
|
||||
const BoundingFrustum frustum = view.Frustum;
|
||||
auto& icons = scene->GetSceneRendering()->ViewportIcons;
|
||||
Matrix m1, m2, world;
|
||||
Mesh::DrawInfo draw;
|
||||
draw.Lightmap = nullptr;
|
||||
draw.LightmapUVs = nullptr;
|
||||
draw.Flags = StaticFlags::Transform;
|
||||
draw.DrawModes = DrawPass::Forward;
|
||||
draw.PerInstanceRandom = 0;
|
||||
draw.LODBias = 0;
|
||||
draw.ForcedLOD = -1;
|
||||
draw.VertexColors = nullptr;
|
||||
|
||||
for (Actor* icon : icons)
|
||||
void DrawIcons(RenderContext& renderContext, Scene* scene, Mesh::DrawInfo& draw)
|
||||
{
|
||||
BoundingSphere sphere(icon->GetPosition(), ICON_RADIUS);
|
||||
auto& view = renderContext.View;
|
||||
const BoundingFrustum frustum = view.Frustum;
|
||||
auto& icons = scene->GetSceneRendering()->ViewportIcons;
|
||||
Matrix m1, m2, world;
|
||||
for (Actor* icon : icons)
|
||||
{
|
||||
BoundingSphere sphere(icon->GetPosition(), ICON_RADIUS);
|
||||
IconTypes iconType;
|
||||
if (frustum.Intersects(sphere) && ActorTypeToIconType.TryGet(icon->GetTypeHandle(), iconType))
|
||||
{
|
||||
// Create world matrix
|
||||
Matrix::Scaling(ICON_RADIUS * 2.0f, m2);
|
||||
Matrix::RotationY(PI, world);
|
||||
Matrix::Multiply(m2, world, m1);
|
||||
Matrix::Billboard(sphere.Center, view.Position, Vector3::Up, view.Direction, m2);
|
||||
Matrix::Multiply(m1, m2, world);
|
||||
|
||||
// Draw icon
|
||||
GeometryDrawStateData drawState;
|
||||
draw.DrawState = &drawState;
|
||||
draw.Buffer = &InstanceBuffers[static_cast<int32>(iconType)];
|
||||
draw.World = &world;
|
||||
draw.Bounds = sphere;
|
||||
QuadModel->Draw(renderContext, draw);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void DrawIcons(RenderContext& renderContext, Actor* actor, Mesh::DrawInfo& draw)
|
||||
{
|
||||
auto& view = renderContext.View;
|
||||
const BoundingFrustum frustum = view.Frustum;
|
||||
Matrix m1, m2, world;
|
||||
BoundingSphere sphere(actor->GetPosition(), ICON_RADIUS);
|
||||
IconTypes iconType;
|
||||
if (frustum.Intersects(sphere) && ActorTypeToIconType.TryGet(icon->GetTypeHandle(), iconType))
|
||||
if (frustum.Intersects(sphere) && ActorTypeToIconType.TryGet(actor->GetTypeHandle(), iconType))
|
||||
{
|
||||
// Create world matrix
|
||||
Matrix::Scaling(ICON_RADIUS * 2.0f, m2);
|
||||
@@ -97,6 +113,35 @@ void ViewportIconsRenderer::DrawIcons(RenderContext& renderContext, Scene* scene
|
||||
draw.Bounds = sphere;
|
||||
QuadModel->Draw(renderContext, draw);
|
||||
}
|
||||
|
||||
for (auto child : actor->Children)
|
||||
DrawIcons(renderContext, child, draw);
|
||||
}
|
||||
}
|
||||
|
||||
void ViewportIconsRenderer::DrawIcons(RenderContext& renderContext, Actor* actor)
|
||||
{
|
||||
auto& view = renderContext.View;
|
||||
if ((view.Flags & ViewFlags::EditorSprites) == 0 || QuadModel == nullptr || !QuadModel->IsLoaded())
|
||||
return;
|
||||
|
||||
Mesh::DrawInfo draw;
|
||||
draw.Lightmap = nullptr;
|
||||
draw.LightmapUVs = nullptr;
|
||||
draw.Flags = StaticFlags::Transform;
|
||||
draw.DrawModes = DrawPass::Forward;
|
||||
draw.PerInstanceRandom = 0;
|
||||
draw.LODBias = 0;
|
||||
draw.ForcedLOD = -1;
|
||||
draw.VertexColors = nullptr;
|
||||
|
||||
if (const auto scene = SceneObject::Cast<Scene>(actor))
|
||||
{
|
||||
::DrawIcons(renderContext, scene, draw);
|
||||
}
|
||||
else
|
||||
{
|
||||
::DrawIcons(renderContext, actor, draw);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
|
||||
struct RenderContext;
|
||||
class SceneRenderTask;
|
||||
class Scene;
|
||||
class Actor;
|
||||
|
||||
/// <summary>
|
||||
/// Editor viewports icons rendering service.
|
||||
@@ -17,9 +17,9 @@ DECLARE_SCRIPTING_TYPE_NO_SPAWN(ViewportIconsRenderer);
|
||||
public:
|
||||
|
||||
/// <summary>
|
||||
/// Draws the icons for the actors in the given scene.
|
||||
/// Draws the icons for the actors in the given scene (or actor tree).
|
||||
/// </summary>
|
||||
/// <param name="renderContext">The rendering context.</param>
|
||||
/// <param name="scene">The scene.</param>
|
||||
API_FUNCTION() static void DrawIcons(API_PARAM(Ref) RenderContext& renderContext, Scene* scene);
|
||||
/// <param name="actor">The actor (use scene for faster rendering).</param>
|
||||
API_FUNCTION() static void DrawIcons(API_PARAM(Ref) RenderContext& renderContext, Actor* actor);
|
||||
};
|
||||
|
||||
@@ -62,7 +62,7 @@ namespace FlaxEditor.Viewport
|
||||
/// </summary>
|
||||
/// <seealso cref="FlaxEngine.PostProcessEffect" />
|
||||
[HideInEditor]
|
||||
public sealed class EditorSpritesRenderer : PostProcessEffect
|
||||
public class EditorSpritesRenderer : PostProcessEffect
|
||||
{
|
||||
/// <summary>
|
||||
/// The rendering task.
|
||||
@@ -100,11 +100,7 @@ namespace FlaxEditor.Viewport
|
||||
context.SetRenderTarget(depthBufferHandle, input.View());
|
||||
|
||||
// Collect draw calls
|
||||
for (int i = 0; i < Level.ScenesCount; i++)
|
||||
{
|
||||
var scene = Level.GetScene(i);
|
||||
ViewportIconsRenderer.DrawIcons(ref renderContext, scene);
|
||||
}
|
||||
Draw(ref renderContext);
|
||||
|
||||
// Sort draw calls
|
||||
renderList.SortDrawCalls(ref renderContext, true, DrawCallsListType.Forward);
|
||||
@@ -118,6 +114,18 @@ namespace FlaxEditor.Viewport
|
||||
|
||||
Profiler.EndEventGPU();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Draws the icons.
|
||||
/// </summary>
|
||||
protected virtual void Draw(ref RenderContext renderContext)
|
||||
{
|
||||
for (int i = 0; i < Level.ScenesCount; i++)
|
||||
{
|
||||
var scene = Level.GetScene(i);
|
||||
ViewportIconsRenderer.DrawIcons(ref renderContext, scene);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private readonly ViewportDebugDrawData _debugDrawData = new ViewportDebugDrawData(32);
|
||||
|
||||
@@ -26,6 +26,18 @@ namespace FlaxEditor.Viewport
|
||||
/// <seealso cref="IGizmoOwner" />
|
||||
public class PrefabWindowViewport : PrefabPreview, IEditorPrimitivesOwner
|
||||
{
|
||||
private sealed class PrefabSpritesRenderer : MainEditorGizmoViewport.EditorSpritesRenderer
|
||||
{
|
||||
public PrefabWindowViewport Viewport;
|
||||
|
||||
public override bool CanRender => (Task.View.Flags & ViewFlags.EditorSprites) == ViewFlags.EditorSprites && Enabled;
|
||||
|
||||
protected override void Draw(ref RenderContext renderContext)
|
||||
{
|
||||
ViewportIconsRenderer.DrawIcons(ref renderContext, Viewport.Instance);
|
||||
}
|
||||
}
|
||||
|
||||
private readonly PrefabWindow _window;
|
||||
private UpdateDelegate _update;
|
||||
|
||||
@@ -39,6 +51,7 @@ namespace FlaxEditor.Viewport
|
||||
|
||||
private readonly ViewportDebugDrawData _debugDrawData = new ViewportDebugDrawData(32);
|
||||
private IntPtr _debugDrawContext;
|
||||
private PrefabSpritesRenderer _spritesRenderer;
|
||||
private readonly DragAssets _dragAssets = new DragAssets(ValidateDragItem);
|
||||
private readonly DragActorType _dragActorType = new DragActorType(ValidateDragActorType);
|
||||
private readonly DragHandlers _dragHandlers = new DragHandlers();
|
||||
@@ -78,7 +91,7 @@ namespace FlaxEditor.Viewport
|
||||
|
||||
// Prepare rendering task
|
||||
Task.ActorsSource = ActorsSources.CustomActors;
|
||||
Task.ViewFlags = ViewFlags.DefaultEditor & ~ViewFlags.EditorSprites;
|
||||
Task.ViewFlags = ViewFlags.DefaultEditor;
|
||||
Task.Begin += OnBegin;
|
||||
Task.CollectDrawCalls += OnCollectDrawCalls;
|
||||
Task.PostRender += OnPostRender;
|
||||
@@ -90,6 +103,10 @@ namespace FlaxEditor.Viewport
|
||||
EditorPrimitives = FlaxEngine.Object.New<EditorPrimitives>();
|
||||
EditorPrimitives.Viewport = this;
|
||||
Task.CustomPostFx.Add(EditorPrimitives);
|
||||
_spritesRenderer = FlaxEngine.Object.New<PrefabSpritesRenderer>();
|
||||
_spritesRenderer.Task = Task;
|
||||
_spritesRenderer.Viewport = this;
|
||||
Task.CustomPostFx.Add(_spritesRenderer);
|
||||
|
||||
// Add transformation gizmo
|
||||
TransformGizmo = new TransformGizmo(this);
|
||||
@@ -258,6 +275,12 @@ namespace FlaxEditor.Viewport
|
||||
EditorPrimitives.Render(context, ref renderContext, task.Output, task.Output);
|
||||
}
|
||||
|
||||
// Render editor sprites
|
||||
if (_spritesRenderer && _spritesRenderer.CanRender)
|
||||
{
|
||||
_spritesRenderer.Render(context, ref renderContext, task.Output, task.Output);
|
||||
}
|
||||
|
||||
// Render selection outline
|
||||
if (SelectionOutline && SelectionOutline.CanRender)
|
||||
{
|
||||
@@ -855,6 +878,7 @@ namespace FlaxEditor.Viewport
|
||||
}
|
||||
FlaxEngine.Object.Destroy(ref SelectionOutline);
|
||||
FlaxEngine.Object.Destroy(ref EditorPrimitives);
|
||||
FlaxEngine.Object.Destroy(ref _spritesRenderer);
|
||||
|
||||
base.OnDestroy();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user