Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Loading...
Searching...
No Matches
TerrainBuilder.h
Go to the documentation of this file.
1/*
2* This file is part of Project SkyFire https://www.projectskyfire.org.
3* See LICENSE.md file for Copyright information
4*/
5
6#ifndef _MMAP_TERRAIN_BUILDER_H
7#define _MMAP_TERRAIN_BUILDER_H
8
9#include "PathCommon.h"
10#include "WorldModel.h"
11
12#include "G3D/Array.h"
13#include "G3D/Vector3.h"
14#include "G3D/Matrix3.h"
15
16namespace MMAP
17{
18 enum Spot
19 {
20 TOP = 1,
21 RIGHT = 2,
22 LEFT = 3,
23 BOTTOM = 4,
25 };
26
27 enum Grid
28 {
31 };
32
33 static const int V9_SIZE = 129;
34 static const int V9_SIZE_SQ = V9_SIZE*V9_SIZE;
35 static const int V8_SIZE = 128;
36 static const int V8_SIZE_SQ = V8_SIZE*V8_SIZE;
37 static const float GRID_SIZE = 533.3333f;
38 static const float GRID_PART_SIZE = GRID_SIZE/V8_SIZE;
39
40 // see contrib/extractor/system.cpp, CONF_use_minHeight
41 static const float INVALID_MAP_LIQ_HEIGHT = -500.f;
42 static const float INVALID_MAP_LIQ_HEIGHT_MAX = 5000.0f;
43
44 // see following files:
45 // contrib/extractor/system.cpp
46 // src/game/Map.cpp
47
48 struct MeshData
49 {
50 G3D::Array<float> solidVerts;
51 G3D::Array<int> solidTris;
52
53 G3D::Array<float> liquidVerts;
54 G3D::Array<int> liquidTris;
55 G3D::Array<uint8> liquidType;
56
57 // offmesh connection data
58 G3D::Array<float> offMeshConnections; // [p0y,p0z,p0x,p1y,p1z,p1x] - per connection
59 G3D::Array<float> offMeshConnectionRads;
60 G3D::Array<unsigned char> offMeshConnectionDirs;
61 G3D::Array<unsigned char> offMeshConnectionsAreas;
62 G3D::Array<unsigned short> offMeshConnectionsFlags;
63 };
64
66 {
67 public:
68 TerrainBuilder(bool skipLiquid);
70
71 void loadMap(uint32 mapID, uint32 tileX, uint32 tileY, MeshData &meshData);
72 bool loadVMap(uint32 mapID, uint32 tileX, uint32 tileY, MeshData &meshData);
73 void loadOffMeshConnections(uint32 mapID, uint32 tileX, uint32 tileY, MeshData &meshData, const char* offMeshFilePath);
74
75 bool usesLiquids() { return !m_skipLiquid; }
76
77 // vert and triangle methods
78 static void transform(std::vector<G3D::Vector3> &original, std::vector<G3D::Vector3> &transformed,
79 float scale, G3D::Matrix3 &rotation, G3D::Vector3 &position);
80 static void copyVertices(std::vector<G3D::Vector3> &source, G3D::Array<float> &dest);
81 static void copyIndices(std::vector<VMAP::MeshTriangle> &source, G3D::Array<int> &dest, int offest, bool flip);
82 static void copyIndices(G3D::Array<int> &src, G3D::Array<int> &dest, int offset);
83 static void cleanVertices(G3D::Array<float> &verts, G3D::Array<int> &tris);
84 private:
86 bool loadMap(uint32 mapID, uint32 tileX, uint32 tileY, MeshData &meshData, Spot portion);
87
89 void getLoopVars(Spot portion, int &loopStart, int &loopEnd, int &loopInc);
90
93
95 bool loadHeightMap(uint32 mapID, uint32 tileX, uint32 tileY, G3D::Array<float> &vertices, G3D::Array<int> &triangles, Spot portion);
96
98 void getHeightCoord(int index, Grid grid, float xOffset, float yOffset, float* coord, float* v);
99
101 void getHeightTriangle(int square, Spot triangle, int* indices, bool liquid = false);
102
104 bool isHole(int square, uint8 const holes[16][16][8]);
105
107 void getLiquidCoord(int index, int index2, float xOffset, float yOffset, float* coord, float* v);
108
110 uint8 getLiquidType(int square, const uint8 liquid_type[16][16]);
111
112 // hide parameterless and copy constructor
115 };
116}
117
118#endif
119
std::uint8_t uint8
Definition Define.h:79
std::uint32_t uint32
Definition Define.h:77
uint16 holes[ADT_CELLS_PER_GRID][ADT_CELLS_PER_GRID]
Definition System.cpp:457
static void copyVertices(std::vector< G3D::Vector3 > &source, G3D::Array< float > &dest)
uint8 getLiquidType(int square, const uint8 liquid_type[16][16])
Get the liquid type for a specific position.
TerrainBuilder(const TerrainBuilder &tb)
bool isHole(int square, uint8 const holes[16][16][8])
Determines if the specific position's triangles should be rendered.
bool loadHeightMap(uint32 mapID, uint32 tileX, uint32 tileY, G3D::Array< float > &vertices, G3D::Array< int > &triangles, Spot portion)
Load the map terrain from file.
static void transform(std::vector< G3D::Vector3 > &original, std::vector< G3D::Vector3 > &transformed, float scale, G3D::Matrix3 &rotation, G3D::Vector3 &position)
static void cleanVertices(G3D::Array< float > &verts, G3D::Array< int > &tris)
static void copyIndices(std::vector< VMAP::MeshTriangle > &source, G3D::Array< int > &dest, int offest, bool flip)
void loadOffMeshConnections(uint32 mapID, uint32 tileX, uint32 tileY, MeshData &meshData, const char *offMeshFilePath)
bool m_skipLiquid
Controls whether liquids are loaded.
TerrainBuilder(bool skipLiquid)
void getHeightTriangle(int square, Spot triangle, int *indices, bool liquid=false)
Get the triangle's vector indices for a specific position.
void loadMap(uint32 mapID, uint32 tileX, uint32 tileY, MeshData &meshData)
void getLiquidCoord(int index, int index2, float xOffset, float yOffset, float *coord, float *v)
Get the liquid vector coordinate for a specific position.
bool loadVMap(uint32 mapID, uint32 tileX, uint32 tileY, MeshData &meshData)
void getHeightCoord(int index, Grid grid, float xOffset, float yOffset, float *coord, float *v)
Get the vector coordinate for a specific position.
void getLoopVars(Spot portion, int &loopStart, int &loopEnd, int &loopInc)
Sets loop variables for selecting only certain parts of a map's terrain.
static const float GRID_SIZE
static const float INVALID_MAP_LIQ_HEIGHT_MAX
static const int V9_SIZE
static const float GRID_PART_SIZE
static const float INVALID_MAP_LIQ_HEIGHT
static const int V8_SIZE
static const int V9_SIZE_SQ
static const int V8_SIZE_SQ
G3D::Array< float > liquidVerts
G3D::Array< float > offMeshConnectionRads
G3D::Array< unsigned char > offMeshConnectionDirs
G3D::Array< float > offMeshConnections
G3D::Array< unsigned short > offMeshConnectionsFlags
G3D::Array< float > solidVerts
G3D::Array< int > liquidTris
G3D::Array< int > solidTris
G3D::Array< unsigned char > offMeshConnectionsAreas
G3D::Array< uint8 > liquidType