/*
* Copyright (C) 2010-2014 - Andreas Maier
* CONRAD is developed as an Open Source project under the GNU General Public License (GPL).
*/
package edu.stanford.rsl.apps.gui.opengl;
import java.awt.Color;
import java.util.ArrayList;
import javax.media.opengl.GL;
import javax.media.opengl.GL4bc;
import javax.media.opengl.GLAutoDrawable;
import edu.stanford.rsl.conrad.geometry.shapes.simple.PointND;
import edu.stanford.rsl.conrad.utils.DoublePrecisionPointUtil;
public class PointCloudViewer extends OpenGLViewer {
/**
*
*/
private static final long serialVersionUID = -1481644355541714966L;
ArrayList<PointND> points = new ArrayList<PointND>();
ArrayList<Color> colors = null;
public PointCloudViewer(String title, ArrayList<PointND> points){
super(title);
this.setSize(640, 480);
PointND center = DoublePrecisionPointUtil.getGeometricCenter(points);
double max = 0;
for(PointND p: points){
PointND newP = new PointND(p.getAbstractVector().clone());
newP.getAbstractVector().subtract(center.getAbstractVector());
this.points.add(newP);
for (int i=0;i<3;i++){
if (Math.abs(newP.get(i)) > max){
max = Math.abs(newP.get(i));
}
}
}
for(PointND p: this.points){
p.getAbstractVector().divideBy(max);
}
}
public void display(GLAutoDrawable arg0) {
if (!initialized)
{
return;
}
GL4bc gl = (GL4bc) arg0.getGL();
gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
//float modelView[] = new float[16];
//gl.glMatrixMode(GL.GL_MODELVIEW);
//gl.glPushMatrix();
gl.glMatrixMode(GL4bc.GL_PROJECTION);
gl.glLoadIdentity();
gl.glFrustum( -1.5, 1.5, -1.5, 1.5, 5, 15 );
gl.glMatrixMode(GL4bc.GL_MODELVIEW);
gl.glLoadIdentity();
gl.glTranslated(0, 0, -10);
gl.glTranslatef(-translationX, -translationY, -translationZ);
gl.glRotatef(-rotationX, 1.0f, 0.0f, 0.0f);
gl.glRotatef(-(rotationY), 0.0f, 1.0f, 0.0f);
// Internal Coordinates we want to use for visualization: (0,0,0) to (1,1,1);
for (int i=0; i< points.size(); i++){
PointND p = points.get(i);
if (colors == null){
drawCube(gl, p, 0.005, 0, 1, 0);
} else {
Color col = colors.get(i);
drawCube(gl, p, 0.005, col.getRed()/256.0, col.getGreen()/256.0, col.getBlue()/256.0);
}
}
displayAdditionalThings(panel);
}
public void displayAdditionalThings(GLAutoDrawable arg0){
}
public void dispose(GLAutoDrawable arg0) {
}
public void init(GLAutoDrawable arg0) {
// Perform the default GL initialization
GL4bc gl = (GL4bc) arg0.getGL();
gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
gl.glShadeModel (GL4bc.GL_SMOOTH);
gl.glEnable(GL.GL_DEPTH_TEST);
if (initialized)
{
return;
}
initialized = true;
}
/**
* @return the points
*/
public ArrayList<PointND> getPoints() {
return points;
}
/**
* @param points the points to set
*/
public void setPoints(ArrayList<PointND> points) {
this.points = new ArrayList<PointND>();
PointND center = DoublePrecisionPointUtil.getGeometricCenter(points);
double max = 0;
for(PointND p: points){
PointND newP = new PointND(p.getAbstractVector().clone());
newP.getAbstractVector().subtract(center.getAbstractVector());
this.points.add(newP);
for (int i=0;i<3;i++){
if (Math.abs(newP.get(i)) > max){
max = Math.abs(newP.get(i));
}
}
}
for(PointND p: this.points){
p.getAbstractVector().divideBy(max);
}
}
/**
* @return the colors
*/
public ArrayList<Color> getColors() {
return colors;
}
/**
* @param colors the colors to set
*/
public void setColors(ArrayList<Color> colors) {
this.colors = colors;
}
}