package org.jzy3d.plot3d.primitives.enlightables;

import java.util.ArrayList;
import java.util.List;

import org.jzy3d.colors.Color;
import org.jzy3d.colors.ColorMapper;
import org.jzy3d.events.DrawableChangedEvent;
import org.jzy3d.maths.BoundingBox3d;
import org.jzy3d.maths.Coord3d;
import org.jzy3d.maths.Normal;
import org.jzy3d.maths.Utils;
import org.jzy3d.plot3d.primitives.Point;
import org.jzy3d.plot3d.primitives.Polygon;
import org.jzy3d.plot3d.rendering.compat.GLES2CompatUtils;
import org.jzy3d.plot3d.rendering.view.Camera;
import org.jzy3d.plot3d.transform.Transform;

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

public class EnlightablePolygon extends AbstractEnlightable {

	/**
	 * Initializes an empty {@link Polygon} with face status defaulting to true,
	 * and wireframe status defaulting to false.
	 */
	public EnlightablePolygon() {
		super();
		points = new ArrayList(4); // use Vector for synchro, or
											// ArrayList for unsyncro.
		bbox = new BoundingBox3d();
		center = new Coord3d();
	}

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

	@Override
    public void draw(GL gl, GLU glu, Camera cam) {
		doTransform(gl, glu, cam);

		applyMaterial(gl); // TODO: shall we avoid calling this @ each draw?
		Coord3d norm = Normal.compute(points.get(0).xyz, points.get(1).xyz,
				points.get(2).xyz);

		// Draw content of polygon

		if (gl.isGL2()) {

			if (facestatus) {
				gl.getGL2().glPolygonMode(GL.GL_FRONT_AND_BACK, GL2GL3.GL_FILL);
				if (wfstatus) {
					gl.getGL2().glEnable(GL.GL_POLYGON_OFFSET_FILL);
					gl.getGL2().glPolygonOffset(1.0f, 1.0f);
				}

				gl.getGL2().glBegin(GL2.GL_POLYGON);
				for (Point p : points) {
					if (mapper != null) {
						Color c = mapper.getColor(p.xyz); // TODO: should store
															// result in the
															// point color
						gl.getGL2().glColor4f(c.r, c.g, c.b, c.a);
					} else
						gl.getGL2().glColor4f(p.rgb.r, p.rgb.g, p.rgb.b,
								p.rgb.a);
					gl.getGL2().glVertex3f(p.xyz.x, p.xyz.y, p.xyz.z);
					gl.getGL2().glNormal3f(norm.x, norm.y, norm.z);
				}
				gl.getGL2().glEnd();
				if (wfstatus)
					gl.glDisable(GL.GL_POLYGON_OFFSET_FILL);
			}

			// Draw edge of polygon
			if (wfstatus) {
				gl.getGL2().glPolygonMode(GL.GL_FRONT_AND_BACK, GL2GL3.GL_LINE);

				gl.glEnable(GL.GL_POLYGON_OFFSET_FILL);
				gl.glPolygonOffset(1.0f, 1.0f);

				gl.getGL2().glColor4f(wfcolor.r, wfcolor.g, wfcolor.b, 1);// wfcolor.a);
				gl.glLineWidth(wfwidth);

				gl.getGL2().glBegin(GL2.GL_POLYGON);
				for (Point p : points) {
					gl.getGL2().glVertex3f(p.xyz.x, p.xyz.y, p.xyz.z);
					gl.getGL2().glNormal3f(norm.x, norm.y, norm.z);
				}
				gl.getGL2().glEnd();
				gl.glDisable(GL.GL_POLYGON_OFFSET_FILL);
			}
		} else {

			if (facestatus) {
				GLES2CompatUtils.glPolygonMode(GL.GL_FRONT_AND_BACK,
						GL2GL3.GL_FILL);
				if (wfstatus) {
					gl.glEnable(GL.GL_POLYGON_OFFSET_FILL);
					gl.glPolygonOffset(1.0f, 1.0f);
				}

				GLES2CompatUtils.glBegin(GL2.GL_POLYGON);
				for (Point p : points) {
					if (mapper != null) {
						Color c = mapper.getColor(p.xyz); // TODO: should store
															// result in the
															// point color
						GLES2CompatUtils.glColor4f(c.r, c.g, c.b, c.a);
					} else
						GLES2CompatUtils.glColor4f(p.rgb.r, p.rgb.g,
								p.rgb.b, p.rgb.a);
					GLES2CompatUtils.glVertex3f(p.xyz.x, p.xyz.y, p.xyz.z);
					GLES2CompatUtils.glNormal3f(norm.x, norm.y, norm.z);
				}
				GLES2CompatUtils.glEnd();
				if (wfstatus)
					gl.glDisable(GL.GL_POLYGON_OFFSET_FILL);
			}

			// Draw edge of polygon
			if (wfstatus) {
				GLES2CompatUtils.glPolygonMode(GL.GL_FRONT_AND_BACK,
						GL2GL3.GL_LINE);

				gl.glEnable(GL.GL_POLYGON_OFFSET_FILL);
				gl.glPolygonOffset(1.0f, 1.0f);

				GLES2CompatUtils.glColor4f(wfcolor.r, wfcolor.g, wfcolor.b,
						1);// wfcolor.a);
				gl.glLineWidth(wfwidth);

				GLES2CompatUtils.glBegin(GL2.GL_POLYGON);
				for (Point p : points) {
					GLES2CompatUtils.glVertex3f(p.xyz.x, p.xyz.y, p.xyz.z);
					GLES2CompatUtils.glNormal3f(norm.x, norm.y, norm.z);
				}
				GLES2CompatUtils.glEnd();
				gl.glDisable(GL.GL_POLYGON_OFFSET_FILL);
			}
		}

		/*
		 * // Drawbarycenter Point b = new Point(getBarycentre(), Color.BLUE);
		 * b.setWidth(5); b.draw(gl,glu,cam);
		 */

	}

