void MapBuilder::buildTile(int mapID, int tileX, int tileY, dtNavMesh* navMesh) { MeshData meshData; // get heightmap data m_terrainBuilder->loadMap(mapID, tileX, tileY, meshData, m_magic); // get model data m_terrainBuilder->loadVMap(mapID, tileY, tileX, meshData); // if there is no data, give up now if (!meshData.solidVerts.size() && !meshData.liquidVerts.size()) { return; } // remove unused vertices TerrainBuilder::cleanVertices(meshData.solidVerts, meshData.solidTris); TerrainBuilder::cleanVertices(meshData.liquidVerts, meshData.liquidTris); // gather all mesh data for final data check, and bounds calculation G3D::Array<float> allVerts; allVerts.append(meshData.liquidVerts); allVerts.append(meshData.solidVerts); if (!allVerts.size()) { return; } // get bounds of current tile float bmin[3], bmax[3]; getTileBounds(tileX, tileY, allVerts.getCArray(), allVerts.size() / 3, bmin, bmax); m_terrainBuilder->loadOffMeshConnections(mapID, tileX, tileY, meshData, m_offMeshFilePath); printf(" Building map %03u - Tile [%02u,%02u]\n", mapID, tileX, tileY); buildMoveMapTile(mapID, tileX, tileY, meshData, bmin, bmax, navMesh); }
void MapBuilder::buildMeshFromFile(char* name) { FILE* file = fopen(name, "rb"); if (!file) return; printf("Building mesh from file\n"); int tileX, tileY, mapId; if (fread(&mapId, sizeof(int), 1, file) != 1) return; if (fread(&tileX, sizeof(int), 1, file) != 1) return; if (fread(&tileY, sizeof(int), 1, file) != 1) return; dtNavMesh* navMesh = NULL; buildNavMesh(mapId, navMesh); if (!navMesh) { printf("Failed creating navmesh! \n"); fclose(file); return; } uint32 verticesCount, indicesCount; if (fread(&verticesCount, sizeof(uint32), 1, file) != 1) return; if (fread(&indicesCount, sizeof(uint32), 1, file) != 1) return; float* verts = new float[verticesCount]; int* inds = new int[indicesCount]; if (fread(verts, sizeof(float), verticesCount, file) != verticesCount) return; if (fread(inds, sizeof(int), indicesCount, file) != indicesCount) return; MeshData data; for (uint32 i = 0; i < verticesCount; ++i) data.solidVerts.append(verts[i]); for (uint32 i = 0; i < indicesCount; ++i) data.solidTris.append(inds[i]); TerrainBuilder::cleanVertices(data.solidVerts, data.solidTris); // get bounds of current tile float bmin[3], bmax[3]; getTileBounds(tileX, tileY, data.solidVerts.getCArray(), data.solidVerts.size() / 3, bmin, bmax); // build navmesh tile buildMoveMapTile(mapId, tileX, tileY, data, bmin, bmax, navMesh); fclose(file); }