aboutsummaryrefslogtreecommitdiff
path: root/src/tools/mmaps_generator
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2018-04-07 21:56:19 +0200
committerShauren <shauren.trinity@gmail.com>2018-04-07 21:56:19 +0200
commit2c64bb97e6fddcbd15ef39fde3d0828bbf600ec6 (patch)
tree27f9cf5bbfa3693a33b2289da36e5f6307001ce0 /src/tools/mmaps_generator
parent5c7a5ddcf4735a38c76ae16b416abff2dc94fb62 (diff)
Tools:
* mapextractor - fixed fatigue in Thousand Needles * mapextractor - fixed compressing liquid data * vmapextractor - fixed extracting liquids inside WMOs * vmapextractor - implemented new WMO flags * vmapextractor - store model type for gameobject models * mmap_generator - fixed processing liquids broken in e5d23103f37c40d2e946fa0e2db66d2f527ad9af
Diffstat (limited to 'src/tools/mmaps_generator')
-rw-r--r--src/tools/mmaps_generator/TerrainBuilder.cpp161
-rw-r--r--src/tools/mmaps_generator/TerrainBuilder.h2
2 files changed, 84 insertions, 79 deletions
diff --git a/src/tools/mmaps_generator/TerrainBuilder.cpp b/src/tools/mmaps_generator/TerrainBuilder.cpp
index ca4ae090423..33724257809 100644
--- a/src/tools/mmaps_generator/TerrainBuilder.cpp
+++ b/src/tools/mmaps_generator/TerrainBuilder.cpp
@@ -59,7 +59,8 @@ struct map_heightHeader
struct map_liquidHeader
{
uint32 fourcc;
- uint16 flags;
+ uint8 flags;
+ uint8 liquidFlags;
uint16 liquidType;
uint8 offsetX;
uint8 offsetY;
@@ -74,12 +75,10 @@ struct map_liquidHeader
#define MAP_LIQUID_TYPE_MAGMA 0x04
#define MAP_LIQUID_TYPE_SLIME 0x08
#define MAP_LIQUID_TYPE_DARK_WATER 0x10
-#define MAP_LIQUID_TYPE_WMO_WATER 0x20
namespace MMAP
{
-
- char const* MAP_VERSION_MAGIC = "v1.8";
+ char const* MAP_VERSION_MAGIC = "v1.9";
TerrainBuilder::TerrainBuilder(bool skipLiquid) : m_skipLiquid (skipLiquid){ }
TerrainBuilder::~TerrainBuilder() { }
@@ -179,8 +178,10 @@ namespace MMAP
// data used later
uint8 holes[16][16][8];
memset(holes, 0, sizeof(holes));
- uint8 liquid_type[16][16];
- memset(liquid_type, 0, sizeof(liquid_type));
+ uint16 liquid_entry[16][16];
+ memset(liquid_entry, 0, sizeof(liquid_entry));
+ uint8 liquid_flags[16][16];
+ memset(liquid_flags, 0, sizeof(liquid_flags));
G3D::Array<int> ltriangles;
G3D::Array<int> ttriangles;
@@ -288,79 +289,90 @@ namespace MMAP
if (fread(&lheader, sizeof(map_liquidHeader), 1, mapFile) != 1)
printf("TerrainBuilder::loadMap: Failed to read some data expected 1, read 0\n");
-
- float* liquid_map = NULL;
+ float* liquid_map = nullptr;
if (!(lheader.flags & MAP_LIQUID_NO_TYPE))
- if (fread(liquid_type, sizeof(liquid_type), 1, mapFile) != 1)
+ {
+ if (fread(liquid_entry, sizeof(liquid_entry), 1, mapFile) != 1)
printf("TerrainBuilder::loadMap: Failed to read some data expected 1, read 0\n");
+ if (fread(liquid_flags, sizeof(liquid_flags), 1, mapFile) != 1)
+ printf("TerrainBuilder::loadMap: Failed to read some data expected 1, read 0\n");
+ }
+ else
+ {
+ std::fill_n(&liquid_entry[0][0], 16 * 16, lheader.liquidType);
+ std::fill_n(&liquid_flags[0][0], 16 * 16, lheader.liquidFlags);
+ }
if (!(lheader.flags & MAP_LIQUID_NO_HEIGHT))
{
uint32 toRead = lheader.width * lheader.height;
liquid_map = new float [toRead];
if (fread(liquid_map, sizeof(float), toRead, mapFile) != toRead)
+ {
printf("TerrainBuilder::loadMap: Failed to read some data expected 1, read 0\n");
+ delete[] liquid_map;
+ liquid_map = nullptr;
+ }
}
- if (liquid_map)
- {
- int count = meshData.liquidVerts.size() / 3;
- float xoffset = (float(tileX)-32)*GRID_SIZE;
- float yoffset = (float(tileY)-32)*GRID_SIZE;
+ int count = meshData.liquidVerts.size() / 3;
+ float xoffset = (float(tileX)-32)*GRID_SIZE;
+ float yoffset = (float(tileY)-32)*GRID_SIZE;
- float coord[3];
- int row, col;
+ float coord[3];
+ int row, col;
- // generate coordinates
- if (!(lheader.flags & MAP_LIQUID_NO_HEIGHT))
+ // generate coordinates
+ if (!(lheader.flags & MAP_LIQUID_NO_HEIGHT))
+ {
+ int j = 0;
+ for (int i = 0; i < V9_SIZE_SQ; ++i)
{
- int j = 0;
- for (int i = 0; i < V9_SIZE_SQ; ++i)
- {
- row = i / V9_SIZE;
- col = i % V9_SIZE;
+ row = i / V9_SIZE;
+ col = i % V9_SIZE;
- if (row < lheader.offsetY || row >= lheader.offsetY + lheader.height ||
- col < lheader.offsetX || col >= lheader.offsetX + lheader.width)
- {
- // dummy vert using invalid height
- meshData.liquidVerts.append((xoffset+col*GRID_PART_SIZE)*-1, INVALID_MAP_LIQ_HEIGHT, (yoffset+row*GRID_PART_SIZE)*-1);
- continue;
- }
-
- getLiquidCoord(i, j, xoffset, yoffset, coord, liquid_map);
- meshData.liquidVerts.append(coord[0]);
- meshData.liquidVerts.append(coord[2]);
- meshData.liquidVerts.append(coord[1]);
- j++;
+ if (row < lheader.offsetY || row >= lheader.offsetY + lheader.height ||
+ col < lheader.offsetX || col >= lheader.offsetX + lheader.width)
+ {
+ // dummy vert using invalid height
+ meshData.liquidVerts.append((xoffset+col*GRID_PART_SIZE)*-1, INVALID_MAP_LIQ_HEIGHT, (yoffset+row*GRID_PART_SIZE)*-1);
+ continue;
}
+
+ getLiquidCoord(i, j, xoffset, yoffset, coord, liquid_map);
+ meshData.liquidVerts.append(coord[0]);
+ meshData.liquidVerts.append(coord[2]);
+ meshData.liquidVerts.append(coord[1]);
+ j++;
}
- else
+ }
+ else
+ {
+ for (int i = 0; i < V9_SIZE_SQ; ++i)
{
- for (int i = 0; i < V9_SIZE_SQ; ++i)
- {
- row = i / V9_SIZE;
- col = i % V9_SIZE;
- meshData.liquidVerts.append((xoffset+col*GRID_PART_SIZE)*-1, lheader.liquidLevel, (yoffset+row*GRID_PART_SIZE)*-1);
- }
+ row = i / V9_SIZE;
+ col = i % V9_SIZE;
+ meshData.liquidVerts.append((xoffset+col*GRID_PART_SIZE)*-1, lheader.liquidLevel, (yoffset+row*GRID_PART_SIZE)*-1);
}
+ }
- delete [] liquid_map;
+ delete[] liquid_map;
- int indices[] = { 0, 0, 0 };
- int loopStart = 0, loopEnd = 0, loopInc = 0, triInc = BOTTOM-TOP;
- getLoopVars(portion, loopStart, loopEnd, loopInc);
+ int indices[] = { 0, 0, 0 };
+ int loopStart = 0, loopEnd = 0, loopInc = 0, triInc = BOTTOM-TOP;
+ getLoopVars(portion, loopStart, loopEnd, loopInc);
- // generate triangles
- for (int i = loopStart; i < loopEnd; i+=loopInc)
- for (int j = TOP; j <= BOTTOM; j+= triInc)
- {
- getHeightTriangle(i, Spot(j), indices, true);
- ltriangles.append(indices[2] + count);
- ltriangles.append(indices[1] + count);
- ltriangles.append(indices[0] + count);
- }
+ // generate triangles
+ for (int i = loopStart; i < loopEnd; i += loopInc)
+ {
+ for (int j = TOP; j <= BOTTOM; j += triInc)
+ {
+ getHeightTriangle(i, Spot(j), indices, true);
+ ltriangles.append(indices[2] + count);
+ ltriangles.append(indices[1] + count);
+ ltriangles.append(indices[0] + count);
+ }
}
}
@@ -404,31 +416,24 @@ namespace MMAP
useLiquid = false;
else
{
- liquidType = getLiquidType(i, liquid_type);
- switch (liquidType)
+ liquidType = getLiquidType(i, liquid_flags);
+ if (liquidType & MAP_LIQUID_TYPE_DARK_WATER)
{
- default:
- useLiquid = false;
- break;
- case MAP_LIQUID_TYPE_WATER:
- case MAP_LIQUID_TYPE_OCEAN:
- // merge different types of water
- liquidType = NAV_WATER;
- break;
- case MAP_LIQUID_TYPE_MAGMA:
- liquidType = NAV_MAGMA;
- break;
- case MAP_LIQUID_TYPE_SLIME:
- liquidType = NAV_SLIME;
- break;
- case MAP_LIQUID_TYPE_DARK_WATER:
- // players should not be here, so logically neither should creatures
- useTerrain = false;
- useLiquid = false;
- break;
+ // players should not be here, so logically neither should creatures
+ useTerrain = false;
+ useLiquid = false;
}
+ else if ((liquidType & (MAP_LIQUID_TYPE_WATER | MAP_LIQUID_TYPE_OCEAN)) != 0)
+ liquidType = NAV_WATER;
+ else if (liquidType & MAP_LIQUID_TYPE_MAGMA)
+ liquidType = NAV_MAGMA;
+ else if (liquidType & MAP_LIQUID_TYPE_SLIME)
+ liquidType = NAV_SLIME;
+ else
+ useLiquid = false;
}
+
// if there is no terrain, don't use terrain
if (!ttriangles.size())
useTerrain = false;
@@ -699,7 +704,7 @@ namespace MMAP
copyIndices(tempTriangles, meshData.solidTris, offset, isM2);
// now handle liquid data
- if (liquid)
+ if (liquid && liquid->GetFlagsStorage())
{
std::vector<G3D::Vector3> liqVerts;
std::vector<int> liqTris;
diff --git a/src/tools/mmaps_generator/TerrainBuilder.h b/src/tools/mmaps_generator/TerrainBuilder.h
index 5c3fcb0aa76..7a9d247f764 100644
--- a/src/tools/mmaps_generator/TerrainBuilder.h
+++ b/src/tools/mmaps_generator/TerrainBuilder.h
@@ -51,7 +51,7 @@ namespace MMAP
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 = -500.f;
+ static const float INVALID_MAP_LIQ_HEIGHT = -2000.f;
static const float INVALID_MAP_LIQ_HEIGHT_MAX = 5000.0f;
// see following files: