Refactor scene rendering to separate drawable actors
This commit is contained in:
@@ -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));
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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()
|
||||
{
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user