package org.jzy3d.plot3d.primitives.graphs;

import java.util.HashMap;
import java.util.Map;

import org.jzy3d.maths.Coord2d;
import org.jzy3d.maths.Coord3d;
import org.jzy3d.maths.graphs.IGraph;
import org.jzy3d.picking.PickingSupport;
import org.jzy3d.plot3d.primitives.AbstractDrawable;
import org.jzy3d.plot3d.primitives.graphs.layout.DefaultGraphFormatter;
import org.jzy3d.plot3d.primitives.graphs.layout.IGraphFormatter;
import org.jzy3d.plot3d.primitives.graphs.layout.IGraphLayout2d;
import org.jzy3d.plot3d.primitives.pickable.Pickable;
import org.jzy3d.plot3d.rendering.view.Camera;
import org.jzy3d.plot3d.text.renderers.TextBitmapRenderer;

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

/** 
 * An implementation based on {@link Pickable} objects should register
 * mapping between vertex model and vertex representation through
 * {@link PickSupport.registerPickableObject(IPickable pickable, V v)}
 * 
 * Registration should be done by overriding setGraphModel.
 * 
 * One can later listen to picking events through:
 * {@link PickSupport.addVertexPickListener(IVertexPickListener listener)}
 */
public abstract class AbstractDrawableGraph2d extends AbstractDrawable implements IDrawableGraph2d{
	public AbstractDrawableGraph2d() {
		super();
		formatter = new DefaultGraphFormatter();
	}
	
	@Override
	public IGraphFormatter getGraphFormatter() {
		return formatter;
	}

	@Override
	public IGraphLayout2d getGraphLayout(){
		return layout;
	}
	
	@Override
	public IGraph getGraphModel(){
		return graph;
	}

	@Override
	public void setGraphFormatter(IGraphFormatter formatter) {
		this.formatter = formatter;
	}
	
	@Override
	public void setGraphLayout(IGraphLayout2d layout) {
		this.layout = layout;		
		bbox.reset();		
		for(Coord2d c: layout.values())
			bbox.add(c.x, c.y, Z);
	}
	
	@Override
	public void setGraphModel(IGraph graph, PickingSupport picking){
		setGraphModel(graph);
	}
	
	@Override
	public void setGraphModel(IGraph graph){
		this.graph= graph; 
		for(V v: graph.getVertices())
			highlights.put(v, false);
	}
	
	/*******************************************************/
	
	@Override
	public void draw(GL gl, GLU glu, Camera cam) {
		if(layout==null)
			throw new RuntimeException("missing vertex mapping");
		
		doTransform(gl, glu, cam);
	    
		// TODO move to graph view init
	    gl.glEnable(GL2ES1.GL_POINT_SMOOTH);
	    gl.glHint(GL2ES1.GL_POINT_SMOOTH_HINT, GL.GL_NICEST);
	
	    if(formatter.areEdgesDisplayed())
	    	drawEdges(gl, glu, cam);
	    if(formatter.areVerticesDisplayed())
	    	drawVertices(gl, glu, cam);
	    if(formatter.areVertexLabelsDisplayed())
	    	drawVertexLabels(gl, glu, cam);
	}
	
	protected abstract void drawVertices(GL gl, GLU glu, Camera cam);
	protected abstract void drawVertexLabels(GL gl, GLU glu, Camera cam);
	protected abstract void drawEdges(GL gl, GLU glu, Camera cam);

	/*******************************************************/

	public Coord2d getLabelScreenOffset() {
		return labelScreenOffset;
	}

	public void setLabelScreenOffset(Coord2d labelOffset) {
		this.labelScreenOffset = labelOffset;
	}
	
	public Coord3d getLabelSceneOffset() {
		return labelSceneOffset;
	}

	public void setLabelSceneOffset(Coord3d labelSceneOffset) {
		this.labelSceneOffset = labelSceneOffset;
	}

	/*******************************************************/
	// HIGHLIGHTS
	
	@Override
	public boolean isEdgeHighlighted(E e){
		return false;
	}
	
	@Override
	public boolean isVertexHighlighted(V v){
		return highlights.get(v);
	}
	
	@Override
	public void setVertexHighlighted(V v, boolean nodeDisplayed){
		highlights.put(v, nodeDisplayed);
	}
	
	@Override
	public void clearHighlighted(){
		for(@SuppressWarnings("unused") Boolean h: highlights.values())
			h = true;
	}
	
	protected Map highlights = new HashMap();

	/*******************************************************/
	
	protected IGraph graph;
	protected IGraphFormatter formatter;
	protected IGraphLayout2d layout;

	protected Coord2d labelScreenOffset;
	protected Coord3d labelSceneOffset;
	protected static float Z = 0;
	
	
	protected TextBitmapRenderer txt = new TextBitmapRenderer();
	//protected TextRenderer txtRenderer;


}
 

Ads help maintain this website.