package org.geogebra.common.geogebra3D.euclidian3D.draw;
import java.util.ArrayList;
import org.geogebra.common.euclidian.Previewable;
import org.geogebra.common.geogebra3D.euclidian3D.EuclidianView3D;
import org.geogebra.common.geogebra3D.euclidian3D.Hitting;
import org.geogebra.common.geogebra3D.euclidian3D.openGL.Renderer;
import org.geogebra.common.geogebra3D.euclidian3D.openGL.Renderer.PickingType;
import org.geogebra.common.kernel.geos.GeoElement;
/**
* Class for drawing multiple polygons within intersection curve.
*
* @author matthieu
*
*/
public class DrawIntersectionCurve3D extends Drawable3DCurves
implements Previewable {
private ArrayList<Drawable3D> drawables;
/**
* Common constructor
*
* @param a_view3D
* 3D view
* @param geo
* first geo
*/
public DrawIntersectionCurve3D(EuclidianView3D a_view3D, GeoElement geo) {
super(a_view3D, geo);
drawables = new ArrayList<Drawable3D>();
setPickingType(PickingType.POINT_OR_CURVE);
}
/**
* add a polygon to draw
*
* @param d
* drawable
*/
public void add(Drawable3D d) {
drawables.add(d);
}
// drawing
@Override
public void drawGeometry(Renderer renderer) {
for (Drawable3D d : drawables) {
d.drawGeometry(renderer);
}
}
@Override
public int getPickOrder() {
return DRAW_PICK_ORDER_PATH;
}
@Override
protected boolean updateForItSelf() {
for (Drawable3D d : drawables) {
d.updateForItSelf();
}
return true;
}
@Override
protected void updateForView() {
for (Drawable3D d : drawables) {
d.updateForView();
}
}
// //////////////////////////////
// Previewable interface
@Override
public void updateMousePos(double xRW, double yRW) {
// TODO Auto-generated method stub
}
@Override
public void updatePreview() {
setWaitForUpdate();
}
@Override
public void disposePreview() {
super.disposePreview();
for (Drawable3D d : drawables) {
d.disposePreview();
}
}
@Override
public boolean hit(Hitting hitting) {
if (waitForReset) { // prevent NPE
return false;
}
boolean ret = false;
setZPick(Double.NEGATIVE_INFINITY, Double.NEGATIVE_INFINITY);
for (Drawable3D d : drawables) {
if (d.hit(hitting)) {
if (d.getZPickNear() > getZPickNear()) {
setPickingType(d.getPickingType());
setZPick(d.getZPickNear(), d.getZPickFar());
}
ret = true;
}
}
return ret;
}
@Override
public void addToDrawable3DLists(Drawable3DLists lists) {
for (Drawable3D d : drawables) {
d.addToDrawable3DLists(lists);
}
}
}