package org.osm2world.viewer.view.debug;
import static org.osm2world.core.util.FaultTolerantIterationUtil.iterate;
import java.awt.Color;
import org.osm2world.core.math.VectorXYZ;
import org.osm2world.core.target.TargetUtil;
import org.osm2world.core.target.common.Primitive;
import org.osm2world.core.target.common.material.Material;
import org.osm2world.core.target.common.material.Material.Interpolation;
import org.osm2world.core.target.jogl.JOGLTarget;
import org.osm2world.core.target.jogl.PrimitiveBuffer;
import org.osm2world.core.util.FaultTolerantIterationUtil.Operation;
import org.osm2world.core.world.data.WorldObject;
public class WorldObjectNormalsDebugView extends DebugView {
private static final Color FLAT_NORMALS_COLOR = Color.YELLOW;
private static final Color SMOOTH_NORMALS_COLOR = Color.ORANGE;
@Override
public String getDescription() {
return "draws world object normals as arrows";
}
@Override
public boolean canBeUsed() {
return map != null;
}
@Override
protected void fillTarget(JOGLTarget target) {
final PrimitiveBuffer primitiveBuffer = new PrimitiveBuffer();
iterate(map.getWorldObjects(), new Operation<WorldObject>() {
@Override public void perform(WorldObject w) {
TargetUtil.renderObject(primitiveBuffer, w);
}
});
for (Material material : primitiveBuffer .getMaterials()) {
Color color = material.getInterpolation() == Interpolation.FLAT ?
FLAT_NORMALS_COLOR : SMOOTH_NORMALS_COLOR;
for (Primitive primitive : primitiveBuffer.getPrimitives(material)) {
for (int i = 0; i < primitive.vertices.size(); i++) {
VectorXYZ v = primitive.vertices.get(i);
VectorXYZ n = primitive.normals.get(i);
if (n != null) {
drawArrow(target, color, 0.3f, v, v.add(n));
}
}
}
}
}
}