package org.osm2world.viewer.view.debug;
import java.awt.Color;
import java.util.ArrayList;
import java.util.List;
import org.osm2world.core.math.VectorXYZ;
import org.osm2world.core.math.VectorXZ;
import org.osm2world.core.target.TargetUtil;
import org.osm2world.core.target.common.FaceTarget;
import org.osm2world.core.target.common.RenderableToFaceTarget;
import org.osm2world.core.target.common.material.Material;
import org.osm2world.core.target.jogl.JOGLTarget;
import org.osm2world.core.world.data.WorldObject;
/**
* shows decomposition of {@link WorldObject}s into faces
* as they would be written to any {@link FaceTarget}
*/
public class FaceDebugView extends DebugView {
private static final Color BORDER_COLOR = new Color(0, 0, 1.0f);
@Override
public String getDescription() {
return "shows decomposition of WorldObjects into faces";
}
@Override
public boolean canBeUsed() {
return map != null;
}
private static class FaceSink
extends FaceTarget<RenderableToFaceTarget> {
public final List<List<VectorXYZ>> faces =
new ArrayList<List<VectorXYZ>>();
@Override
public Class<RenderableToFaceTarget> getRenderableType() {
return RenderableToFaceTarget.class;
}
@Override
public void render(RenderableToFaceTarget renderable) {
renderable.renderTo(this);
}
@Override
public boolean reconstructFaces() {
return true;
}
@Override
public void drawFace(Material material, List<VectorXYZ> vs,
List<VectorXYZ> normals, List<List<VectorXZ>> texCoordLists) {
faces.add(vs);
}
}
@Override
protected void fillTarget(JOGLTarget target) {
FaceSink faceSink = new FaceSink();
TargetUtil.renderWorldObjects(faceSink, map, true);
faceSink.finish();
for (List<VectorXYZ> face : faceSink.faces) {
target.drawLineLoop(BORDER_COLOR, 2, face);
}
}
}