/*
* This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see .
*/
#ifndef _MMAP_TERRAIN_BUILDER_H
#define _MMAP_TERRAIN_BUILDER_H
#include "MMapDefines.h"
#include "WorldModel.h"
#include
#include
namespace VMAP
{
class VMapManager;
}
enum class map_liquidHeaderTypeFlags : uint8;
namespace MMAP
{
enum Spot
{
TOP = 1,
RIGHT = 2,
LEFT = 3,
BOTTOM = 4,
ENTIRE = 5
};
enum Grid
{
GRID_V8,
GRID_V9
};
static const int V9_SIZE = 129;
static const int V9_SIZE_SQ = V9_SIZE*V9_SIZE;
static const int V8_SIZE = 128;
static const int V8_SIZE_SQ = V8_SIZE*V8_SIZE;
static const float GRID_SIZE = 533.3333f;
static const float GRID_PART_SIZE = GRID_SIZE/V8_SIZE;
// see contrib/extractor/system.cpp, CONF_use_minHeight
static const float INVALID_MAP_LIQ_HEIGHT = -2000.f;
static const float INVALID_MAP_LIQ_HEIGHT_MAX = 5000.0f;
// see following files:
// contrib/extractor/system.cpp
// src/game/Map.cpp
struct MeshData
{
std::vector solidVerts;
std::vector solidTris;
std::vector liquidVerts;
std::vector liquidTris;
std::vector liquidType;
// offmesh connection data
std::vector offMeshConnections; // [p0y,p0z,p0x,p1y,p1z,p1x] - per connection
std::vector offMeshConnectionRads;
std::vector offMeshConnectionDirs;
std::vector offMeshConnectionsAreas;
std::vector offMeshConnectionsFlags;
};
class TC_MMAPS_COMMON_API TerrainBuilder
{
public:
explicit TerrainBuilder(boost::filesystem::path const& inputDirectory, bool skipLiquid);
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 const& offMeshConnections);
bool usesLiquids() const { return !m_skipLiquid; }
// vert and triangle methods
static void transformVertices(std::vector const& source, std::vector& dest,
float scale, G3D::Matrix3 const& rotation, G3D::Vector3 const& position);
static void copyIndices(std::vector const& source, std::vector& dest, int offset, bool flip);
static void copyIndices(std::vector const& source, std::vector& dest, int offset);
static void cleanVertices(std::vector& verts, std::vector& tris);
private:
/// Loads a portion of a map's terrain
bool loadMap(uint32 mapID, uint32 tileX, uint32 tileY, MeshData& meshData, VMAP::VMapManager* vmapManager, Spot portion);
/// Sets loop variables for selecting only certain parts of a map's terrain
static void getLoopVars(Spot portion, int& loopStart, int& loopEnd, int& loopInc);
boost::filesystem::path m_inputDirectory;
/// Controls whether liquids are loaded
bool m_skipLiquid;
/// Get the vector coordinate for a specific position
static void getHeightCoord(int index, Grid grid, float xOffset, float yOffset, float* coord, float* v);
/// Get the triangle's vector indices for a specific position
static void getHeightTriangle(int square, Spot triangle, int* indices, int offset, bool liquid = false);
/// Determines if the specific position's triangles should be rendered
static bool isHole(int square, uint8 const (&holes)[16][16][8]);
/// Get the liquid vector coordinate for a specific position
static void getLiquidCoord(int index, int index2, float xOffset, float yOffset, float* coord, float* v);
/// Get the liquid type for a specific position
static map_liquidHeaderTypeFlags getLiquidType(int square, map_liquidHeaderTypeFlags const (&liquid_type)[16][16]);
};
TC_MMAPS_COMMON_API extern std::unique_ptr (*CreateVMapManager)(uint32 mapId);
}
#endif