package org.osm2world.viewer.view.debug;
import static java.util.Arrays.asList;
import java.awt.Color;
import java.io.IOException;
import java.util.Collection;
import org.osm2world.core.ConversionFacade.Results;
import org.osm2world.core.map_data.creation.MapProjection;
import org.osm2world.core.map_elevation.creation.TerrainInterpolator;
import org.osm2world.core.math.AxisAlignedBoundingBoxXZ;
import org.osm2world.core.math.VectorGridXZ;
import org.osm2world.core.math.VectorXYZ;
import org.osm2world.core.target.common.lighting.GlobalLightingParameters;
import org.osm2world.core.target.common.material.ImmutableMaterial;
import org.osm2world.core.target.common.material.Material;
import org.osm2world.core.target.common.material.Material.Interpolation;
import org.osm2world.core.target.jogl.JOGLRenderingParameters;
import org.osm2world.core.target.jogl.JOGLTarget;
import org.osm2world.viewer.model.RenderOptions;
public abstract class TerrainInterpolatorDebugView extends DebugView {
protected abstract TerrainInterpolator buildInterpolator();
private static final double SAMPLE_DIST = 3;
private static final Material TERRAIN_MAT =
new ImmutableMaterial(Interpolation.FLAT, Color.WHITE);
private final RenderOptions renderOptions;
private MapProjection mapProjection = null;
protected TerrainInterpolatorDebugView(RenderOptions renderOptions) {
this.renderOptions = renderOptions;
}
@Override
public String getDescription() {
return "shows empty terrain approximated by a " +
buildInterpolator().getClass().getSimpleName();
}
@Override
public boolean canBeUsed() {
return map != null && mapProjection != null && eleData != null;
}
@Override
public void setConversionResults(Results conversionResults) {
super.setConversionResults(conversionResults);
mapProjection = conversionResults.getMapProjection();
}
@Override
public void fillTarget(JOGLTarget target) {
target.setRenderingParameters(new JOGLRenderingParameters(null,
renderOptions.isWireframe(), true));
target.setGlobalLightingParameters(GlobalLightingParameters.DEFAULT);
try {
Collection<VectorXYZ> sites = eleData.getSites(map);
TerrainInterpolator strategy = buildInterpolator();
strategy.setKnownSites(sites);
AxisAlignedBoundingBoxXZ bound = map.getDataBoundary();
VectorGridXZ sampleGrid = new VectorGridXZ(bound, SAMPLE_DIST);
VectorXYZ[][] samples = new VectorXYZ[sampleGrid.sizeX()][sampleGrid.sizeZ()];
long startTimeMillis = System.currentTimeMillis();
for (int x = 0; x < sampleGrid.sizeX(); x++) {
for (int z = 0; z < sampleGrid.sizeZ(); z++) {
samples[x][z] = strategy.interpolateEle(sampleGrid.get(x, z));
}
if (x % 100 == 0) {
long finishedSamples = x * sampleGrid.sizeZ();
System.out.println(finishedSamples + "/" + sampleGrid.size()
+ " after " + ((System.currentTimeMillis() - startTimeMillis) / 1000f));
}
}
/* draw surface from samples */
for (int x = 0; x+1 < samples.length; x++) {
for (int z = 0; z+1 < samples[x].length; z++) {
target.drawTriangleFan(TERRAIN_MAT,
asList(samples[x][z], samples[x+1][z],
samples[x+1][z+1], samples[x][z+1]),
null);
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}