Improve collision data cooking usability

#1687
This commit is contained in:
Wojtek Figat
2023-10-13 23:33:03 +02:00
parent 887d2b2115
commit 1a5606a45c
3 changed files with 13 additions and 9 deletions

View File

@@ -609,7 +609,7 @@ bool Mesh::DownloadDataCPU(MeshBufferType type, BytesContainer& result, int32& c
ScopeLock lock(model->Locker); ScopeLock lock(model->Locker);
if (model->IsVirtual()) if (model->IsVirtual())
{ {
LOG(Error, "Cannot access CPU data of virtual models. Use GPU data download"); LOG(Error, "Cannot access CPU data of virtual models. Use GPU data download.");
return true; return true;
} }

View File

@@ -127,6 +127,8 @@ bool CollisionCooking::CookCollision(const Argument& arg, CollisionData::Seriali
const auto& mesh = *meshes[i]; const auto& mesh = *meshes[i];
if ((arg.MaterialSlotsMask & (1 << mesh.GetMaterialSlotIndex())) == 0) if ((arg.MaterialSlotsMask & (1 << mesh.GetMaterialSlotIndex())) == 0)
continue; continue;
if (mesh.GetVertexCount() == 0)
continue;
int32 count; int32 count;
if (mesh.DownloadDataCPU(MeshBufferType::Vertex0, vertexBuffers[i], count)) if (mesh.DownloadDataCPU(MeshBufferType::Vertex0, vertexBuffers[i], count))
@@ -159,6 +161,8 @@ bool CollisionCooking::CookCollision(const Argument& arg, CollisionData::Seriali
const auto& mesh = *meshes[i]; const auto& mesh = *meshes[i];
if ((arg.MaterialSlotsMask & (1 << mesh.GetMaterialSlotIndex())) == 0) if ((arg.MaterialSlotsMask & (1 << mesh.GetMaterialSlotIndex())) == 0)
continue; continue;
if (mesh.GetVertexCount() == 0)
continue;
auto task = mesh.DownloadDataGPUAsync(MeshBufferType::Vertex0, vertexBuffers[i]); auto task = mesh.DownloadDataGPUAsync(MeshBufferType::Vertex0, vertexBuffers[i]);
if (task == nullptr) if (task == nullptr)
@@ -208,6 +212,8 @@ bool CollisionCooking::CookCollision(const Argument& arg, CollisionData::Seriali
const int32 firstVertexIndex = vertexCounter; const int32 firstVertexIndex = vertexCounter;
const int32 vertexCount = vertexCounts[i]; const int32 vertexCount = vertexCounts[i];
if (vertexCount == 0)
continue;
Platform::MemoryCopy(finalVertexData.Get() + firstVertexIndex, vData.Get(), vertexCount * sizeof(Float3)); Platform::MemoryCopy(finalVertexData.Get() + firstVertexIndex, vData.Get(), vertexCount * sizeof(Float3));
vertexCounter += vertexCount; vertexCounter += vertexCount;

View File

@@ -23,12 +23,16 @@ CollisionData::CollisionData(const SpawnParams& params, const AssetInfo* info)
bool CollisionData::CookCollision(CollisionDataType type, ModelBase* modelObj, int32 modelLodIndex, uint32 materialSlotsMask, ConvexMeshGenerationFlags convexFlags, int32 convexVertexLimit) bool CollisionData::CookCollision(CollisionDataType type, ModelBase* modelObj, int32 modelLodIndex, uint32 materialSlotsMask, ConvexMeshGenerationFlags convexFlags, int32 convexVertexLimit)
{ {
// Validate state
if (!IsVirtual()) if (!IsVirtual())
{ {
LOG(Warning, "Only virtual assets can be modified at runtime."); LOG(Warning, "Only virtual assets can be modified at runtime.");
return true; return true;
} }
if (IsInMainThread() && modelObj && modelObj->IsVirtual())
{
LOG(Error, "Cannot cook collision data for virtual models on a main thread (virtual models data is stored on GPU only). Use thread pool or async task.");
return true;
}
// Prepare // Prepare
CollisionCooking::Argument arg; CollisionCooking::Argument arg;
@@ -43,18 +47,12 @@ bool CollisionData::CookCollision(CollisionDataType type, ModelBase* modelObj, i
SerializedOptions options; SerializedOptions options;
BytesContainer outputData; BytesContainer outputData;
if (CollisionCooking::CookCollision(arg, options, outputData)) if (CollisionCooking::CookCollision(arg, options, outputData))
{
return true; return true;
}
// Clear state
unload(true);
// Load data // Load data
unload(true);
if (load(&options, outputData.Get(), outputData.Length()) != LoadResult::Ok) if (load(&options, outputData.Get(), outputData.Length()) != LoadResult::Ok)
{
return true; return true;
}
// Mark as loaded (eg. Mesh Colliders using this asset will update shape for physics simulation) // Mark as loaded (eg. Mesh Colliders using this asset will update shape for physics simulation)
onLoaded(); onLoaded();