	@Override
    public void applyGeometryTransform(Transform transform) {
		for (Point p : points) {
			p.xyz = transform.compute(p.xyz);
		}
		updateBounds();
	}

	@Override
    public void updateBounds() {
		bbox.reset();
		bbox.add(points);
		// recompute center
		updateCenter();
	}

	protected void updateCenter() {
		center = new Coord3d();
		for (Point p : points)
			center = center.add(p.xyz);
		center = center.div(points.size());
	}

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

	/** Add a point to the polygon. */
	public void add(Point point) {
		if (point.rgb.a < 1f)
			hasAlpha = true;
		points.add(point);
		bbox.add(point);

		updateCenter();
	}

	// --- experimental code ------
	public boolean hasAlpha() {
		return hasAlpha;
	}

	private boolean hasAlpha = false;

	// ----------------------------

	@Override
	public Coord3d getBarycentre() {
		return center;
	}

	/**
	 * Retrieve a point from the {@link Polygon}.
	 * 
	 * @return a Point3d.
	 */
	public Point get(int p) {
		return points.get(p);
	}

	/**
	 * Indicates the number of points in this {@link Polygon}.
	 * 
	 * @return the number of points
	 */
	public int size() {
		return points.size();
	}

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

	public void setColorMapper(ColorMapper mapper) {
		this.mapper = mapper;

		fireDrawableChanged(new DrawableChangedEvent(this,
				DrawableChangedEvent.FIELD_COLOR));
	}

	public ColorMapper getColorMapper() {
		return mapper;
	}

	/*
	 * public void setColors(ColorMapper mapper){ for(Point p: points)
	 * p.setColor(mapper.getColor(p.xyz)); }
	 */

	public void setColor(Color color) {
		this.color = color;

		for (Point p : points)
			p.setColor(color);

		fireDrawableChanged(new DrawableChangedEvent(this,
				DrawableChangedEvent.FIELD_COLOR));
	}

	public Color getColor() {
		return color;
	}

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

	@Override
    public String toString(int depth) {
		return (Utils.blanks(depth) + "(EnlightablePolygon) #points:" + points
				.size());
	}

	/**********************************************************************/
	protected ColorMapper mapper;
	protected List points;
	protected Color color;
	protected Coord3d center;
}

 

Ads help maintain this website.