package org.osm2world.core.world.modules;
import static java.util.Arrays.asList;
import static java.util.Collections.nCopies;
import static org.osm2world.core.target.common.material.Materials.PURIFIED_WATER;
import static org.osm2world.core.target.common.material.NamedTexCoordFunction.GLOBAL_X_Z;
import static org.osm2world.core.target.common.material.TexCoordUtil.*;
import static org.osm2world.core.world.modules.common.WorldModuleGeometryUtil.createShapeExtrusionAlong;
import java.util.Collection;
import java.util.List;
import org.openstreetmap.josm.plugins.graphview.core.data.TagGroup;
import org.osm2world.core.map_data.data.MapArea;
import org.osm2world.core.map_elevation.data.GroundState;
import org.osm2world.core.math.TriangleXYZ;
import org.osm2world.core.math.VectorXYZ;
import org.osm2world.core.target.RenderableToAllTargets;
import org.osm2world.core.target.Target;
import org.osm2world.core.target.common.material.Materials;
import org.osm2world.core.world.data.AbstractAreaWorldObject;
import org.osm2world.core.world.data.TerrainBoundaryWorldObject;
import org.osm2world.core.world.modules.common.AbstractModule;
/**
* adds swimming pools and water parks to the world
*/
public class PoolModule extends AbstractModule {
private final boolean isPool(TagGroup tags) {
boolean pool = tags.contains("amenity", "swimming_pool");
pool |= tags.contains("leisure", "swimming_pool");
return pool;
}
private final boolean isPool(MapArea area) {
return isPool(area.getTags());
}
@Override
protected void applyToArea(MapArea area) {
if (isPool(area))
area.addRepresentation(new Pool(area));
}
private static class Pool extends AbstractAreaWorldObject
implements RenderableToAllTargets, TerrainBoundaryWorldObject {
public Pool(MapArea area) {
super(area);
}
@Override
public GroundState getGroundState() {
return GroundState.ON;
}
@Override
public void renderTo(Target<?> target) {
/* render water */
Collection<TriangleXYZ> triangles = getTriangulation();
target.drawTriangles(PURIFIED_WATER, triangles,
triangleTexCoordLists(triangles, PURIFIED_WATER, GLOBAL_X_Z));
/* draw a small area around the pool */
double width=1;
double height=0.1;
List<VectorXYZ> wallShape = asList(
new VectorXYZ(-width/2, 0, 0),
new VectorXYZ(-width/2, height, 0),
new VectorXYZ(+width/2, height, 0),
new VectorXYZ(+width/2, 0, 0)
);
List<VectorXYZ> path = getOutlinePolygon().getVertexLoop();
List<List<VectorXYZ>> strips = createShapeExtrusionAlong(
wallShape, path,
nCopies(path.size(), VectorXYZ.Y_UNIT));
for (List<VectorXYZ> strip : strips) {
target.drawTriangleStrip(Materials.CONCRETE, strip,
texCoordLists(strip, Materials.CONCRETE, GLOBAL_X_Z));
}
}
}
}