Add Loaded event to Asset in scripting
Refactor `Asset` events naming to match engine scheme
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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())
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user