@@ -609,7 +609,7 @@ bool Mesh::DownloadDataCPU(MeshBufferType type, BytesContainer& result, int32& c
|
||||
ScopeLock lock(model->Locker);
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
@@ -127,6 +127,8 @@ bool CollisionCooking::CookCollision(const Argument& arg, CollisionData::Seriali
|
||||
const auto& mesh = *meshes[i];
|
||||
if ((arg.MaterialSlotsMask & (1 << mesh.GetMaterialSlotIndex())) == 0)
|
||||
continue;
|
||||
if (mesh.GetVertexCount() == 0)
|
||||
continue;
|
||||
|
||||
int32 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];
|
||||
if ((arg.MaterialSlotsMask & (1 << mesh.GetMaterialSlotIndex())) == 0)
|
||||
continue;
|
||||
if (mesh.GetVertexCount() == 0)
|
||||
continue;
|
||||
|
||||
auto task = mesh.DownloadDataGPUAsync(MeshBufferType::Vertex0, vertexBuffers[i]);
|
||||
if (task == nullptr)
|
||||
@@ -208,6 +212,8 @@ bool CollisionCooking::CookCollision(const Argument& arg, CollisionData::Seriali
|
||||
|
||||
const int32 firstVertexIndex = vertexCounter;
|
||||
const int32 vertexCount = vertexCounts[i];
|
||||
if (vertexCount == 0)
|
||||
continue;
|
||||
Platform::MemoryCopy(finalVertexData.Get() + firstVertexIndex, vData.Get(), vertexCount * sizeof(Float3));
|
||||
vertexCounter += vertexCount;
|
||||
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
// Validate state
|
||||
if (!IsVirtual())
|
||||
{
|
||||
LOG(Warning, "Only virtual assets can be modified at runtime.");
|
||||
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
|
||||
CollisionCooking::Argument arg;
|
||||
@@ -43,18 +47,12 @@ bool CollisionData::CookCollision(CollisionDataType type, ModelBase* modelObj, i
|
||||
SerializedOptions options;
|
||||
BytesContainer outputData;
|
||||
if (CollisionCooking::CookCollision(arg, options, outputData))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
// Clear state
|
||||
unload(true);
|
||||
|
||||
// Load data
|
||||
unload(true);
|
||||
if (load(&options, outputData.Get(), outputData.Length()) != LoadResult::Ok)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
// Mark as loaded (eg. Mesh Colliders using this asset will update shape for physics simulation)
|
||||
onLoaded();
|
||||
|
||||
Reference in New Issue
Block a user