diff --git a/Source/Engine/Content/Assets/Model.cpp b/Source/Engine/Content/Assets/Model.cpp index e96592043..8ee204e11 100644 --- a/Source/Engine/Content/Assets/Model.cpp +++ b/Source/Engine/Content/Assets/Model.cpp @@ -15,6 +15,7 @@ #include "Engine/Debug/Exceptions/ArgumentOutOfRangeException.h" #include "Engine/Graphics/GPUDevice.h" #include "Engine/Graphics/Async/GPUTask.h" +#include "Engine/Graphics/Async/Tasks/GPUUploadTextureMipTask.h" #include "Engine/Graphics/Textures/GPUTexture.h" #include "Engine/Graphics/Textures/TextureData.h" #include "Engine/Profiler/ProfilerCPU.h" @@ -50,11 +51,6 @@ private: FlaxStorage::LockData _dataLock; public: - /// - /// Init - /// - /// Parent model - /// LOD to stream index StreamModelLODTask(Model* model, int32 lodIndex) : _asset(model) , _lodIndex(lodIndex) @@ -63,21 +59,16 @@ public: } public: - // [ThreadPoolTask] bool HasReference(Object* resource) const override { return _asset == resource; } -protected: - // [ThreadPoolTask] bool Run() override { AssetReference model = _asset.Get(); if (model == nullptr) - { return true; - } // Get data BytesContainer data; @@ -120,6 +111,42 @@ protected: } }; +class StreamModelSDFTask : public GPUUploadTextureMipTask +{ +private: + WeakAssetReference _asset; + FlaxStorage::LockData _dataLock; + +public: + StreamModelSDFTask(Model* model, GPUTexture* texture, const Span& data, int32 mipIndex, int32 rowPitch, int32 slicePitch) + : GPUUploadTextureMipTask(texture, mipIndex, data, rowPitch, slicePitch, false) + , _asset(model) + , _dataLock(model->Storage->Lock()) + { + } + + bool HasReference(Object* resource) const override + { + return _asset == resource; + } + + Result run(GPUTasksContext* context) override + { + AssetReference model = _asset.Get(); + if (model == nullptr) + return Result::MissingResources; + return GPUUploadTextureMipTask::run(context); + } + + void OnEnd() override + { + _dataLock.Release(); + + // Base + GPUUploadTextureMipTask::OnEnd(); + } +}; + REGISTER_BINARY_ASSET_WITH_UPGRADER(Model, "FlaxEngine.Model", ModelAssetUpgrader, true); static byte EnableModelSDF = 0; @@ -933,11 +960,8 @@ Asset::LoadResult Model::load() ModelSDFMip mipData; sdfStream.Read(&mipData); void* mipBytes = sdfStream.Read(mipData.SlicePitch); - BytesContainer mipBytesData; - mipBytesData.Link((byte*)mipBytes, mipData.SlicePitch); - auto task = SDF.Texture->UploadMipMapAsync(mipBytesData, mipData.MipIndex, mipData.RowPitch, mipData.SlicePitch, false); - if (task) - task->Start(); + auto task = ::New(this, SDF.Texture, Span((byte*)mipBytes, mipData.SlicePitch), mipData.MipIndex, mipData.RowPitch, mipData.SlicePitch); + task->Start(); } break; }