Add Loaded event to Asset in scripting

Refactor `Asset` events naming to match engine scheme
This commit is contained in:
2026-07-28 22:32:36 +02:00
parent e043b18299
commit eb69dafb7c
44 changed files with 117 additions and 145 deletions
+2 -2
View File
@@ -213,7 +213,7 @@ void SplashScreen::Show()
if (font->IsLoaded())
OnFontLoaded(font);
else
font->OnLoaded.Bind<SplashScreen, &SplashScreen::OnFontLoaded>(this);
font->Loaded.Bind<SplashScreen, &SplashScreen::OnFontLoaded>(this);
}
// Load custom image
@@ -337,7 +337,7 @@ void SplashScreen::OnFontLoaded(Asset* asset)
ASSERT(asset && asset->IsLoaded());
auto font = (FontAsset*)asset;
font->OnLoaded.Unbind<SplashScreen, &SplashScreen::OnFontLoaded>(this);
font->Loaded.Unbind<SplashScreen, &SplashScreen::OnFontLoaded>(this);
// Create fonts
const float s = _dpiScale;
+14 -2
View File
@@ -403,7 +403,10 @@ uint64 Asset::GetMemoryUsage() const
Locker.Lock();
if (Platform::AtomicRead(&_loadingTask))
result += sizeof(ContentLoadTask);
result += (Loaded.Capacity() + Reloading.Capacity() + Unloaded.Capacity()) * sizeof(Delegate<Asset*>::FunctionType);
PRAGMA_DISABLE_DEPRECATION_WARNINGS;
result += (OnLoaded.Capacity() + OnReloading.Capacity() + OnUnloaded.Capacity()) * sizeof(EventType::FunctionType);
PRAGMA_ENABLE_DEPRECATION_WARNINGS;
result += _references.Capacity() * sizeof(HashSet<IAssetReference*>::Bucket);
Locker.Unlock();
return result;
@@ -426,7 +429,10 @@ void Asset::Reload()
// Fire event
if (!IsInternalType())
Content::AssetReloading(this);
PRAGMA_DISABLE_DEPRECATION_WARNINGS;
OnReloading(this);
Reloading(this);
PRAGMA_ENABLE_DEPRECATION_WARNINGS;
ScopeLock lock(Locker);
@@ -676,14 +682,17 @@ bool Asset::onLoad(LoadAssetTask* task)
return failed;
}
PRAGMA_DISABLE_DEPRECATION_WARNINGS;
void Asset::onLoaded()
{
if (IsInMainThread())
{
onLoaded_MainThread();
}
else if (OnLoaded.IsBinded() || _references.HasItems())
else if (OnLoaded.IsBinded() || Loaded.IsBinded() || _references.HasItems())
{
// Delay event call to the main thread
Function<void()> action;
action.Bind<Asset, &Asset::onLoaded>(this);
Task::StartNew(New<MainThreadActionTask>(action, this));
@@ -699,12 +708,12 @@ void Asset::onLoaded_MainThread()
for (const auto& e : _references)
e.Item->OnAssetLoaded(this, this);
OnLoaded(this);
Loaded(this);
}
void Asset::onUnload_MainThread()
{
// Note: asset should not be locked now (Locker should be free) so other thread won't be locked.
ASSERT(IsInMainThread());
// Cancel any streaming before calling OnUnloaded event
@@ -715,8 +724,11 @@ void Asset::onUnload_MainThread()
for (const auto& e : _references)
e.Item->OnAssetUnloaded(this, this);
OnUnloaded(this);
Unloaded(this);
}
PRAGMA_ENABLE_DEPRECATION_WARNINGS;
bool Asset::WaitForInitGraphics()
{
#define IS_GPU_NOT_READY() (GPUDevice::Instance == nullptr || GPUDevice::Instance->GetState() != GPUDevice::DeviceState::Ready)
+22 -4
View File
@@ -78,18 +78,36 @@ public:
/// <summary>
/// Action called when asset gets loaded
/// [Deprecated in v1.13]
/// </summary>
EventType OnLoaded;
DEPRECATED("Use Loaded event instead.") EventType OnLoaded;
/// <summary>
/// Action called when asset gets loaded. Always called from the main thread.
/// </summary>
API_EVENT() Delegate<Asset*> Loaded;
/// <summary>
/// Action called when asset start reloading (e.g. after reimport). Always called from the main thread.
/// [Deprecated in v1.13]
/// </summary>
DEPRECATED("Use Reloading event instead.") EventType OnReloading;
/// <summary>
/// Action called when asset start reloading (e.g. after reimport). Always called from the main thread.
/// </summary>
EventType OnReloading;
Delegate<Asset*> Reloading;
/// <summary>
/// Action called when asset gets unloaded
/// Action called when asset gets unloaded. Always called from the main thread.
/// [Deprecated in v1.13]
/// </summary>
EventType OnUnloaded;
DEPRECATED("Use Unloaded event instead.") EventType OnUnloaded;
/// <summary>
/// Action called when asset gets unloaded. Always called from the main thread.
/// </summary>
Delegate<Asset*> Unloaded;
/// <summary>
/// General purpose mutex for an asset object. Should guard most of the asset functionalities to be secure.
@@ -25,7 +25,7 @@ void MaterialInstance::OnBaseSet()
ASSERT(_baseMaterial->IsLoaded());
_baseMaterial->AddReference();
_baseMaterial->OnUnloaded.Bind<MaterialInstance, &MaterialInstance::OnBaseUnloaded>(this);
_baseMaterial->Unloaded.Bind<MaterialInstance, &MaterialInstance::OnBaseUnloaded>(this);
_baseMaterial->ParamsChanged.Bind<MaterialInstance, &MaterialInstance::OnBaseParamsChanged>(this);
// Sync parameters with the base parameters to ensure all data is valid for rendering (constants offset and resource register)
@@ -63,7 +63,7 @@ void MaterialInstance::OnBaseSet()
void MaterialInstance::OnBaseUnset()
{
_baseMaterial->RemoveReference();
_baseMaterial->OnUnloaded.Unbind<MaterialInstance, &MaterialInstance::OnBaseUnloaded>(this);
_baseMaterial->Unloaded.Unbind<MaterialInstance, &MaterialInstance::OnBaseUnloaded>(this);
_baseMaterial->ParamsChanged.Unbind<MaterialInstance, &MaterialInstance::OnBaseParamsChanged>(this);
}
@@ -197,9 +197,9 @@ SkinnedModel::SkeletonMapping SkinnedModel::GetSkeletonMapping(Asset* source, bo
// Add to cache
_skeletonMappingCache.Add(source, mappingData);
source->OnUnloaded.Bind<SkinnedModel, &SkinnedModel::OnSkeletonMappingSourceAssetUnloaded>(this);
source->Unloaded.Bind<SkinnedModel, &SkinnedModel::OnSkeletonMappingSourceAssetUnloaded>(this);
#if USE_EDITOR
source->OnReloading.Bind<SkinnedModel, &SkinnedModel::OnSkeletonMappingSourceAssetUnloaded>(this);
source->Reloading.Bind<SkinnedModel, &SkinnedModel::OnSkeletonMappingSourceAssetUnloaded>(this);
#endif
}
mapping.SourceSkeleton = mappingData.SourceSkeleton;
@@ -756,9 +756,9 @@ void SkinnedModel::ClearSkeletonMapping()
{
for (const auto& e : _skeletonMappingCache)
{
e.Key->OnUnloaded.Unbind<SkinnedModel, &SkinnedModel::OnSkeletonMappingSourceAssetUnloaded>(this);
e.Key->Unloaded.Unbind<SkinnedModel, &SkinnedModel::OnSkeletonMappingSourceAssetUnloaded>(this);
#if USE_EDITOR
e.Key->OnReloading.Unbind<SkinnedModel, &SkinnedModel::OnSkeletonMappingSourceAssetUnloaded>(this);
e.Key->Reloading.Unbind<SkinnedModel, &SkinnedModel::OnSkeletonMappingSourceAssetUnloaded>(this);
#endif
Allocator::Free((void*)e.Value.NodesMapping.Get());
}
@@ -773,9 +773,9 @@ void SkinnedModel::OnSkeletonMappingSourceAssetUnloaded(Asset* obj)
ASSERT(found);
// Unlink event
obj->OnUnloaded.Unbind<SkinnedModel, &SkinnedModel::OnSkeletonMappingSourceAssetUnloaded>(this);
obj->Unloaded.Unbind<SkinnedModel, &SkinnedModel::OnSkeletonMappingSourceAssetUnloaded>(this);
#if USE_EDITOR
obj->OnReloading.Unbind<SkinnedModel, &SkinnedModel::OnSkeletonMappingSourceAssetUnloaded>(this);
obj->Reloading.Unbind<SkinnedModel, &SkinnedModel::OnSkeletonMappingSourceAssetUnloaded>(this);
#endif
// Clear cache
+11 -11
View File
@@ -592,8 +592,8 @@ Variant::Variant(Variant&& other) noexcept
AsAsset = other.AsAsset;
if (AsAsset)
{
AsAsset->OnUnloaded.Unbind<Variant, &Variant::OnAssetUnloaded>(&other);
AsAsset->OnUnloaded.Bind<Variant, &Variant::OnAssetUnloaded>(this);
AsAsset->Unloaded.Unbind<Variant, &Variant::OnAssetUnloaded>(&other);
AsAsset->Unloaded.Bind<Variant, &Variant::OnAssetUnloaded>(this);
other.AsAsset = nullptr;
}
break;
@@ -723,7 +723,7 @@ Variant::Variant(Asset* v)
{
v->AddReference();
Type.SetTypeName(v->GetType());
v->OnUnloaded.Bind<Variant, &Variant::OnAssetUnloaded>(this);
v->Unloaded.Bind<Variant, &Variant::OnAssetUnloaded>(this);
}
}
@@ -976,7 +976,7 @@ Variant::~Variant()
case VariantType::Asset:
if (AsAsset)
{
AsAsset->OnUnloaded.Unbind<Variant, &Variant::OnAssetUnloaded>(this);
AsAsset->Unloaded.Unbind<Variant, &Variant::OnAssetUnloaded>(this);
AsAsset->RemoveReference();
}
break;
@@ -1044,8 +1044,8 @@ Variant& Variant::operator=(Variant&& other)
AsAsset = other.AsAsset;
if (AsAsset)
{
AsAsset->OnUnloaded.Unbind<Variant, &Variant::OnAssetUnloaded>(&other);
AsAsset->OnUnloaded.Bind<Variant, &Variant::OnAssetUnloaded>(this);
AsAsset->Unloaded.Unbind<Variant, &Variant::OnAssetUnloaded>(&other);
AsAsset->Unloaded.Bind<Variant, &Variant::OnAssetUnloaded>(this);
}
break;
case VariantType::Array:
@@ -1117,7 +1117,7 @@ Variant& Variant::operator=(const Variant& other)
if (other.AsAsset)
{
AsAsset->AddReference();
AsAsset->OnUnloaded.Bind<Variant, &Variant::OnAssetUnloaded>(this);
AsAsset->Unloaded.Bind<Variant, &Variant::OnAssetUnloaded>(this);
}
break;
case VariantType::Array:
@@ -2369,7 +2369,7 @@ void Variant::SetType(const VariantType& type)
case VariantType::Asset:
if (AsAsset)
{
AsAsset->OnUnloaded.Unbind<Variant, &Variant::OnAssetUnloaded>(this);
AsAsset->Unloaded.Unbind<Variant, &Variant::OnAssetUnloaded>(this);
AsAsset->RemoveReference();
}
break;
@@ -2483,7 +2483,7 @@ void Variant::SetType(VariantType&& type)
case VariantType::Asset:
if (AsAsset)
{
AsAsset->OnUnloaded.Unbind<Variant, &Variant::OnAssetUnloaded>(this);
AsAsset->Unloaded.Unbind<Variant, &Variant::OnAssetUnloaded>(this);
AsAsset->RemoveReference();
}
break;
@@ -2716,14 +2716,14 @@ void Variant::SetAsset(Asset* asset)
SetType(VariantType(VariantType::Asset));
if (AsAsset)
{
AsAsset->OnUnloaded.Unbind<Variant, &Variant::OnAssetUnloaded>(this);
AsAsset->Unloaded.Unbind<Variant, &Variant::OnAssetUnloaded>(this);
AsAsset->RemoveReference();
}
AsAsset = asset;
if (asset)
{
asset->AddReference();
asset->OnUnloaded.Bind<Variant, &Variant::OnAssetUnloaded>(this);
asset->Unloaded.Bind<Variant, &Variant::OnAssetUnloaded>(this);
}
}
+1 -1
View File
@@ -680,7 +680,7 @@ void DebugDrawService::Update()
LOG(Fatal, "Cannot load DebugDraw shader");
}
#if COMPILE_WITH_DEV_ENV
DebugDrawShader->OnReloading.Bind(&OnShaderReloading);
DebugDrawShader->Reloading.Bind(&OnShaderReloading);
#endif
}
if (DebugDrawPsWireTrianglesDepthTest.Depth == nullptr && DebugDrawShader && DebugDrawShader->IsLoaded())
@@ -27,7 +27,7 @@ ExponentialHeightFog::ExponentialHeightFog(const SpawnParams& params)
LOG(Fatal, "Cannot load fog shader.");
}
#if COMPILE_WITH_DEV_ENV
_shader.Get()->OnReloading.Bind<ExponentialHeightFog, &ExponentialHeightFog::OnShaderReloading>(this);
_shader.Get()->Reloading.Bind<ExponentialHeightFog, &ExponentialHeightFog::OnShaderReloading>(this);
#endif
}
+1 -1
View File
@@ -43,7 +43,7 @@ Sky::Sky(const SpawnParams& params)
return;
}
#if COMPILE_WITH_DEV_ENV
_shader.Get()->OnReloading.Bind<Sky, &Sky::OnShaderReloading>(this);
_shader.Get()->Reloading.Bind<Sky, &Sky::OnShaderReloading>(this);
#endif
}
+1 -1
View File
@@ -700,7 +700,7 @@ void DrawEmittersGPU(GPUContext* context, RenderContextBatch& renderContextBatch
GPUParticlesSorting = Content::LoadAsyncInternal<Shader>(TEXT("Shaders/GPUParticlesSorting"));
#if COMPILE_WITH_DEV_ENV
if (GPUParticlesSorting)
GPUParticlesSorting.Get()->OnReloading.Bind<OnShaderReloading>();
GPUParticlesSorting.Get()->Reloading.Bind<OnShaderReloading>();
#endif
}
if (GPUParticlesSorting == nullptr || !GPUParticlesSorting->IsLoaded())
@@ -144,7 +144,7 @@ void BoxCollider::OnDebugDrawSelf()
void BoxCollider::OnDebugDrawSelected()
{
OnDebugDrawSelf();
DEBUG_DRAW_BOX(_bounds, Color::GreenYellow.AlphaMultiplied(0.1f), 0, true);
if (_contactOffset > 0)
{
OrientedBoundingBox contactBounds = _bounds;
@@ -72,7 +72,7 @@ void CapsuleCollider::OnDebugDrawSelected()
const float height = Math::Max(Math::Abs(_height) * _cachedScale, minSize);
const Vector3 position = _transform.LocalToWorld(_center);
DEBUG_DRAW_WIRE_CAPSULE(position, rotation, radius, height, Color::GreenYellow, 0, false);
DEBUG_DRAW_CAPSULE(position, rotation, radius, height, Color::GreenYellow.AlphaMultiplied(0.1f), 0, true);
if (_contactOffset > 0)
{
DEBUG_DRAW_WIRE_CAPSULE(position, rotation, radius + _contactOffset, height, Color::Blue.AlphaMultiplied(0.2f), 0, false);
@@ -97,6 +97,13 @@ void MeshCollider::OnDebugDrawSelf()
void MeshCollider::OnDebugDrawSelected()
{
OnDebugDrawSelf();
if (CollisionData && CollisionData->IsLoaded())
{
Array<Float3>* vertexBuffer;
Array<int32>* indexBuffer;
CollisionData->GetDebugTriangles(vertexBuffer, indexBuffer);
DEBUG_DRAW_TRIANGLES_EX2(*vertexBuffer, *indexBuffer, _transform.GetWorld(), Color::GreenYellow.AlphaMultiplied(0.1f), 0, true);
}
// Base
Collider::OnDebugDrawSelected();
@@ -43,7 +43,7 @@ void SphereCollider::OnDebugDrawSelf()
void SphereCollider::OnDebugDrawSelected()
{
OnDebugDrawSelf();
DEBUG_DRAW_SPHERE(_sphere, Color::GreenYellow.AlphaMultiplied(0.1f), 0, true);
if (_contactOffset > 0)
{
BoundingSphere contactBounds = _sphere;
+1 -1
View File
@@ -628,7 +628,7 @@ bool Render2DService::Init()
if (GUIShader == nullptr)
return true;
#if COMPILE_WITH_DEV_ENV
GUIShader.Get()->OnReloading.Bind<OnGUIShaderReloading>();
GUIShader.Get()->Reloading.Bind<OnGUIShaderReloading>();
#endif
VB.SetLayout(GPUVertexLayout::Get({
@@ -105,9 +105,7 @@ bool AmbientOcclusionPass::Init()
_shader = Content::LoadAsyncInternal<Shader>(TEXT("Shaders/SSAO"));
if (_shader == nullptr)
return true;
#if COMPILE_WITH_DEV_ENV
_shader.Get()->OnReloading.Bind<AmbientOcclusionPass, &AmbientOcclusionPass::OnShaderReloading>(this);
#endif
BIND_SHADER_RELOADING(_shader, AmbientOcclusionPass, OnShaderReloading);
return false;
}
+1 -4
View File
@@ -23,10 +23,7 @@ bool FXAA::Init()
_shader = Content::LoadAsyncInternal<Shader>(TEXT("Shaders/FXAA"));
if (_shader == nullptr)
return true;
#if COMPILE_WITH_DEV_ENV
_shader.Get()->OnReloading.Bind<FXAA, &FXAA::OnShaderReloading>(this);
#endif
BIND_SHADER_RELOADING(_shader, FXAA, OnShaderReloading);
return false;
}
+1 -3
View File
@@ -36,9 +36,7 @@ bool SMAA::setupResources()
_shader = Content::LoadAsyncInternal<Shader>(TEXT("Shaders/SMAA"));
if (_shader == nullptr)
return true;
#if COMPILE_WITH_DEV_ENV
_shader.Get()->OnReloading.Bind<SMAA, &SMAA::OnShaderReloading>(this);
#endif
BIND_SHADER_RELOADING(_shader, SMAA, OnShaderReloading);
}
if (!_shader->IsLoaded())
{
+1 -3
View File
@@ -29,9 +29,7 @@ bool TAA::Init()
_shader = Content::LoadAsyncInternal<Shader>(TEXT("Shaders/TAA"));
if (_shader == nullptr)
return true;
#if COMPILE_WITH_DEV_ENV
_shader.Get()->OnReloading.Bind<TAA, &TAA::OnShaderReloading>(this);
#endif
BIND_SHADER_RELOADING(_shader, TAA, OnShaderReloading);
return false;
}
+1 -3
View File
@@ -117,9 +117,7 @@ bool ColorGradingPass::Init()
_shader = Content::LoadAsyncInternal<Shader>(TEXT("Shaders/ColorGrading"));
if (_shader == nullptr)
return true;
#if COMPILE_WITH_DEV_ENV
_shader.Get()->OnReloading.Bind<ColorGradingPass, &ColorGradingPass::OnShaderReloading>(this);
#endif
BIND_SHADER_RELOADING(_shader, ColorGradingPass, OnShaderReloading);
PostProcessSettings defaultSettings;
GPUTexture* defaultLut;
DefaultData.Init(defaultSettings, defaultLut);
@@ -41,9 +41,7 @@ bool ContrastAdaptiveSharpeningPass::setupResources()
_shader = Content::LoadAsyncInternal<Shader>(TEXT("Shaders/CAS"));
if (!_shader)
return true;
#if COMPILE_WITH_DEV_ENV
_shader.Get()->OnReloading.Bind<ContrastAdaptiveSharpeningPass, &ContrastAdaptiveSharpeningPass::OnShaderReloading>(this);
#endif
BIND_SHADER_RELOADING(_shader, ContrastAdaptiveSharpeningPass, OnShaderReloading);
}
if (!_shader || !_shader->IsLoaded())
return true;
+1 -3
View File
@@ -79,9 +79,7 @@ bool DepthOfFieldPass::Init()
_shader = Content::LoadAsyncInternal<Shader>(TEXT("Shaders/DepthOfField"));
if (_shader == nullptr)
return true;
#if COMPILE_WITH_DEV_ENV
_shader.Get()->OnReloading.Bind<DepthOfFieldPass, &DepthOfFieldPass::OnShaderReloading>(this);
#endif
BIND_SHADER_RELOADING(_shader, DepthOfFieldPass, OnShaderReloading);
}
return false;
@@ -35,9 +35,7 @@ LightmapUVsDensityMaterialShader::LightmapUVsDensityMaterialShader()
_shader = Content::LoadAsyncInternal<Shader>(TEXT("Shaders/Editor/LightmapUVsDensity"));
if (!_shader)
return;
#if COMPILE_WITH_DEV_ENV
_shader.Get()->OnReloading.Bind<LightmapUVsDensityMaterialShader, &LightmapUVsDensityMaterialShader::OnShaderReloading>(this);
#endif
BIND_SHADER_RELOADING(_shader, LightmapUVsDensityMaterialShader, OnShaderReloading);
_gridTexture = Content::LoadAsyncInternal<Texture>(TEXT("Engine/Textures/Tiles_M"));
}
@@ -138,9 +138,7 @@ bool QuadOverdrawPass::setupResources()
_shader = Content::LoadAsyncInternal<Shader>(TEXT("Shaders/Editor/QuadOverdraw"));
if (!_shader)
return true;
#if COMPILE_WITH_DEV_ENV
_shader.Get()->OnReloading.Bind<QuadOverdrawPass, &QuadOverdrawPass::OnShaderReloading>(this);
#endif
BIND_SHADER_RELOADING(_shader, QuadOverdrawPass, OnShaderReloading);
}
if (!_shader->IsLoaded())
return true;
@@ -12,6 +12,7 @@
#include "Engine/Graphics/Shaders/GPUConstantBuffer.h"
#include "Engine/Graphics/RenderTask.h"
#include "Engine/Renderer/DrawCall.h"
#include "Engine/Renderer/RendererPass.h"
GPU_CB_STRUCT(VertexColorsMaterialShaderData {
Matrix ViewProjectionMatrix;
@@ -24,9 +25,7 @@ VertexColorsMaterialShader::VertexColorsMaterialShader()
_shader = Content::LoadAsyncInternal<Shader>(TEXT("Shaders/Editor/VertexColors"));
if (!_shader)
return;
#if COMPILE_WITH_DEV_ENV
_shader.Get()->OnReloading.Bind<VertexColorsMaterialShader, &VertexColorsMaterialShader::OnShaderReloading>(this);
#endif
BIND_SHADER_RELOADING(_shader, VertexColorsMaterialShader, OnShaderReloading);
}
#if COMPILE_WITH_DEV_ENV
+1 -3
View File
@@ -232,9 +232,7 @@ bool EyeAdaptationPass::Init()
_shader = Content::LoadAsyncInternal<Shader>(TEXT("Shaders/EyeAdaptation"));
if (_shader == nullptr)
return true;
#if COMPILE_WITH_DEV_ENV
_shader.Get()->OnReloading.Bind<EyeAdaptationPass, &EyeAdaptationPass::OnShaderReloading>(this);
#endif
BIND_SHADER_RELOADING(_shader, EyeAdaptationPass, OnShaderReloading);
return false;
}
+1 -8
View File
@@ -29,23 +29,16 @@ bool ForwardPass::Init()
_psApplyDistortion = GPUDevice::Instance->CreatePipelineState();
_shader = Content::LoadAsyncInternal<Shader>(TEXT("Shaders/Forward"));
if (_shader == nullptr)
{
return true;
}
#if COMPILE_WITH_DEV_ENV
_shader.Get()->OnReloading.Bind<ForwardPass, &ForwardPass::OnShaderReloading>(this);
#endif
BIND_SHADER_RELOADING(_shader, ForwardPass, OnShaderReloading);
return false;
}
bool ForwardPass::setupResources()
{
// Check shader
if (!_shader->IsLoaded())
{
return true;
}
const auto shader = _shader->GPU;
// Create pipeline stages
+10 -18
View File
@@ -48,28 +48,24 @@ bool GBufferPass::Init()
_psLinearToSrgb = GPUDevice::Instance->CreatePipelineState();
// Load assets
_gBufferShader = Content::LoadAsyncInternal<Shader>(TEXT("Shaders/GBuffer"));
_shader = Content::LoadAsyncInternal<Shader>(TEXT("Shaders/GBuffer"));
_skyModel = Content::LoadAsyncInternal<Model>(TEXT("Engine/Models/Sphere"));
_boxModel = Content::LoadAsyncInternal<Model>(TEXT("Engine/Models/SimpleBox"));
if (_gBufferShader == nullptr || _skyModel == nullptr || _boxModel == nullptr)
{
if (_shader == nullptr || _skyModel == nullptr || _boxModel == nullptr)
return true;
}
#if COMPILE_WITH_DEV_ENV
_gBufferShader.Get()->OnReloading.Bind<GBufferPass, &GBufferPass::OnShaderReloading>(this);
#endif
BIND_SHADER_RELOADING(_shader, GBufferPass, OnShaderReloading);
return false;
}
bool GBufferPass::setupResources()
{
if (!_gBufferShader || !_gBufferShader->IsLoaded())
if (!_shader || !_shader->IsLoaded())
return true;
auto gbuffer = _gBufferShader->GPU;
auto shader = _shader->GPU;
// Validate shader constant buffers sizes
if (gbuffer->GetCB(0)->GetSize() != sizeof(GBufferPassData))
if (shader->GetCB(0)->GetSize() != sizeof(GBufferPassData))
{
LOG(Warning, "GBuffer shader has incorrct constant buffers sizes.");
return true;
@@ -79,13 +75,13 @@ bool GBufferPass::setupResources()
GPUPipelineState::Description psDesc = GPUPipelineState::Description::DefaultFullscreenTriangle;
if (!_psDebug->IsValid())
{
psDesc.PS = gbuffer->GetPS("PS_DebugView");
psDesc.PS = shader->GetPS("PS_DebugView");
if (_psDebug->Init(psDesc))
return true;
}
if (!_psLinearToSrgb->IsValid())
{
psDesc.PS = gbuffer->GetPS("PS_LinearToSrgb");
psDesc.PS = shader->GetPS("PS_LinearToSrgb");
if (_psLinearToSrgb->Init(psDesc))
return true;
}
@@ -101,7 +97,7 @@ void GBufferPass::Dispose()
// Cleanup
SAFE_DELETE_GPU_RESOURCE(_psDebug);
SAFE_DELETE_GPU_RESOURCE(_psLinearToSrgb);
_gBufferShader = nullptr;
_shader = nullptr;
_skyModel = nullptr;
_boxModel = nullptr;
#if GPU_ENABLE_DEVELOPMENT
@@ -257,14 +253,10 @@ bool SortDecal(RenderDecalData const& a, RenderDecalData const& b)
void GBufferPass::RenderDebug(RenderContext& renderContext)
{
// Check if has resources loaded
if (checkIfSkipPass())
return;
// Cache data
auto device = GPUDevice::Instance;
auto context = device->GetMainContext();
auto lights = _gBufferShader->GPU;
GBufferPassData data;
// Set constants buffer
@@ -278,7 +270,7 @@ void GBufferPass::RenderDebug(RenderContext& renderContext)
break;
}
data.ViewMode = static_cast<int32>(renderContext.View.Mode);
auto cb = lights->GetCB(0);
auto cb = _shader->GPU->GetCB(0);
context->UpdateCB(cb, &data);
context->BindCB(0, cb);
+1 -2
View File
@@ -13,8 +13,7 @@
class GBufferPass : public RendererPass<GBufferPass>
{
private:
AssetReference<Shader> _gBufferShader;
AssetReference<Shader> _shader;
GPUPipelineState* _psDebug = nullptr;
GPUPipelineState* _psLinearToSrgb = nullptr;
AssetReference<Model> _skyModel;
@@ -293,9 +293,7 @@ bool DynamicDiffuseGlobalIlluminationPass::setupResources()
_shader = Content::LoadAsyncInternal<Shader>(TEXT("Shaders/GI/DDGI"));
if (_shader == nullptr)
return true;
#if COMPILE_WITH_DEV_ENV
_shader.Get()->OnReloading.Bind<DynamicDiffuseGlobalIlluminationPass, &DynamicDiffuseGlobalIlluminationPass::OnShaderReloading>(this);
#endif
BIND_SHADER_RELOADING(_shader, DynamicDiffuseGlobalIlluminationPass, OnShaderReloading);
}
if (!_shader->IsLoaded())
return true;
@@ -789,9 +789,7 @@ bool GlobalSurfaceAtlasPass::setupResources()
_shader = Content::LoadAsyncInternal<Shader>(TEXT("Shaders/GI/GlobalSurfaceAtlas"));
if (_shader == nullptr)
return true;
#if COMPILE_WITH_DEV_ENV
_shader.Get()->OnReloading.Bind<GlobalSurfaceAtlasPass, &GlobalSurfaceAtlasPass::OnShaderReloading>(this);
#endif
BIND_SHADER_RELOADING(_shader, GlobalSurfaceAtlasPass, OnShaderReloading);
}
if (!_shader->IsLoaded())
return true;
@@ -702,9 +702,7 @@ bool GlobalSignDistanceFieldPass::setupResources()
_shader = Content::LoadAsyncInternal<Shader>(TEXT("Shaders/GlobalSignDistanceField"));
if (_shader == nullptr)
return true;
#if COMPILE_WITH_DEV_ENV
_shader.Get()->OnReloading.Bind<GlobalSignDistanceFieldPass, &GlobalSignDistanceFieldPass::OnShaderReloading>(this);
#endif
BIND_SHADER_RELOADING(_shader, GlobalSignDistanceFieldPass, OnShaderReloading);
}
if (!_shader->IsLoaded())
return true;
+1 -3
View File
@@ -90,9 +90,7 @@ bool HistogramPass::Init()
_shader = Content::LoadAsyncInternal<Shader>(TEXT("Shaders/Histogram"));
if (_shader == nullptr)
return true;
#if COMPILE_WITH_DEV_ENV
_shader.Get()->OnReloading.Bind<HistogramPass, &HistogramPass::OnShaderReloading>(this);
#endif
BIND_SHADER_RELOADING(_shader, HistogramPass, OnShaderReloading);
return false;
}
+1 -4
View File
@@ -42,10 +42,7 @@ bool LightPass::Init()
_sphereModel = Content::LoadAsyncInternal<Model>(TEXT("Engine/Models/Sphere"));
if (_shader == nullptr || _sphereModel == nullptr)
return true;
#if COMPILE_WITH_DEV_ENV
_shader.Get()->OnReloading.Bind<LightPass, &LightPass::OnShaderReloading>(this);
#endif
BIND_SHADER_RELOADING(_shader, LightPass, OnShaderReloading);
// Pick the format for shadow mask (rendered shadow projection into screen-space)
auto format = PixelFormat::R8G8_UNorm;
+1 -4
View File
@@ -62,9 +62,7 @@ bool MotionBlurPass::Init()
_shader = Content::LoadAsyncInternal<Shader>(TEXT("Shaders/MotionBlur"));
if (_shader == nullptr)
return true;
#if COMPILE_WITH_DEV_ENV
_shader.Get()->OnReloading.Bind<MotionBlurPass, &MotionBlurPass::OnShaderReloading>(this);
#endif
BIND_SHADER_RELOADING(_shader, MotionBlurPass, OnShaderReloading);
// Prepare formats for the buffers
auto format = PixelFormat::R16G16_Float;
@@ -84,7 +82,6 @@ bool MotionBlurPass::Init()
bool MotionBlurPass::setupResources()
{
// Check shader
if (!_shader->IsLoaded())
return true;
const auto shader = _shader->GPU;
@@ -92,16 +92,13 @@ bool PostProcessingPass::Init()
_shader = Content::LoadAsyncInternal<Shader>(TEXT("Shaders/PostProcessing"));
if (_shader == nullptr)
return true;
#if COMPILE_WITH_DEV_ENV
_shader.Get()->OnReloading.Bind<PostProcessingPass, &PostProcessingPass::OnShaderReloading>(this);
#endif
BIND_SHADER_RELOADING(_shader, PostProcessingPass, OnShaderReloading);
return false;
}
bool PostProcessingPass::setupResources()
{
// Wait for shader
if (!_shader->IsLoaded())
return true;
auto shader = _shader->GPU;
+1 -3
View File
@@ -260,9 +260,7 @@ bool ProbesRendererService::LazyInit()
_initFailed = _shader == nullptr;
if (_initFailed)
return false;
#if COMPILE_WITH_DEV_ENV
_shader->OnReloading.Bind<ProbesRendererService, &ProbesRendererService::OnShaderReloading>(this);
#endif
BIND_SHADER_RELOADING(_shader, ProbesRendererService, OnShaderReloading);
}
if (!_shader->IsLoaded())
return true;
+1 -3
View File
@@ -178,9 +178,7 @@ bool ReflectionsPass::Init()
_preIntegratedGF = Content::LoadAsyncInternal<Texture>(PRE_INTEGRATED_GF_ASSET_NAME);
if (_shader == nullptr || _sphereModel == nullptr || _boxModel == nullptr || _preIntegratedGF == nullptr)
return true;
#if COMPILE_WITH_DEV_ENV
_shader.Get()->OnReloading.Bind<ReflectionsPass, &ReflectionsPass::OnShaderReloading>(this);
#endif
BIND_SHADER_RELOADING(_shader, ReflectionsPass, OnShaderReloading);
return false;
}
+6
View File
@@ -104,6 +104,12 @@ class RendererPass : public Singleton<T>, public RendererPassBase
#define REPORT_INVALID_SHADER_PASS_CB_SIZE(shader, index, dataType) LOG(Fatal, "Shader {0} has incorrect constant buffer {1} size: {2} bytes. Expected: {3} bytes", shader->ToString(), index, shader->GetCB(index)->GetSize(), sizeof(dataType));
#define CHECK_INVALID_SHADER_PASS_CB_SIZE(shader, index, dataType) ASSERT(shader && shader->GetCB(index)); if (shader->GetCB(index)->GetSize() != sizeof(dataType) && shader->GetCB(index)->GetSize() != 0) { REPORT_INVALID_SHADER_PASS_CB_SIZE(shader, index, dataType); return true; }
#if COMPILE_WITH_DEV_ENV
#define BIND_SHADER_RELOADING(shader, pass, method) shader->Reloading.Bind<pass, &pass::method>(this)
#else
#define BIND_SHADER_RELOADING(shader, pass, method)
#endif
#if PLATFORM_WEB
// Hack to fix WebGPU limitation that requires to specify different sampler type manually (eg. to sample depth texture without filtering)
void SetWebGPUTextureViewSampler(GPUTextureView* view, uint32 samplerType);
@@ -68,9 +68,7 @@ bool ScreenSpaceReflectionsPass::Init()
_preIntegratedGF = Content::LoadAsyncInternal<Texture>(PRE_INTEGRATED_GF_ASSET_NAME);
if (_shader == nullptr || _preIntegratedGF == nullptr)
return true;
#if COMPILE_WITH_DEV_ENV
_shader.Get()->OnReloading.Bind<ScreenSpaceReflectionsPass, &ScreenSpaceReflectionsPass::OnShaderReloading>(this);
#endif
BIND_SHADER_RELOADING(_shader, ScreenSpaceReflectionsPass, OnShaderReloading);
return false;
}
+1 -4
View File
@@ -614,10 +614,7 @@ bool ShadowsPass::Init()
_sphereModel = Content::LoadAsyncInternal<Model>(TEXT("Engine/Models/Sphere"));
if (_shader == nullptr || _sphereModel == nullptr)
return true;
#if COMPILE_WITH_DEV_ENV
_shader.Get()->OnReloading.Bind<ShadowsPass, &ShadowsPass::OnShaderReloading>(this);
#endif
BIND_SHADER_RELOADING(_shader, ShadowsPass, OnShaderReloading);
// Select format for shadow maps
_shadowMapFormat = PixelFormat::Unknown;
+2 -3
View File
@@ -5,6 +5,7 @@
#include "Engine/Graphics/GPUBuffer.h"
#include "Engine/Graphics/GPUContext.h"
#include "Engine/Graphics/GPULimits.h"
#include "Engine/Renderer/GI/GlobalSurfaceAtlasPass.h"
GPU_CB_STRUCT(Data {
float NullItemKey;
@@ -38,9 +39,7 @@ bool BitonicSort::Init()
_shader = Content::LoadAsyncInternal<Shader>(TEXT("Shaders/BitonicSort"));
if (_shader == nullptr)
return true;
#if COMPILE_WITH_DEV_ENV
_shader.Get()->OnReloading.Bind<BitonicSort, &BitonicSort::OnShaderReloading>(this);
#endif
BIND_SHADER_RELOADING(_shader, BitonicSort, OnShaderReloading);
return false;
}
+1 -3
View File
@@ -29,9 +29,7 @@ bool MultiScaler::Init()
_shader = Content::LoadAsyncInternal<Shader>(TEXT("Shaders/MultiScaler"));
if (_shader == nullptr)
return true;
#if COMPILE_WITH_DEV_ENV
_shader.Get()->OnReloading.Bind<MultiScaler, &MultiScaler::OnShaderReloading>(this);
#endif
BIND_SHADER_RELOADING(_shader, MultiScaler, OnShaderReloading);
return false;
}
+1 -5
View File
@@ -103,12 +103,8 @@ bool VolumetricFogPass::Init()
// Load assets
_shader = Content::LoadAsyncInternal<Shader>(TEXT("Shaders/VolumetricFog"));
if (_shader == nullptr)
{
return true;
}
#if COMPILE_WITH_DEV_ENV
_shader.Get()->OnReloading.Bind<VolumetricFogPass, &VolumetricFogPass::OnShaderReloading>(this);
#endif
BIND_SHADER_RELOADING(_shader, VolumetricFogPass, OnShaderReloading);
return false;
}