package org.jzy3d.plot3d.primitives.interactive.tools;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Vector;

import org.apache.log4j.Logger;
import org.jzy3d.chart.Chart;
import org.jzy3d.colors.Color;
import org.jzy3d.maths.Coord3d;
import org.jzy3d.maths.TicToc;
import org.jzy3d.plot3d.primitives.AbstractComposite;
import org.jzy3d.plot3d.primitives.AbstractDrawable;
import org.jzy3d.plot3d.primitives.Polygon;
import org.jzy3d.plot3d.rendering.scene.Decomposition;
import org.jzy3d.plot3d.rendering.scene.Graph;
import org.jzy3d.plot3d.rendering.view.Camera;

import com.jogamp.opengl.GL;
import com.jogamp.opengl.glu.GLU;



public class ProjectionUtils {
    static Logger logger = Logger.getLogger(ProjectionUtils.class);
    
	public static List project(Chart chart){
		return project(chart.getView().getCurrentGL(), new GLU(), chart.getView().getCamera(), chart.getScene().getGraph());
	}
	
	public static List project(GL gl, GLU glu, Camera cam, Graph g){
		return project(gl, glu, cam, g.getAll());
	}
	
	public static List project(GL gl, GLU glu, Camera cam, List list){
		return project(gl, glu, cam, Decomposition.getDecomposition(list));
	}
	
	public static List project(GL gl, GLU glu, Camera cam, AbstractComposite c){
		ArrayList monotypes = Decomposition.getDecomposition(c);
		return project(gl, glu, cam, monotypes);
	}
	
	public static List project(GL gl, GLU glu, Camera cam, ArrayList monotypes){
		final TicToc t = new TicToc();
		String report = "";
		
		// prepare a more efficient datastructure
		ArrayList> polygons = new ArrayList>(monotypes.size()); 
		ArrayList> colors = new ArrayList>(monotypes.size()); 		
		for(AbstractDrawable d: monotypes){
			if( d instanceof Polygon ){
				polygons.add( ProjectionUtils.getCoordinatesAsArrayList( (Polygon)d ) );
				colors.add( ProjectionUtils.getColorsAsArrayList( (Polygon)d ) );
			}
			else
			    logger.warn("Only polygons are supported. Ignoring :" + d.getClass());
		}
		
		// project
		t.tic();
		ArrayList> projections = cam.modelToScreen(gl, glu, polygons);
		t.toc(); report += " Projections :" + t.elapsedMilisecond();
		
		// gather polygon and its colors in a data structure
		int k=0;
		List polygonProjections = new ArrayList();
		for(ArrayList p: projections){
			polygonProjections.add( new PolygonProjection(p, colors.get(k++)) );
		}
		
		// sort according to z
		t.tic();
		Collections.sort(polygonProjections, new ProjectionComparator());
		t.tocShow(report+ " Sort : "); 
		return polygonProjections;
	}
	
	/************************************************/
	
	public static ArrayList getCoordinatesAsArrayList(Polygon p){
		ArrayList coords = new ArrayList(p.size());
		for(int i=0; i getCoordinates(Polygon p){
		List coords = new Vector(p.size());
		for(int i=0; i getColorsAsArrayList(Polygon p){
		ArrayList colors = new ArrayList(4);
		for(int i=0; i getColors(Polygon p){
		List colors = new Vector(4);
		for(int i=0; i 

Ads help maintain this website.