| 1174 | } |
| 1175 | |
| 1176 | void DungeonGeneratorWriter::flush() { |
| 1177 | auto geometry = m_facade->getWorldGeometry(); |
| 1178 | auto displace = [&](Vec2I pos) -> Vec2I { return geometry.xwrap(pos); }; |
| 1179 | auto displaceF = [&](Vec2F pos) -> Vec2F { return geometry.xwrap(pos); }; |
| 1180 | |
| 1181 | PolyF::VertexList terrainBlendingVertexes; |
| 1182 | PolyF::VertexList spaceBlendingVertexes; |
| 1183 | for (auto bb : m_boundingBoxes) { |
| 1184 | m_facade->markRegion(bb); |
| 1185 | |
| 1186 | if (m_terrainMarkingSurfaceLevel) { |
| 1187 | // Mark the regions of the dungeon above the dungeon surface as needing |
| 1188 | // space, and the regions below the surface as needing terrain |
| 1189 | if (bb.yMin() < *m_terrainMarkingSurfaceLevel) { |
| 1190 | RectI lower = bb; |
| 1191 | lower.setYMax(min(lower.yMax(), *m_terrainMarkingSurfaceLevel)); |
| 1192 | terrainBlendingVertexes.append(Vec2F(lower.xMin(), lower.yMin())); |
| 1193 | terrainBlendingVertexes.append(Vec2F(lower.xMax(), lower.yMin())); |
| 1194 | terrainBlendingVertexes.append(Vec2F(lower.xMin(), lower.yMax())); |
| 1195 | terrainBlendingVertexes.append(Vec2F(lower.xMax(), lower.yMax())); |
| 1196 | } |
| 1197 | |
| 1198 | if (bb.yMax() > *m_terrainMarkingSurfaceLevel) { |
| 1199 | RectI upper = bb; |
| 1200 | upper.setYMin(max(upper.yMin(), *m_terrainMarkingSurfaceLevel)); |
| 1201 | spaceBlendingVertexes.append(Vec2F(upper.xMin(), upper.yMin())); |
| 1202 | spaceBlendingVertexes.append(Vec2F(upper.xMax(), upper.yMin())); |
| 1203 | spaceBlendingVertexes.append(Vec2F(upper.xMin(), upper.yMax() + m_terrainSurfaceSpaceExtends.value(0))); |
| 1204 | spaceBlendingVertexes.append(Vec2F(upper.xMax(), upper.yMax() + m_terrainSurfaceSpaceExtends.value(0))); |
| 1205 | } |
| 1206 | } |
| 1207 | } |
| 1208 | |
| 1209 | if (!terrainBlendingVertexes.empty()) |
| 1210 | m_facade->markTerrain(PolyF::convexHull(terrainBlendingVertexes)); |
| 1211 | if (!spaceBlendingVertexes.empty()) |
| 1212 | m_facade->markSpace(PolyF::convexHull(spaceBlendingVertexes)); |
| 1213 | |
| 1214 | for (auto iter = m_backgroundMaterial.begin(); iter != m_backgroundMaterial.end(); iter++) |
| 1215 | m_facade->setBackgroundMaterial(displace(iter->first), iter->second.material, iter->second.hueshift, iter->second.colorVariant); |
| 1216 | for (auto iter = m_foregroundMaterial.begin(); iter != m_foregroundMaterial.end(); iter++) |
| 1217 | m_facade->setForegroundMaterial(displace(iter->first), iter->second.material, iter->second.hueshift, iter->second.colorVariant); |
| 1218 | for (auto iter = m_foregroundMod.begin(); iter != m_foregroundMod.end(); iter++) |
| 1219 | m_facade->setForegroundMod(displace(iter->first), iter->second.mod, iter->second.hueshift); |
| 1220 | for (auto iter = m_backgroundMod.begin(); iter != m_backgroundMod.end(); iter++) |
| 1221 | m_facade->setBackgroundMod(displace(iter->first), iter->second.mod, iter->second.hueshift); |
| 1222 | |
| 1223 | List<Vec2I> sortedPositions = m_objects.keys(); |
| 1224 | sortByComputedValue(sortedPositions, [](Vec2I pos) { return pos[1] + pos[0] / 1000.0f; }); |
| 1225 | for (auto pos : sortedPositions) { |
| 1226 | auto& object = m_objects[pos]; |
| 1227 | m_facade->placeObject(displace(pos), object.objectName, object.direction, object.parameters); |
| 1228 | } |
| 1229 | |
| 1230 | for (auto entry : m_vehicles) { |
| 1231 | String vehicleName; |
| 1232 | Json parameters; |
| 1233 | tie(vehicleName, parameters) = entry.second; |
no test coverage detected