diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/tools/mmaps_generator/TerrainBuilder.cpp | 171 | ||||
| -rw-r--r-- | src/tools/mmaps_generator/TerrainBuilder.h | 2 |
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; } |
