@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
Reference in New Issue
Block a user