package org.osm2world.viewer.view.debug;
import static java.awt.Color.*;
import static org.osm2world.core.math.GeometryUtil.interpolateBetween;
import java.awt.Color;
import java.util.List;
import org.osm2world.core.map_elevation.creation.EleConstraintEnforcer;
import org.osm2world.core.map_elevation.data.EleConnector;
import org.osm2world.core.math.VectorXYZ;
import org.osm2world.core.target.jogl.JOGLTarget;
import org.osm2world.core.world.data.WorldObject;
/**
* shows elevation constraints
*/
public class EleConstraintDebugView extends DebugView {
private static final Color SAME_ELE_COLOR = WHITE;
private static final Color MIN_VDIST_COLOR = PINK;
private static final Color SMOOTHNESS = GREEN;
@Override
public String getDescription() {
return "shows elevation constraints";
}
@Override
public boolean canBeUsed() {
return map != null;
}
@Override
protected void fillTarget(JOGLTarget target) {
ConstraintSink sink = new ConstraintSink(target);
for (WorldObject worldObject : map.getWorldObjects()) {
worldObject.defineEleConstraints(sink);
}
}
private static class ConstraintSink implements EleConstraintEnforcer {
private final JOGLTarget target;
private ConstraintSink(JOGLTarget target) {
this.target = target;
}
@Override
public void addConnectors(Iterable<EleConnector> connectors) {
}
@Override
public void requireSameEle(EleConnector c1, EleConnector c2) {
if (!c1.getPosXYZ().equals(c2.getPosXYZ())) {
target.drawLineStrip(SAME_ELE_COLOR, 2, c1.getPosXYZ(), c2.getPosXYZ());
}
}
@Override
public void requireSameEle(Iterable<EleConnector> cs) {
}
@Override
public void requireVerticalDistance(ConstraintType type, double distance,
EleConnector upper, EleConnector lower) {
if (upper == null || lower == null) {
//TODO this should not happen
return;
}
target.drawLineStrip(MIN_VDIST_COLOR, 2,
lower.getPosXYZ(),
upper.getPosXYZ());
drawArrow(target, MIN_VDIST_COLOR,
(float) (distance / 2),
lower.getPosXYZ(),
lower.getPosXYZ().addY(distance));
}
@Override
public void requireVerticalDistance(ConstraintType type, double distance,
EleConnector upper, EleConnector base1, EleConnector base2) {
if (upper == null || base1 == null || base2 == null) {
//TODO this should not happen
return;
}
target.drawLineStrip(MIN_VDIST_COLOR, 2,
base1.getPosXYZ(),
base2.getPosXYZ());
double dist1 = base1.pos.distanceTo(upper.pos);
double dist2 = base2.pos.distanceTo(upper.pos);
VectorXYZ base = interpolateBetween(
base1.getPosXYZ(),
base2.getPosXYZ(),
dist1 / (dist1 + dist2));
target.drawLineStrip(MIN_VDIST_COLOR, 2,
base,
upper.getPosXYZ());
drawArrow(target, MIN_VDIST_COLOR,
(float) (distance / 2),
base,
base.addY(distance));
}
@Override
public void requireIncline(ConstraintType type, double incline,
List<EleConnector> cs) {
}
@Override
public void requireSmoothness(
EleConnector from, EleConnector via, EleConnector to) {
VectorXYZ v = via.getPosXYZ();
VectorXYZ vToFrom = from.getPosXYZ().subtract(v).normalize();
VectorXYZ vToTo = to.getPosXYZ().subtract(v).normalize();
target.drawLineStrip(SMOOTHNESS, 3,
v.add(vToFrom.mult(2)),
v,
v.add(vToTo.mult(2)));
}
@Override
public void enforceConstraints() {
}
}
}