Files
FlaxEngine/Source/Engine/Navigation/NavMeshData.cpp
2021-01-02 14:28:49 +01:00

96 lines
2.5 KiB
C++

// Copyright (c) 2012-2021 Wojciech Figat. All rights reserved.
#include "NavMeshData.h"
#include "Engine/Core/Log.h"
#include "Engine/Serialization/MemoryReadStream.h"
void NavMeshData::Save(WriteStream& stream)
{
// Write header
NavMeshDataHeader header;
header.Version = 1;
header.TileSize = TileSize;
header.TilesCount = Tiles.Count();
stream.Write(&header);
// Write tiles
for (int32 tileIndex = 0; tileIndex < Tiles.Count(); tileIndex++)
{
auto& tile = Tiles[tileIndex];
// Write tile header
NavMeshTileDataHeader tileHeader;
tileHeader.PosX = tile.PosX;
tileHeader.PosY = tile.PosY;
tileHeader.Layer = tile.Layer;
tileHeader.DataSize = tile.Data.Length();
stream.Write(&tileHeader);
// Write tile data
if (tileHeader.DataSize)
{
stream.WriteBytes(tile.Data.Get(), tileHeader.DataSize);
}
else
{
LOG(Warning, "Empty navmesh tile data.");
}
}
}
bool NavMeshData::Load(BytesContainer& data, bool copyData)
{
// No data
if (data.Length() < sizeof(NavMeshDataHeader))
{
LOG(Warning, "No valid navmesh data.");
return true;
}
MemoryReadStream stream(data.Get(), data.Length());
// Read header
const auto header = stream.Read<NavMeshDataHeader>(1);
if (header->Version != 1)
{
LOG(Warning, "Invalid valid navmesh data version {0}.", header->Version);
return true;
}
if (header->TilesCount < 0 || header->TileSize < 1)
{
LOG(Warning, "Invalid navmesh data.");
return true;
}
TileSize = header->TileSize;
Tiles.Resize(header->TilesCount);
// Read tiles
for (int32 tileIndex = 0; tileIndex < Tiles.Count(); tileIndex++)
{
auto& tile = Tiles[tileIndex];
// Read tile header
const auto tileHeader = stream.Read<NavMeshTileDataHeader>(1);
if (tileHeader->DataSize <= 0)
{
LOG(Warning, "Invalid navmesh tile data.");
return true;
}
tile.PosX = tileHeader->PosX;
tile.PosY = tileHeader->PosY;
tile.Layer = tileHeader->Layer;
// Read tile data
const auto tileData = stream.Read<byte>(tileHeader->DataSize);
if (copyData)
{
tile.Data.Copy(tileData, tileHeader->DataSize);
}
else
{
tile.Data.Link(tileData, tileHeader->DataSize);
}
}
return false;
}