aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/tools/mmaps_generator/TerrainBuilder.cpp171
-rw-r--r--src/tools/mmaps_generator/TerrainBuilder.h2
2 files changed, 89 insertions, 84 deletions
diff --git a/src/tools/mmaps_generator/TerrainBuilder.cpp b/src/tools/mmaps_generator/TerrainBuilder.cpp
index 9f452634a09..d4170938819 100644
--- a/src/tools/mmaps_generator/TerrainBuilder.cpp
+++ b/src/tools/mmaps_generator/TerrainBuilder.cpp
@@ -592,106 +592,109 @@ namespace MMAP
// now we have a model to add to the meshdata
retval = true;
- std::vector<VMAP::GroupModel> const& groupModels = worldModel->getGroupModels();
-
- // all M2s need to have triangle indices reversed
- bool isM2 = worldModel->IsM2();
-
- // transform data
- float scale = instance.iScale;
- G3D::Matrix3 const& rotation = instance.GetInvRot();
G3D::Vector3 position = instance.iPos;
position.x -= 32 * GRID_SIZE;
position.y -= 32 * GRID_SIZE;
+ loadVMapModel(worldModel, position, instance.GetInvRot(), instance.iScale, meshData, vmapManager);
+ }
+
+ return retval;
+ }
+
+ void TerrainBuilder::loadVMapModel(VMAP::WorldModel const* worldModel, G3D::Vector3 const& position, G3D::Matrix3 const& rotation, float scale,
+ MeshData& meshData, VMAP::VMapManager* vmapManager)
+ {
+ std::vector<VMAP::GroupModel> const& groupModels = worldModel->getGroupModels();
+
+ // all M2s need to have triangle indices reversed
+ bool isM2 = worldModel->IsM2();
- for (std::vector<VMAP::GroupModel>::const_iterator it = groupModels.begin(); it != groupModels.end(); ++it)
+ // transform data
+ for (std::vector<VMAP::GroupModel>::const_iterator it = groupModels.begin(); it != groupModels.end(); ++it)
+ {
+ // first handle collision mesh
+ int offset = meshData.solidVerts.size() / 3;
+ transformVertices(it->GetVertices(), meshData.solidVerts, scale, rotation, position);
+ copyIndices(it->GetTriangles(), meshData.solidTris, offset, isM2);
+
+ // now handle liquid data
+ VMAP::WmoLiquid const* liquid = it->GetLiquid();
+ if (liquid && liquid->GetFlagsStorage())
{
- // first handle collision mesh
- int offset = meshData.solidVerts.size() / 3;
- transformVertices(it->GetVertices(), meshData.solidVerts, scale, rotation, position);
- copyIndices(it->GetTriangles(), meshData.solidTris, offset, isM2);
-
- // now handle liquid data
- VMAP::WmoLiquid const* liquid = it->GetLiquid();
- if (liquid && liquid->GetFlagsStorage())
+ uint32 tilesX, tilesY;
+ G3D::Vector3 corner;
+ liquid->getPosInfo(tilesX, tilesY, corner);
+ uint32 vertsX = tilesX + 1;
+ uint32 vertsY = tilesY + 1;
+ uint8 const* flags = liquid->GetFlagsStorage();
+ float const* data = liquid->GetHeightStorage();
+ uint8 type = NAV_AREA_EMPTY;
+
+ // convert liquid type to NavTerrain
+ EnumFlag<map_liquidHeaderTypeFlags> liquidFlags = map_liquidHeaderTypeFlags(vmapManager->GetLiquidFlagsPtr(liquid->GetType()));
+ if (liquidFlags.HasFlag(map_liquidHeaderTypeFlags::Water | map_liquidHeaderTypeFlags::Ocean))
+ type = NAV_AREA_WATER;
+ else if (liquidFlags.HasFlag(map_liquidHeaderTypeFlags::Magma | map_liquidHeaderTypeFlags::Slime))
+ type = NAV_AREA_MAGMA_SLIME;
+
+ // indexing is weird...
+ // after a lot of trial and error, this is what works:
+ // vertex = y*vertsX+x
+ // tile = x*tilesY+y
+ // flag = y*tilesY+x
+
+ uint32 liqOffset = meshData.liquidVerts.size() / 3;
+ meshData.liquidVerts.resize(meshData.liquidVerts.size() + vertsX * vertsY * 3);
+ float* liquidVerts = meshData.liquidVerts.data();
+ for (uint32 x = 0; x < vertsX; ++x)
{
- uint32 tilesX, tilesY;
- G3D::Vector3 corner;
- liquid->getPosInfo(tilesX, tilesY, corner);
- uint32 vertsX = tilesX + 1;
- uint32 vertsY = tilesY + 1;
- uint8 const* flags = liquid->GetFlagsStorage();
- float const* data = liquid->GetHeightStorage();
- uint8 type = NAV_AREA_EMPTY;
-
- // convert liquid type to NavTerrain
- EnumFlag<map_liquidHeaderTypeFlags> liquidFlags = map_liquidHeaderTypeFlags(vmapManager->GetLiquidFlagsPtr(liquid->GetType()));
- if (liquidFlags.HasFlag(map_liquidHeaderTypeFlags::Water | map_liquidHeaderTypeFlags::Ocean))
- type = NAV_AREA_WATER;
- else if (liquidFlags.HasFlag(map_liquidHeaderTypeFlags::Magma | map_liquidHeaderTypeFlags::Slime))
- type = NAV_AREA_MAGMA_SLIME;
-
- // indexing is weird...
- // after a lot of trial and error, this is what works:
- // vertex = y*vertsX+x
- // tile = x*tilesY+y
- // flag = y*tilesY+x
-
- uint32 liqOffset = meshData.liquidVerts.size() / 3;
- meshData.liquidVerts.resize(meshData.liquidVerts.size() + vertsX * vertsY * 3);
- float* liquidVerts = meshData.liquidVerts.data();
- for (uint32 x = 0; x < vertsX; ++x)
+ for (uint32 y = 0; y < vertsY; ++y)
{
- for (uint32 y = 0; y < vertsY; ++y)
- {
- G3D::Vector3 vert = G3D::Vector3(corner.x + x * GRID_PART_SIZE, corner.y + y * GRID_PART_SIZE, data[y * vertsX + x]);
- vert = vert * rotation * scale + position;
- vert.x *= -1.f;
- vert.y *= -1.f;
- liquidVerts[(liqOffset + x * vertsY + y) * 3 + 0] = vert.y;
- liquidVerts[(liqOffset + x * vertsY + y) * 3 + 1] = vert.z;
- liquidVerts[(liqOffset + x * vertsY + y) * 3 + 2] = vert.x;
- }
+ G3D::Vector3 vert = G3D::Vector3(corner.x + x * GRID_PART_SIZE, corner.y + y * GRID_PART_SIZE, data[y * vertsX + x]);
+ vert = vert * rotation * scale + position;
+ vert.x *= -1.f;
+ vert.y *= -1.f;
+ liquidVerts[(liqOffset + x * vertsY + y) * 3 + 0] = vert.y;
+ liquidVerts[(liqOffset + x * vertsY + y) * 3 + 1] = vert.z;
+ liquidVerts[(liqOffset + x * vertsY + y) * 3 + 2] = vert.x;
}
+ }
- std::size_t liquidSquares = 0;
- for (uint32 x = 0; x < tilesX; ++x)
+ std::size_t liquidSquares = 0;
+ for (uint32 x = 0; x < tilesX; ++x)
+ {
+ for (uint32 y = 0; y < tilesY; ++y)
{
- for (uint32 y = 0; y < tilesY; ++y)
+ if ((flags[x + y * tilesX] & 0x0f) != 0x0f)
{
- if ((flags[x + y * tilesX] & 0x0f) != 0x0f)
- {
- uint32 square = x * tilesY + y;
- int idx1 = square + x;
- int idx2 = square + 1 + x;
- int idx3 = square + tilesY + 1 + 1 + x;
- int idx4 = square + tilesY + 1 + x;
-
- std::size_t liquidTriOffset = meshData.liquidTris.size();
- meshData.liquidTris.resize(liquidTriOffset + 6);
- int* liquidTris = meshData.liquidTris.data() + liquidTriOffset;
-
- // top triangle
- liquidTris[0] = idx2 + liqOffset;
- liquidTris[1] = idx1 + liqOffset;
- liquidTris[2] = idx3 + liqOffset;
-
- // bottom triangle
- liquidTris[3] = idx3 + liqOffset;
- liquidTris[4] = idx1 + liqOffset;
- liquidTris[5] = idx4 + liqOffset;
-
- ++liquidSquares;
- }
+ uint32 square = x * tilesY + y;
+ int idx1 = square + x;
+ int idx2 = square + 1 + x;
+ int idx3 = square + tilesY + 1 + 1 + x;
+ int idx4 = square + tilesY + 1 + x;
+
+ std::size_t liquidTriOffset = meshData.liquidTris.size();
+ meshData.liquidTris.resize(liquidTriOffset + 6);
+ int* liquidTris = meshData.liquidTris.data() + liquidTriOffset;
+
+ // top triangle
+ liquidTris[0] = idx2 + liqOffset;
+ liquidTris[1] = idx1 + liqOffset;
+ liquidTris[2] = idx3 + liqOffset;
+
+ // bottom triangle
+ liquidTris[3] = idx3 + liqOffset;
+ liquidTris[4] = idx1 + liqOffset;
+ liquidTris[5] = idx4 + liqOffset;
+
+ ++liquidSquares;
}
}
-
- meshData.liquidType.resize(meshData.liquidType.size() + liquidSquares * 2, type);
}
+
+ meshData.liquidType.resize(meshData.liquidType.size() + liquidSquares * 2, type);
}
}
-
- return retval;
}
/**************************************************************************/
diff --git a/src/tools/mmaps_generator/TerrainBuilder.h b/src/tools/mmaps_generator/TerrainBuilder.h
index 1865696ed7e..a8a21025a98 100644
--- a/src/tools/mmaps_generator/TerrainBuilder.h
+++ b/src/tools/mmaps_generator/TerrainBuilder.h
@@ -98,6 +98,8 @@ namespace MMAP
void loadMap(uint32 mapID, uint32 tileX, uint32 tileY, MeshData& meshData, VMAP::VMapManager* vmapManager);
bool loadVMap(uint32 mapID, uint32 tileX, uint32 tileY, MeshData& meshData, VMAP::VMapManager* vmapManager);
+ void loadVMapModel(VMAP::WorldModel const* worldModel, G3D::Vector3 const& position, G3D::Matrix3 const& rotation, float scale,
+ MeshData& meshData, VMAP::VMapManager* vmapManager);
void loadOffMeshConnections(uint32 mapID, uint32 tileX, uint32 tileY, MeshData& meshData, std::vector<OffMeshData> const& offMeshConnections);
bool usesLiquids() const { return !m_skipLiquid; }