Refactor scene rendering to separate drawable actors

This commit is contained in:
Wojtek Figat
2022-10-27 18:27:12 +02:00
parent 4123e4cf69
commit e217d5e79b
22 changed files with 129 additions and 102 deletions

View File

@@ -43,7 +43,7 @@ void VolumeParticleMaterialShader::Bind(BindParameters& params)
{
// Prepare
auto context = params.GPUContext;
auto& view = params.RenderContext.View;
const RenderView& view = params.RenderContext.View;
auto& drawCall = *params.FirstDrawCall;
Span<byte> cb(_cbData.Get(), _cbData.Count());
ASSERT_LOW_LAYER(cb.Length() >= sizeof(VolumeParticleMaterialShaderData));

View File

@@ -32,27 +32,26 @@
#if USE_MONO
// TODO: use API for events and remove this manual wrapper code
class RenderContextInternal
struct RenderContextManaged
{
public:
MonoObject* Buffers;
MonoObject* List;
RenderView View;
RenderView* LodProxyView;
MonoObject* Task;
RenderView* LodProxyView;
RenderView View;
};
// TODO: use API for events and remove this manual wrapper code
namespace
{
RenderContextInternal ToManaged(const RenderContext& value)
RenderContextManaged ToManaged(const RenderContext& value)
{
RenderContextInternal result;
RenderContextManaged result;
result.Buffers = ScriptingObject::ToManaged((ScriptingObject*)value.Buffers);
result.List = ScriptingObject::ToManaged((ScriptingObject*)value.List);
result.View = value.View;
result.LodProxyView = value.LodProxyView;
result.Task = ScriptingObject::ToManaged((ScriptingObject*)value.Task);
result.LodProxyView = value.LodProxyView;
result.View = value.View;
return result;
}
}
@@ -204,7 +203,7 @@ void ManagedPostProcessEffect::Render(RenderContext& renderContext, GPUTexture*
auto renderMethod = mclass->FindMethod("Render", 4, true);
if (renderMethod == nullptr)
return;
RenderContextInternal tmp = ::ToManaged(renderContext);
RenderContextManaged tmp = ::ToManaged(renderContext);
void* params[4];
params[0] = context->GetOrCreateManagedInstance();
params[1] = &tmp;
@@ -286,7 +285,7 @@ void AddActorToSceneRendering(SceneRendering* s, Actor* a)
}
}
void SceneRenderTask::OnCollectDrawCalls(RenderContext& renderContext)
void SceneRenderTask::OnCollectDrawCalls(RenderContext& renderContext, byte category)
{
// Draw actors (collect draw calls)
if ((ActorsSource & ActorsSources::CustomActors) != 0)
@@ -297,11 +296,11 @@ void SceneRenderTask::OnCollectDrawCalls(RenderContext& renderContext)
_customActorsScene->Clear();
for (Actor* a : CustomActors)
AddActorToSceneRendering(_customActorsScene, a);
_customActorsScene->Draw(renderContext);
_customActorsScene->Draw(renderContext, (SceneRendering::DrawCategory)category);
}
if ((ActorsSource & ActorsSources::Scenes) != 0)
{
Level::DrawActors(renderContext);
Level::DrawActors(renderContext, category);
}
// External drawing event
@@ -311,10 +310,18 @@ void SceneRenderTask::OnCollectDrawCalls(RenderContext& renderContext)
void SceneRenderTask::OnPreRender(GPUContext* context, RenderContext& renderContext)
{
PreRender(context, renderContext);
// Collect initial draw calls
renderContext.View.Pass = DrawPass::GBuffer;
OnCollectDrawCalls(renderContext, SceneRendering::PreRender);
}
void SceneRenderTask::OnPostRender(GPUContext* context, RenderContext& renderContext)
{
// Collect final draw calls
renderContext.View.Pass = DrawPass::GBuffer;
OnCollectDrawCalls(renderContext, SceneRendering::PostRender);
PostRender(context, renderContext);
}
@@ -474,6 +481,6 @@ void MainRenderTask::OnBegin(GPUContext* context)
RenderContext::RenderContext(SceneRenderTask* task)
{
Buffers = task->Buffers;
View = task->View;
Task = task;
View = task->View;
}

View File

@@ -311,7 +311,8 @@ public:
/// Calls drawing scene objects.
/// </summary>
/// <param name="renderContext">The rendering context.</param>
virtual void OnCollectDrawCalls(RenderContext& renderContext);
/// <param name="category">The actors category to draw (see SceneRendering::DrawCategory).</param>
virtual void OnCollectDrawCalls(RenderContext& renderContext, byte category = 0);
/// <summary>
/// The action called after scene rendering. Can be used to perform custom pre-rendering or to modify the render view.
@@ -394,7 +395,7 @@ public:
/// <summary>
/// The high-level renderer context. Used to collect the draw calls for the scene rendering. Can be used to perform a custom rendering.
/// </summary>
API_STRUCT() struct RenderContext
API_STRUCT(NoDefault) struct RenderContext
{
DECLARE_SCRIPTING_TYPE_MINIMAL(RenderContext);
@@ -409,9 +410,9 @@ API_STRUCT() struct RenderContext
API_FIELD() RenderList* List = nullptr;
/// <summary>
/// The render view.
/// The scene rendering task that is a source of renderable objects (optional).
/// </summary>
API_FIELD() RenderView View;
API_FIELD() SceneRenderTask* Task = nullptr;
/// <summary>
/// The proxy render view used to synchronize objects level of detail during rendering (eg. during shadow maps rendering passes). It's optional.
@@ -419,9 +420,9 @@ API_STRUCT() struct RenderContext
API_FIELD() RenderView* LodProxyView = nullptr;
/// <summary>
/// The scene rendering task that is a source of renderable objects (optional).
/// The render view.
/// </summary>
API_FIELD() SceneRenderTask* Task = nullptr;
API_FIELD() RenderView View;
RenderContext()
{

View File

@@ -19,7 +19,7 @@ class SceneRenderTask;
/// <summary>
/// Rendering view description that defines how to render the objects (camera placement, rendering properties, etc.).
/// </summary>
API_STRUCT() struct FLAXENGINE_API RenderView
API_STRUCT(NoDefault) struct FLAXENGINE_API RenderView
{
DECLARE_SCRIPTING_TYPE_MINIMAL(RenderView);