diff --git a/Source/Editor/Utilities/EditorScene.cpp b/Source/Editor/Utilities/EditorScene.cpp index 4350a31ff..4188e7eb3 100644 --- a/Source/Editor/Utilities/EditorScene.cpp +++ b/Source/Editor/Utilities/EditorScene.cpp @@ -2,6 +2,8 @@ #include "EditorScene.h" +#include "Engine/Debug/DebugDraw.h" + EditorScene::EditorScene(const SpawnParams& params) : Scene(params) { diff --git a/Source/Editor/Viewport/MainEditorGizmoViewport.cs b/Source/Editor/Viewport/MainEditorGizmoViewport.cs index 7906cc6e5..3d44ff477 100644 --- a/Source/Editor/Viewport/MainEditorGizmoViewport.cs +++ b/Source/Editor/Viewport/MainEditorGizmoViewport.cs @@ -427,7 +427,7 @@ namespace FlaxEditor.Viewport { fixed (IntPtr* actors = _debugDrawData.ActorsPtrs) { - DebugDraw.DrawActors(new IntPtr(actors), _debugDrawData.ActorsCount); + DebugDraw.DrawActors(new IntPtr(actors), _debugDrawData.ActorsCount, true); } } diff --git a/Source/Editor/Viewport/PrefabWindowViewport.cs b/Source/Editor/Viewport/PrefabWindowViewport.cs index 1276fc56d..0e6af06fd 100644 --- a/Source/Editor/Viewport/PrefabWindowViewport.cs +++ b/Source/Editor/Viewport/PrefabWindowViewport.cs @@ -37,6 +37,8 @@ namespace FlaxEditor.Viewport private ViewportWidgetButton _rotateSnapping; private ViewportWidgetButton _scaleSnapping; + private readonly ViewportDebugDrawData _debugDrawData = new ViewportDebugDrawData(32); + private IntPtr _debugDrawContext; private readonly DragAssets _dragAssets = new DragAssets(ValidateDragItem); private readonly DragActorType _dragActorType = new DragActorType(ValidateDragActorType); private readonly DragHandlers _dragHandlers = new DragHandlers(); @@ -56,6 +58,11 @@ namespace FlaxEditor.Viewport /// public EditorPrimitives EditorPrimitives; + /// + /// Gets or sets a value indicating whether draw shapes. + /// + public bool DrawDebugDraw = true; + /// /// Initializes a new instance of the class. /// @@ -67,10 +74,13 @@ namespace FlaxEditor.Viewport _window.SelectionChanged += OnSelectionChanged; Undo = window.Undo; ViewportCamera = new FPSCamera(); + _debugDrawContext = DebugDraw.AllocateContext(); // Prepare rendering task Task.ActorsSource = ActorsSources.CustomActors; Task.ViewFlags = ViewFlags.DefaultEditor & ~ViewFlags.EditorSprites; + Task.Begin += OnBegin; + Task.CollectDrawCalls += OnCollectDrawCalls; Task.PostRender += OnPostRender; // Create post effects @@ -214,6 +224,27 @@ namespace FlaxEditor.Viewport } } + private void OnBegin(RenderTask task, GPUContext context) + { + _debugDrawData.Clear(); + + // Collect selected objects debug shapes and visuals + var selectedParents = TransformGizmo.SelectedParents; + if (selectedParents.Count > 0) + { + for (int i = 0; i < selectedParents.Count; i++) + { + if (selectedParents[i].IsActiveInHierarchy) + selectedParents[i].OnDebugDraw(_debugDrawData); + } + } + } + + private void OnCollectDrawCalls(RenderContext renderContext) + { + _debugDrawData.OnDraw(ref renderContext); + } + private void OnPostRender(GPUContext context, RenderContext renderContext) { if (renderContext.View.Mode != ViewMode.Default) @@ -222,7 +253,24 @@ namespace FlaxEditor.Viewport // Render editor primitives, gizmo and debug shapes in debug view modes // Note: can use Output buffer as both input and output because EditorPrimitives is using a intermediate buffers - EditorPrimitives.Render(context, ref renderContext, task.Output, task.Output); + if (EditorPrimitives && EditorPrimitives.CanRender) + { + EditorPrimitives.Render(context, ref renderContext, task.Output, task.Output); + } + + // Render selection outline + if (SelectionOutline && SelectionOutline.CanRender) + { + // Use temporary intermediate buffer + var desc = task.Output.Description; + var temp = RenderTargetPool.Get(ref desc); + SelectionOutline.Render(context, ref renderContext, task.Output, temp); + + // Copy the results back to the output + context.CopyTexture(task.Output, 0, 0, 0, 0, temp, 0); + + RenderTargetPool.Release(temp); + } } } @@ -800,6 +848,11 @@ namespace FlaxEditor.Viewport /// public override void OnDestroy() { + if (_debugDrawContext != IntPtr.Zero) + { + DebugDraw.FreeContext(_debugDrawContext); + _debugDrawContext = IntPtr.Zero; + } FlaxEngine.Object.Destroy(ref SelectionOutline); FlaxEngine.Object.Destroy(ref EditorPrimitives); @@ -809,6 +862,21 @@ namespace FlaxEditor.Viewport /// public void DrawEditorPrimitives(GPUContext context, ref RenderContext renderContext, GPUTexture target, GPUTexture targetDepth) { + // Draw selected objects debug shapes and visuals + if (DrawDebugDraw && (renderContext.View.Flags & ViewFlags.DebugDraw) == ViewFlags.DebugDraw) + { + DebugDraw.SetContext(_debugDrawContext); + DebugDraw.UpdateContext(_debugDrawContext, 1.0f / Engine.FramesPerSecond); + unsafe + { + fixed (IntPtr* actors = _debugDrawData.ActorsPtrs) + { + DebugDraw.DrawActors(new IntPtr(actors), _debugDrawData.ActorsCount, false); + } + } + DebugDraw.Draw(ref renderContext, target.View(), targetDepth.View(), true); + DebugDraw.SetContext(IntPtr.Zero); + } } } } diff --git a/Source/Editor/Windows/Assets/PrefabWindow.cs b/Source/Editor/Windows/Assets/PrefabWindow.cs index 4cc7898ee..60823572e 100644 --- a/Source/Editor/Windows/Assets/PrefabWindow.cs +++ b/Source/Editor/Windows/Assets/PrefabWindow.cs @@ -10,6 +10,7 @@ using FlaxEditor.SceneGraph; using FlaxEditor.Viewport; using FlaxEngine; using FlaxEngine.GUI; +using Object = FlaxEngine.Object; namespace FlaxEditor.Windows.Assets { @@ -22,7 +23,7 @@ namespace FlaxEditor.Windows.Assets { private readonly SplitPanel _split1; private readonly SplitPanel _split2; - private TextBox _searchBox; + private readonly TextBox _searchBox; private readonly PrefabTree _tree; private readonly PrefabWindowViewport _viewport; private readonly CustomEditorPresenter _propertiesEditor; diff --git a/Source/Engine/Debug/DebugDraw.cpp b/Source/Engine/Debug/DebugDraw.cpp index bae424c4e..7a6444a89 100644 --- a/Source/Engine/Debug/DebugDraw.cpp +++ b/Source/Engine/Debug/DebugDraw.cpp @@ -205,20 +205,30 @@ struct DebugDrawData } }; -DebugDrawData DebugDrawDefault; -DebugDrawData DebugDrawDepthTest; -AssetReference DebugDrawShader; -PsData DebugDrawPsLinesDefault; -PsData DebugDrawPsLinesDepthTest; -PsData DebugDrawPsWireTrianglesDefault; -PsData DebugDrawPsWireTrianglesDepthTest; -PsData DebugDrawPsTrianglesDefault; -PsData DebugDrawPsTrianglesDepthTest; -DynamicVertexBuffer* DebugDrawVB = nullptr; -Vector3 SphereCache[DEBUG_DRAW_SPHERE_VERTICES]; -Vector3 CircleCache[DEBUG_DRAW_CIRCLE_VERTICES]; -Vector3 CylinderCache[DEBUG_DRAW_CYLINDER_VERTICES]; -Array SphereTriangleCache; +struct DebugDrawContext +{ + DebugDrawData DebugDrawDefault; + DebugDrawData DebugDrawDepthTest; +}; + +namespace +{ + DebugDrawContext GlobalContext; + DebugDrawContext* Context; + AssetReference DebugDrawShader; + PsData DebugDrawPsLinesDefault; + PsData DebugDrawPsLinesDepthTest; + PsData DebugDrawPsWireTrianglesDefault; + PsData DebugDrawPsWireTrianglesDepthTest; + PsData DebugDrawPsTrianglesDefault; + PsData DebugDrawPsTrianglesDepthTest; + DynamicVertexBuffer* DebugDrawVB = nullptr; + Vector3 SphereCache[DEBUG_DRAW_SPHERE_VERTICES]; + Vector3 CircleCache[DEBUG_DRAW_CIRCLE_VERTICES]; + Vector3 CylinderCache[DEBUG_DRAW_CYLINDER_VERTICES]; + Array SphereTriangleCache; +}; + extern int32 BoxTrianglesIndicesCache[]; struct DebugDrawCall @@ -307,6 +317,8 @@ DebugDrawService DebugDrawServiceInstance; bool DebugDrawService::Init() { + Context = &GlobalContext; + // Init wireframe sphere cache int32 index = 0; float step = TWO_PI / DEBUG_DRAW_SPHERE_RESOLUTION; @@ -436,8 +448,8 @@ void DebugDrawService::Update() // Special case for Null renderer if (GPUDevice::Instance->GetRendererType() == RendererType::Null) { - DebugDrawDefault.Clear(); - DebugDrawDepthTest.Clear(); + GlobalContext.DebugDrawDefault.Clear(); + GlobalContext.DebugDrawDepthTest.Clear(); return; } @@ -445,8 +457,8 @@ void DebugDrawService::Update() // Update lists const float deltaTime = Time::Update.DeltaTime.GetTotalSeconds(); - DebugDrawDefault.Update(deltaTime); - DebugDrawDepthTest.Update(deltaTime); + GlobalContext.DebugDrawDefault.Update(deltaTime); + GlobalContext.DebugDrawDepthTest.Update(deltaTime); // Check if need to setup a resources if (DebugDrawShader == nullptr) @@ -501,8 +513,8 @@ void DebugDrawService::Update() void DebugDrawService::Dispose() { // Clear lists - DebugDrawDefault.Release(); - DebugDrawDepthTest.Release(); + GlobalContext.DebugDrawDefault.Release(); + GlobalContext.DebugDrawDepthTest.Release(); // Release resources SphereTriangleCache.Resize(0); @@ -516,13 +528,41 @@ void DebugDrawService::Dispose() DebugDrawShader = nullptr; } +#if USE_EDITOR + +void* DebugDraw::AllocateContext() +{ + auto context = (DebugDrawContext*)Allocator::Allocate(sizeof(DebugDrawContext)); + Memory::ConstructItem(context); + return context; +} + +void DebugDraw::FreeContext(void* context) +{ + Memory::DestructItem((DebugDrawContext*)context); + Allocator::Free(context); +} + +void DebugDraw::UpdateContext(void* context, float deltaTime) +{ + ((DebugDrawContext*)context)->DebugDrawDefault.Update(deltaTime); + ((DebugDrawContext*)context)->DebugDrawDepthTest.Update(deltaTime); +} + +void DebugDraw::SetContext(void* context) +{ + Context = context ? (DebugDrawContext*)context : &GlobalContext; +} + +#endif + void DebugDraw::Draw(RenderContext& renderContext, GPUTextureView* target, GPUTextureView* depthBuffer, bool enableDepthTest) { PROFILE_GPU_CPU("Debug Draw"); // Ensure to have shader loaded and any lines to render - const int32 debugDrawDepthTestCount = DebugDrawDepthTest.Count(); - const int32 debugDrawDefaultCount = DebugDrawDefault.Count(); + const int32 debugDrawDepthTestCount = Context->DebugDrawDepthTest.Count(); + const int32 debugDrawDefaultCount = Context->DebugDrawDefault.Count(); if (DebugDrawShader == nullptr || !DebugDrawShader->IsLoaded() || debugDrawDepthTestCount + debugDrawDefaultCount == 0) return; if (renderContext.Buffers == nullptr || !DebugDrawVB) @@ -539,12 +579,12 @@ void DebugDraw::Draw(RenderContext& renderContext, GPUTextureView* target, GPUTe #endif DebugDrawVB->Clear(); int32 vertexCounter = 0; - const DebugDrawCall depthTestLines = WriteLists(vertexCounter, DebugDrawDepthTest.DefaultLines, DebugDrawDepthTest.OneFrameLines); - const DebugDrawCall defaultLines = WriteLists(vertexCounter, DebugDrawDefault.DefaultLines, DebugDrawDefault.OneFrameLines); - const DebugDrawCall depthTestTriangles = WriteLists(vertexCounter, DebugDrawDepthTest.DefaultTriangles, DebugDrawDepthTest.OneFrameTriangles); - const DebugDrawCall defaultTriangles = WriteLists(vertexCounter, DebugDrawDefault.DefaultTriangles, DebugDrawDefault.OneFrameTriangles); - const DebugDrawCall depthTestWireTriangles = WriteLists(vertexCounter, DebugDrawDepthTest.DefaultWireTriangles, DebugDrawDepthTest.OneFrameWireTriangles); - const DebugDrawCall defaultWireTriangles = WriteLists(vertexCounter, DebugDrawDefault.DefaultWireTriangles, DebugDrawDefault.OneFrameWireTriangles); + const DebugDrawCall depthTestLines = WriteLists(vertexCounter, Context->DebugDrawDepthTest.DefaultLines, Context->DebugDrawDepthTest.OneFrameLines); + const DebugDrawCall defaultLines = WriteLists(vertexCounter, Context->DebugDrawDefault.DefaultLines, Context->DebugDrawDefault.OneFrameLines); + const DebugDrawCall depthTestTriangles = WriteLists(vertexCounter, Context->DebugDrawDepthTest.DefaultTriangles, Context->DebugDrawDepthTest.OneFrameTriangles); + const DebugDrawCall defaultTriangles = WriteLists(vertexCounter, Context->DebugDrawDefault.DefaultTriangles, Context->DebugDrawDefault.OneFrameTriangles); + const DebugDrawCall depthTestWireTriangles = WriteLists(vertexCounter, Context->DebugDrawDepthTest.DefaultWireTriangles, Context->DebugDrawDepthTest.OneFrameWireTriangles); + const DebugDrawCall defaultWireTriangles = WriteLists(vertexCounter, Context->DebugDrawDefault.DefaultWireTriangles, Context->DebugDrawDefault.OneFrameWireTriangles); DebugDrawVB->Flush(context); #if COMPILE_WITH_PROFILER ProfilerCPU::EndEvent(updateBufferProfileKey); @@ -580,7 +620,7 @@ void DebugDraw::Draw(RenderContext& renderContext, GPUTextureView* target, GPUTe context->BindVB(ToSpan(&vb, 1)); context->Draw(depthTestLines.StartVertex, depthTestLines.VertexCount); } - + // Wire Triangles if (depthTestWireTriangles.VertexCount) { @@ -636,9 +676,10 @@ void DebugDraw::Draw(RenderContext& renderContext, GPUTextureView* target, GPUTe #undef DRAW } -void DebugDraw::DrawActors(Actor** selectedActors, int32 selectedActorsCount) +void DebugDraw::DrawActors(Actor** selectedActors, int32 selectedActorsCount, bool drawScenes) { PROFILE_CPU(); + if (selectedActors) { for (int32 i = 0; i < selectedActorsCount; i++) @@ -649,16 +690,19 @@ void DebugDraw::DrawActors(Actor** selectedActors, int32 selectedActorsCount) } } - Function function = [](Actor* actor)-> bool + if (drawScenes) { - if (actor->IsActiveInHierarchy()) + Function function = [](Actor* actor)-> bool { - actor->OnDebugDraw(); - return true; - } - return false; - }; - SceneQuery::TreeExecute(function); + if (actor->IsActiveInHierarchy()) + { + actor->OnDebugDraw(); + return true; + } + return false; + }; + SceneQuery::TreeExecute(function); + } } void DebugDraw::DrawLine(const Vector3& start, const Vector3& end, const Color& color, float duration, bool depthTest) @@ -668,9 +712,9 @@ void DebugDraw::DrawLine(const Vector3& start, const Vector3& end, const Color& // Add line if (depthTest) - DebugDrawDepthTest.Add(l); + Context->DebugDrawDepthTest.Add(l); else - DebugDrawDefault.Add(l); + Context->DebugDrawDefault.Add(l); } void DebugDraw::DrawLines(const Span& lines, const Matrix& transform, const Color& color, float duration, bool depthTest) @@ -688,10 +732,10 @@ void DebugDraw::DrawLines(const Span& lines, const Matrix& transform, c const Vector3* p = lines.Get(); Array* list; - if (depthTest) - list = duration > 0 ? &DebugDrawDepthTest.DefaultLines : &DebugDrawDepthTest.OneFrameLines; + if (depthTest) + list = duration > 0 ? &Context->DebugDrawDepthTest.DefaultLines : &Context->DebugDrawDepthTest.OneFrameLines; else - list = duration > 0 ? &DebugDrawDefault.DefaultLines : &DebugDrawDefault.OneFrameLines; + list = duration > 0 ? &Context->DebugDrawDefault.DefaultLines : &Context->DebugDrawDefault.OneFrameLines; list->EnsureCapacity(list->Count() + lines.Length()); for (int32 i = 0; i < lines.Length(); i += 2) @@ -707,9 +751,9 @@ void DebugDraw::DrawBezier(const Vector3& p1, const Vector3& p2, const Vector3& // Create draw call entry Array* list; if (depthTest) - list = duration > 0 ? &DebugDrawDepthTest.DefaultLines : &DebugDrawDepthTest.OneFrameLines; + list = duration > 0 ? &Context->DebugDrawDepthTest.DefaultLines : &Context->DebugDrawDepthTest.OneFrameLines; else - list = duration > 0 ? &DebugDrawDefault.DefaultLines : &DebugDrawDefault.OneFrameLines; + list = duration > 0 ? &Context->DebugDrawDefault.DefaultLines : &Context->DebugDrawDefault.OneFrameLines; DebugLine l = { p1, Vector3::Zero, Color32(color), duration }; // Find amount of segments to use @@ -731,7 +775,7 @@ void DebugDraw::DrawBezier(const Vector3& p1, const Vector3& p2, const Vector3& } } -#define DRAW_WIRE_BOX_LINE(i0, i1, list) l.Start = corners[i0]; l.End = corners[i1]; list.Add(l) +#define DRAW_WIRE_BOX_LINE(i0, i1, list) l.Start = corners[i0]; l.End = corners[i1]; Context->list.Add(l) #define DRAW_WIRE_BOX(list) \ DRAW_WIRE_BOX_LINE(0, 1, list); \ DRAW_WIRE_BOX_LINE(0, 3, list); \ @@ -818,7 +862,7 @@ void DebugDraw::DrawWireSphere(const BoundingSphere& sphere, const Color& color, { l.Start = sphere.Center + SphereCache[i++] * sphere.Radius; l.End = sphere.Center + SphereCache[i++] * sphere.Radius; - DebugDrawDepthTest.Add(l); + Context->DebugDrawDepthTest.Add(l); } } else @@ -827,7 +871,7 @@ void DebugDraw::DrawWireSphere(const BoundingSphere& sphere, const Color& color, { l.Start = sphere.Center + SphereCache[i++] * sphere.Radius; l.End = sphere.Center + SphereCache[i++] * sphere.Radius; - DebugDrawDefault.Add(l); + Context->DebugDrawDefault.Add(l); } } } @@ -840,9 +884,9 @@ void DebugDraw::DrawSphere(const BoundingSphere& sphere, const Color& color, flo Array* list; if (depthTest) - list = duration > 0 ? &DebugDrawDepthTest.DefaultTriangles : &DebugDrawDepthTest.OneFrameTriangles; + list = duration > 0 ? &Context->DebugDrawDepthTest.DefaultTriangles : &Context->DebugDrawDepthTest.OneFrameTriangles; else - list = duration > 0 ? &DebugDrawDefault.DefaultTriangles : &DebugDrawDefault.OneFrameTriangles; + list = duration > 0 ? &Context->DebugDrawDefault.DefaultTriangles : &Context->DebugDrawDefault.OneFrameTriangles; list->EnsureCapacity(list->Count() + SphereTriangleCache.Count()); for (int32 i = 0; i < SphereTriangleCache.Count();) @@ -899,11 +943,11 @@ void DebugDraw::DrawTriangle(const Vector3& v0, const Vector3& v1, const Vector3 if (depthTest) { - DebugDrawDepthTest.Add(t); + Context->DebugDrawDepthTest.Add(t); } else { - DebugDrawDefault.Add(t); + Context->DebugDrawDefault.Add(t); } } @@ -917,9 +961,9 @@ void DebugDraw::DrawTriangles(const Span& vertices, const Color& color, Array* list; if (depthTest) - list = duration > 0 ? &DebugDrawDepthTest.DefaultTriangles : &DebugDrawDepthTest.OneFrameTriangles; + list = duration > 0 ? &Context->DebugDrawDepthTest.DefaultTriangles : &Context->DebugDrawDepthTest.OneFrameTriangles; else - list = duration > 0 ? &DebugDrawDefault.DefaultTriangles : &DebugDrawDefault.OneFrameTriangles; + list = duration > 0 ? &Context->DebugDrawDefault.DefaultTriangles : &Context->DebugDrawDefault.OneFrameTriangles; list->EnsureCapacity(list->Count() + vertices.Length() / 3); for (int32 i = 0; i < vertices.Length();) @@ -946,9 +990,9 @@ void DebugDraw::DrawTriangles(const Span& vertices, const Span& Array* list; if (depthTest) - list = duration > 0 ? &DebugDrawDepthTest.DefaultTriangles : &DebugDrawDepthTest.OneFrameTriangles; + list = duration > 0 ? &Context->DebugDrawDepthTest.DefaultTriangles : &Context->DebugDrawDepthTest.OneFrameTriangles; else - list = duration > 0 ? &DebugDrawDefault.DefaultTriangles : &DebugDrawDefault.OneFrameTriangles; + list = duration > 0 ? &Context->DebugDrawDefault.DefaultTriangles : &Context->DebugDrawDefault.OneFrameTriangles; list->EnsureCapacity(list->Count() + indices.Length() / 3); for (int32 i = 0; i < indices.Length();) @@ -975,9 +1019,9 @@ void DebugDraw::DrawWireTriangles(const Span& vertices, const Color& co Array* list; if (depthTest) - list = duration > 0 ? &DebugDrawDepthTest.DefaultWireTriangles : &DebugDrawDepthTest.OneFrameWireTriangles; + list = duration > 0 ? &Context->DebugDrawDepthTest.DefaultWireTriangles : &Context->DebugDrawDepthTest.OneFrameWireTriangles; else - list = duration > 0 ? &DebugDrawDefault.DefaultWireTriangles : &DebugDrawDefault.OneFrameWireTriangles; + list = duration > 0 ? &Context->DebugDrawDefault.DefaultWireTriangles : &Context->DebugDrawDefault.OneFrameWireTriangles; list->EnsureCapacity(list->Count() + vertices.Length() / 3); for (int32 i = 0; i < vertices.Length();) @@ -1004,9 +1048,9 @@ void DebugDraw::DrawWireTriangles(const Span& vertices, const Span* list; if (depthTest) - list = duration > 0 ? &DebugDrawDepthTest.DefaultWireTriangles : &DebugDrawDepthTest.OneFrameWireTriangles; + list = duration > 0 ? &Context->DebugDrawDepthTest.DefaultWireTriangles : &Context->DebugDrawDepthTest.OneFrameWireTriangles; else - list = duration > 0 ? &DebugDrawDefault.DefaultWireTriangles : &DebugDrawDefault.OneFrameWireTriangles; + list = duration > 0 ? &Context->DebugDrawDefault.DefaultWireTriangles : &Context->DebugDrawDefault.OneFrameWireTriangles; list->EnsureCapacity(list->Count() + indices.Length() / 3); for (int32 i = 0; i < indices.Length();) @@ -1192,9 +1236,9 @@ void DebugDraw::DrawBox(const BoundingBox& box, const Color& color, float durati t.TimeLeft = duration; Array* list; if (depthTest) - list = duration > 0 ? &DebugDrawDepthTest.DefaultTriangles : &DebugDrawDepthTest.OneFrameTriangles; + list = duration > 0 ? &Context->DebugDrawDepthTest.DefaultTriangles : &Context->DebugDrawDepthTest.OneFrameTriangles; else - list = duration > 0 ? &DebugDrawDefault.DefaultTriangles : &DebugDrawDefault.OneFrameTriangles; + list = duration > 0 ? &Context->DebugDrawDefault.DefaultTriangles : &Context->DebugDrawDefault.OneFrameTriangles; list->EnsureCapacity(list->Count() + 36); for (int i0 = 0; i0 < 36;) { @@ -1218,9 +1262,9 @@ void DebugDraw::DrawBox(const OrientedBoundingBox& box, const Color& color, floa t.TimeLeft = duration; Array* list; if (depthTest) - list = duration > 0 ? &DebugDrawDepthTest.DefaultTriangles : &DebugDrawDepthTest.OneFrameTriangles; + list = duration > 0 ? &Context->DebugDrawDepthTest.DefaultTriangles : &Context->DebugDrawDepthTest.OneFrameTriangles; else - list = duration > 0 ? &DebugDrawDefault.DefaultTriangles : &DebugDrawDefault.OneFrameTriangles; + list = duration > 0 ? &Context->DebugDrawDefault.DefaultTriangles : &Context->DebugDrawDefault.OneFrameTriangles; list->EnsureCapacity(list->Count() + 36); for (int i0 = 0; i0 < 36;) { diff --git a/Source/Engine/Debug/DebugDraw.h b/Source/Engine/Debug/DebugDraw.h index 69c3d4fed..a2681e1f2 100644 --- a/Source/Engine/Debug/DebugDraw.h +++ b/Source/Engine/Debug/DebugDraw.h @@ -23,6 +23,35 @@ API_CLASS(Static) class FLAXENGINE_API DebugDraw { DECLARE_SCRIPTING_TYPE_NO_SPAWN(DebugDraw); +#if USE_EDITOR + + /// + /// Allocates the context for Debug Drawing. Can be use to redirect debug shapes collecting to a separate container (instead of global state). + /// + /// The context object. Release it wil FreeContext. Returns null if failed. + API_FUNCTION() static void* AllocateContext(); + + /// + /// Frees the context for Debug Drawing. + /// + /// The context. + API_FUNCTION() static void FreeContext(void* context); + + /// + /// Updates the context for Debug Drawing. + /// + /// The context. + /// The update delta time (in seconds). + API_FUNCTION() static void UpdateContext(void* context, float deltaTime); + + /// + /// Sets the context for Debug Drawing to a custom or null to use global default. + /// + /// The context or null. + API_FUNCTION() static void SetContext(void* context); + +#endif + /// /// Draws the collected debug shapes to the output. /// @@ -37,7 +66,8 @@ DECLARE_SCRIPTING_TYPE_NO_SPAWN(DebugDraw); /// /// The list of actors to draw. /// The size of the list of actors. - API_FUNCTION() static void DrawActors(Actor** selectedActors, int32 selectedActorsCount); + /// True if draw all debug shapes from scenes too or false if draw just from specified actor list. + API_FUNCTION() static void DrawActors(Actor** selectedActors, int32 selectedActorsCount, bool drawScenes); /// /// Draws the line.