aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/tools/mmaps_generator/MapBuilder.cpp41
-rw-r--r--src/tools/mmaps_generator/MapBuilder.h4
-rw-r--r--src/tools/mmaps_generator/TerrainBuilder.cpp55
-rw-r--r--src/tools/mmaps_generator/TerrainBuilder.h15
4 files changed, 71 insertions, 44 deletions
diff --git a/src/tools/mmaps_generator/MapBuilder.cpp b/src/tools/mmaps_generator/MapBuilder.cpp
index f3caafbc917..778377e2af1 100644
--- a/src/tools/mmaps_generator/MapBuilder.cpp
+++ b/src/tools/mmaps_generator/MapBuilder.cpp
@@ -19,6 +19,7 @@
#include "Containers.h"
#include "IntermediateValues.h"
#include "MapTree.h"
+#include "Memory.h"
#include "MMapDefines.h"
#include "ModelInstance.h"
#include "PathCommon.h"
@@ -60,7 +61,6 @@ namespace MMAP
bool debugOutput, bool bigBaseUnit, int mapid, char const* offMeshFilePath, unsigned int threads) :
m_terrainBuilder (nullptr),
m_debugOutput (debugOutput),
- m_offMeshFilePath (offMeshFilePath),
m_threads (threads),
m_skipContinents (skipContinents),
m_skipJunkMaps (skipJunkMaps),
@@ -83,6 +83,8 @@ namespace MMAP
m_threads = std::max(1u, m_threads);
discoverTiles();
+
+ ParseOffMeshConnectionsFile(offMeshFilePath);
}
/**************************************************************************/
@@ -194,6 +196,41 @@ namespace MMAP
}
/**************************************************************************/
+ void MapBuilder::ParseOffMeshConnectionsFile(char const* offMeshFilePath)
+ {
+ // no meshfile input given?
+ if (offMeshFilePath == nullptr)
+ return;
+
+ auto fp = Trinity::make_unique_ptr_with_deleter(fopen(offMeshFilePath, "rb"), &::fclose);
+ if (!fp)
+ {
+ printf(" loadOffMeshConnections:: input file %s not found!\n", offMeshFilePath);
+ return;
+ }
+
+ char buf[512] = { };
+ while (fgets(buf, 512, fp.get()))
+ {
+ OffMeshData offMesh;
+ int32 scanned = sscanf(buf, "%u %u,%u (%f %f %f) (%f %f %f) %f %hhu %hu", &offMesh.MapId, &offMesh.TileX, &offMesh.TileY,
+ &offMesh.From[0], &offMesh.From[1], &offMesh.From[2], &offMesh.To[0], &offMesh.To[1], &offMesh.To[2],
+ &offMesh.Radius, &offMesh.AreaId, &offMesh.Flags);
+ if (scanned < 10)
+ continue;
+
+ offMesh.Bidirectional = true;
+ if (scanned < 12)
+ offMesh.Flags = NAV_GROUND;
+
+ if (scanned < 11)
+ offMesh.AreaId = NAV_AREA_GROUND;
+
+ m_offMeshConnections.push_back(offMesh);
+ }
+ }
+
+ /**************************************************************************/
std::set<uint32>* MapBuilder::getTileList(uint32 mapID)
{
TileList::iterator itr = std::find(m_tiles.begin(), m_tiles.end(), mapID);
@@ -504,7 +541,7 @@ namespace MMAP
float bmin[3], bmax[3];
m_mapBuilder->getTileBounds(tileX, tileY, allVerts.getCArray(), allVerts.size() / 3, bmin, bmax);
- m_terrainBuilder->loadOffMeshConnections(mapID, tileX, tileY, meshData, m_mapBuilder->m_offMeshFilePath);
+ m_terrainBuilder->loadOffMeshConnections(mapID, tileX, tileY, meshData, m_mapBuilder->m_offMeshConnections);
// build navmesh tile
buildMoveMapTile(mapID, tileX, tileY, meshData, bmin, bmax, navMesh);
diff --git a/src/tools/mmaps_generator/MapBuilder.h b/src/tools/mmaps_generator/MapBuilder.h
index 9e0927a32ae..ecad8221adc 100644
--- a/src/tools/mmaps_generator/MapBuilder.h
+++ b/src/tools/mmaps_generator/MapBuilder.h
@@ -193,12 +193,14 @@ namespace MMAP
uint32 percentageDone(uint32 totalTiles, uint32 totalTilesDone) const;
uint32 currentPercentageDone() const;
+ void ParseOffMeshConnectionsFile(char const* offMeshFilePath);
+
TerrainBuilder* m_terrainBuilder;
TileList m_tiles;
bool m_debugOutput;
- char const* m_offMeshFilePath;
+ std::vector<OffMeshData> m_offMeshConnections;
unsigned int m_threads;
bool m_skipContinents;
bool m_skipJunkMaps;
diff --git a/src/tools/mmaps_generator/TerrainBuilder.cpp b/src/tools/mmaps_generator/TerrainBuilder.cpp
index 8ea79f59c71..fd2a6d862fa 100644
--- a/src/tools/mmaps_generator/TerrainBuilder.cpp
+++ b/src/tools/mmaps_generator/TerrainBuilder.cpp
@@ -834,51 +834,26 @@ namespace MMAP
}
/**************************************************************************/
- void TerrainBuilder::loadOffMeshConnections(uint32 mapID, uint32 tileX, uint32 tileY, MeshData &meshData, char const* offMeshFilePath)
+ void TerrainBuilder::loadOffMeshConnections(uint32 mapID, uint32 tileX, uint32 tileY, MeshData &meshData, std::vector<OffMeshData> const& offMeshConnections)
{
- // no meshfile input given?
- if (offMeshFilePath == nullptr)
- return;
-
- FILE* fp = fopen(offMeshFilePath, "rb");
- if (!fp)
- {
- printf(" loadOffMeshConnections:: input file %s not found!\n", offMeshFilePath);
- return;
- }
-
- // pretty silly thing, as we parse entire file and load only the tile we need
- // but we don't expect this file to be too large
- char* buf = new char[512];
- while(fgets(buf, 512, fp))
+ for (OffMeshData const& offMeshConnection : offMeshConnections)
{
- float p0[3], p1[3];
- uint32 mid, tx, ty;
- float size;
- if (sscanf(buf, "%u %u,%u (%f %f %f) (%f %f %f) %f", &mid, &tx, &ty,
- &p0[0], &p0[1], &p0[2], &p1[0], &p1[1], &p1[2], &size) != 10)
+ if (mapID != offMeshConnection.MapId || tileX != offMeshConnection.TileX || tileY != offMeshConnection.TileY)
continue;
- if (mapID == mid && tileX == tx && tileY == ty)
- {
- meshData.offMeshConnections.append(p0[1]);
- meshData.offMeshConnections.append(p0[2]);
- meshData.offMeshConnections.append(p0[0]);
-
- meshData.offMeshConnections.append(p1[1]);
- meshData.offMeshConnections.append(p1[2]);
- meshData.offMeshConnections.append(p1[0]);
-
- meshData.offMeshConnectionDirs.append(1); // 1 - both direction, 0 - one sided
- meshData.offMeshConnectionRads.append(size); // agent size equivalent
- // can be used same way as polygon flags
- meshData.offMeshConnectionsAreas.append((unsigned char)0xFF);
- meshData.offMeshConnectionsFlags.append((unsigned short)0xFF); // all movement masks can make this path
- }
+ meshData.offMeshConnections.append(offMeshConnection.From[1]);
+ meshData.offMeshConnections.append(offMeshConnection.From[2]);
+ meshData.offMeshConnections.append(offMeshConnection.From[0]);
- }
+ meshData.offMeshConnections.append(offMeshConnection.To[1]);
+ meshData.offMeshConnections.append(offMeshConnection.To[2]);
+ meshData.offMeshConnections.append(offMeshConnection.To[0]);
- delete [] buf;
- fclose(fp);
+ meshData.offMeshConnectionDirs.append(offMeshConnection.Bidirectional ? 1 : 0);
+ meshData.offMeshConnectionRads.append(offMeshConnection.Radius); // agent size equivalent
+ // can be used same way as polygon flags
+ meshData.offMeshConnectionsAreas.append(offMeshConnection.AreaId);
+ meshData.offMeshConnectionsFlags.append(offMeshConnection.Flags);
+ }
}
}
diff --git a/src/tools/mmaps_generator/TerrainBuilder.h b/src/tools/mmaps_generator/TerrainBuilder.h
index 83e32dfef41..ea3daf05829 100644
--- a/src/tools/mmaps_generator/TerrainBuilder.h
+++ b/src/tools/mmaps_generator/TerrainBuilder.h
@@ -58,6 +58,19 @@ namespace MMAP
// contrib/extractor/system.cpp
// src/game/Map.cpp
+ struct OffMeshData
+ {
+ uint32 MapId;
+ uint32 TileX;
+ uint32 TileY;
+ float From[3];
+ float To[3];
+ bool Bidirectional;
+ float Radius;
+ uint8 AreaId;
+ uint16 Flags;
+ };
+
struct MeshData
{
G3D::Array<float> solidVerts;
@@ -83,7 +96,7 @@ namespace MMAP
void loadMap(uint32 mapID, uint32 tileX, uint32 tileY, MeshData &meshData);
bool loadVMap(uint32 mapID, uint32 tileX, uint32 tileY, MeshData &meshData);
- void loadOffMeshConnections(uint32 mapID, uint32 tileX, uint32 tileY, MeshData& meshData, char const* offMeshFilePath);
+ void loadOffMeshConnections(uint32 mapID, uint32 tileX, uint32 tileY, MeshData& meshData, std::vector<OffMeshData> const& offMeshConnections);
bool usesLiquids() const { return !m_skipLiquid; }