diff --git a/Source/Engine/Terrain/TerrainPatch.cpp b/Source/Engine/Terrain/TerrainPatch.cpp index 651d0305e..e8075314c 100644 --- a/Source/Engine/Terrain/TerrainPatch.cpp +++ b/Source/Engine/Terrain/TerrainPatch.cpp @@ -38,8 +38,18 @@ #define TERRAIN_PATCH_COLLISION_QUANTIZATION ((float)0x7fff) +// [Deprecated on 4.03.2024, expires on 4.03.2034] +struct TerrainCollisionDataHeaderOld +{ + int32 LOD; + float ScaleXZ; +}; + struct TerrainCollisionDataHeader { + static constexpr int32 CurrentVersion = 1; + int32 CheckOldMagicNumber; // Used to detect if loading new header or old one + int32 Version; int32 LOD; float ScaleXZ; }; @@ -685,13 +695,13 @@ bool CookCollision(TerrainDataUpdateInfo& info, TextureBase::InitData* initData, // Cook height field MemoryWriteStream outputStream; if (CollisionCooking::CookHeightField(heightFieldSize, heightFieldSize, heightFieldData, outputStream)) - { return true; - } // Write results collisionData->Resize(sizeof(TerrainCollisionDataHeader) + outputStream.GetPosition(), false); const auto header = (TerrainCollisionDataHeader*)collisionData->Get(); + header->CheckOldMagicNumber = MAX_int32; + header->Version = TerrainCollisionDataHeader::CurrentVersion; header->LOD = collisionLOD; header->ScaleXZ = (float)info.HeightmapSize / heightFieldSize; Platform::MemoryCopy(collisionData->Get() + sizeof(TerrainCollisionDataHeader), outputStream.GetHandle(), outputStream.GetPosition()); @@ -2133,7 +2143,15 @@ bool TerrainPatch::CreateHeightField() return true; } - const auto collisionHeader = (TerrainCollisionDataHeader*)_heightfield->Data.Get(); + // Check if the cooked collision matches the engine version + auto collisionHeader = (TerrainCollisionDataHeader*)_heightfield->Data.Get(); + if (collisionHeader->CheckOldMagicNumber != MAX_int32 || collisionHeader->CurrentVersion != TerrainCollisionDataHeader::CurrentVersion) + { + // Reset height map + return InitializeHeightMap(); + } + + // Create heightfield object from the data _collisionScaleXZ = collisionHeader->ScaleXZ * TERRAIN_UNITS_PER_VERTEX; _physicsHeightField = PhysicsBackend::CreateHeightField(_heightfield->Data.Get() + sizeof(TerrainCollisionDataHeader), _heightfield->Data.Count() - sizeof(TerrainCollisionDataHeader)); if (_physicsHeightField == nullptr)