/*
* Project Info: http://jcae.sourceforge.net
*
* This program is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation, Inc.,
* 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
*
* (C) Copyright 2008, by EADS France
*/
package org.jcae.viewer3d.test;
import java.awt.Color;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Map;
import javax.media.j3d.Appearance;
import javax.media.j3d.ColoringAttributes;
import javax.media.j3d.GeometryArray;
import javax.media.j3d.Node;
import javax.media.j3d.PointArray;
import javax.media.j3d.PointAttributes;
import javax.media.j3d.Shape3D;
import javax.media.j3d.Transform3D;
import javax.swing.JFrame;
import javax.swing.WindowConstants;
import javax.vecmath.Color3f;
import javax.vecmath.Point3d;
import javax.vecmath.Vector4d;
import org.jcae.viewer3d.DomainProvider;
import org.jcae.viewer3d.PickViewable;
import org.jcae.viewer3d.View;
import org.jcae.viewer3d.ViewBehavior;
import org.jcae.viewer3d.Viewable;
import org.jcae.viewer3d.ViewableAdaptor;
/**
*
* @author ibarz
*/
public class MatrixView implements KeyListener
{
private static class ViewMatrix extends View
{
ViewMatrix(JFrame frame)
{
super(frame);
}
public Viewable drawPoint(final double x, final double y, final double z)
{
Viewable toReturn = new ViewableAdaptor()
{
//TODO so many empty methods probably means that ViewableAdaptor sucks
public void domainsChangedPerform(int[] domainId)
{
}
public DomainProvider getDomainProvider()
{
return null;
}
public void setDomainVisible(Map<Integer, Boolean> map)
{
}
public void pick(PickViewable result)
{
}
public void unselectAll()
{
}
public Node getJ3DNode()
{
ColoringAttributes ca = new ColoringAttributes();
ca.setColor(new Color3f(Color.YELLOW));
PointAttributes pat = new PointAttributes(5f, false);
PointArray pa = new PointArray(1, GeometryArray.COORDINATES);
pa.setCoordinates(0, new double[]
{
x, y, z
});
Appearance a = new Appearance();
a.setPointAttributes(pat);
a.setColoringAttributes(ca);
Shape3D s3d = new Shape3D(pa, a);
return s3d;
}
};
add(toReturn);
return toReturn;
}
}
private static ViewMatrix view;
public static void main(String[] args)
{
MatrixView test = new MatrixView();
JFrame frame = new JFrame();
frame.setSize(800, 600);
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
view = new MatrixView.ViewMatrix(frame);
//Fit the view to the geometry
view.setOriginAxisVisible(true);
view.drawPoint(0, 0, 0);
view.drawPoint(2, 2, 2);
view.addKeyListener(test);
view.setMouseMode(ViewBehavior.RECTANGLE_MODE);
//view.getView().setCompatibilityModeEnable(true);
frame.getContentPane().add(view);
/* final ViewableCAD fcad=
new ViewableCAD(new OCCProvider("/home/ibarz/models/axe.brep"));
view.add(fcad);*/
view.fitAll();
//view.setFrontClipDistance(1.);
frame.setVisible(true);
}
public void keyTyped(KeyEvent e)
{
}
public void keyPressed(KeyEvent e)
{
}
public void testProjection()
{
Transform3D leftProjection = new Transform3D();
Transform3D rightProjection = new Transform3D();
double n = view.getFrontClipDistance(), f = view.getBackClipDistance();
double a = (f*n)/(f-n);
double b = (f+n)/(2*(f-n)) + .5;
System.out.println("n : " + n);
System.out.println("f : " + f);
view.getVworldProjection(leftProjection, rightProjection);
System.out.println("left : " + leftProjection);
System.out.println("right : " + rightProjection);
Vector4d vec = new Vector4d(0., 0., 0., 1.);
leftProjection.transform(vec);
System.out.println("vec : " + vec);
vec.scale(1. / vec.getW());
System.out.println("vec scaled : " + vec);
Point3d point = new Point3d();
view.normalizedEyeCoordinateToViewportCoordinate(vec, point);
float[] zbuffer = view.getDepthBuffer((int)point.x, (int)point.y, 1, 1);
System.out.println("point : " + point);
System.out.println("ZBUFFER : " + zbuffer[0]);
System.out.println("Z : " + point.z);
double ZEyeBuffer = a / (zbuffer[0] - b);
double ZEyeCenter = a / (point.z - b);
System.out.println("ZBUFFER : " + ZEyeBuffer);
System.out.println("Z : " + ZEyeCenter);
}
public void keyReleased(KeyEvent e)
{
switch (e.getKeyCode())
{
case KeyEvent.VK_A:
System.out.println("PWET !");
testProjection();
break;
case KeyEvent.VK_R:
view.setMouseMode(ViewBehavior.RECTANGLE_MODE);
break;
case KeyEvent.VK_T:
view.setMouseMode(ViewBehavior.DEFAULT_MODE);
break;
}
}
}