package ui; import static com.jogamp.opengl.fixedfunc.GLMatrixFunc.GL_MODELVIEW; import static com.jogamp.opengl.fixedfunc.GLMatrixFunc.GL_PROJECTION; import java.nio.FloatBuffer; import java.util.ArrayList; import java.util.List; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ControlAdapter; import org.eclipse.swt.events.ControlEvent; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.events.MouseListener; import org.eclipse.swt.events.PaintEvent; import org.eclipse.swt.events.PaintListener; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.opengl.GLCanvas; import org.eclipse.swt.opengl.GLData; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; import com.jogamp.opengl.GL2; import com.jogamp.opengl.GLContext; import com.jogamp.opengl.GLDrawableFactory; import com.jogamp.opengl.GLProfile; import com.jogamp.opengl.glu.GLU; public class Draw { private static float cameraDistance = 40.0f; private static List list = new ArrayList(); public static void main(String[] args) { final Display display = new Display(); Shell shell = new Shell(display); shell.setLayout(new FillLayout()); Composite comp = new Composite(shell, SWT.NONE); comp.setLayout(new FillLayout()); GLData data = new GLData(); data.doubleBuffer = true; final GLCanvas canvas = new GLCanvas(comp, SWT.NO_BACKGROUND, data); canvas.setCurrent(); GLProfile glprofile = GLProfile.getDefault(); final GLContext context = GLDrawableFactory.getFactory(glprofile).createExternalGLContext(); GL2 gl2 = context.getGL().getGL2(); canvas.addControlListener(new ControlAdapter() { @Override public void controlResized(ControlEvent e) { Rectangle rect = canvas.getClientArea(); canvas.setCurrent(); context.makeCurrent(); reshape(gl2, rect.width, rect.height); context.release(); } }); context.makeCurrent(); init(gl2); context.release(); canvas.addPaintListener(new PaintListener() { @Override public void paintControl(PaintEvent e) { canvas.setCurrent(); context.makeCurrent(); display(gl2); canvas.swapBuffers(); context.release(); } }); canvas.addMouseListener(new MouseListener() { @Override public void mouseDoubleClick(MouseEvent e) { } @Override public void mouseDown(MouseEvent e) { if(e.button == 1) { int[] viewport = new int[4]; gl2.glGetIntegerv(GL2.GL_VIEWPORT, viewport, 0); float[] winZ = new float[1]; float[] color = new float[3]; gl2.glReadPixels(e.x, viewport[3] - e.y, 1, 1, GL2.GL_DEPTH_COMPONENT, GL2.GL_FLOAT, FloatBuffer.wrap(winZ)); gl2.glReadPixels(e.x, viewport[3] - e.y, 1, 1, GL2.GL_RGB, GL2.GL_FLOAT, FloatBuffer.wrap(color)); System.out.println(winZ[0]); System.out.println(color[0] + "," + color[1] + "," + color[2]); for(int i = 0; i < list.size(); i++) { if(list.get(i).m_colorID.equals(color)) { System.out.println("select " + list.get(i).getName()); break; } } } } @Override public void mouseUp(MouseEvent e) { } }); shell.setText("SWT/Cylinder Example"); shell.setSize(640, 480); shell.open(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) display.sleep(); } display.dispose(); } static void reshape(GL2 gl2, int width, int height) { System.out.println("reshape..."); if (height == 0) { height = 1; } gl2.glViewport(0, 0, width, height); GLU glu = new GLU(); gl2.glMatrixMode(GL_PROJECTION); gl2.glLoadIdentity(); glu.gluPerspective(60.0f, (float) width / (float) height, 1.0f, 100.0f); gl2.glMatrixMode(GL_MODELVIEW); } static void init(GL2 gl2) { System.out.println("init..."); gl2.glShadeModel(GL2.GL_SMOOTH); gl2.glClearColor(1.0f, 1.0f, 1.0f, 0.0f); gl2.glClearDepth(1.0f); gl2.glEnable(GL2.GL_DEPTH_TEST); gl2.glDepthFunc(GL2.GL_LEQUAL); gl2.glHint(GL2.GL_PERSPECTIVE_CORRECTION_HINT, GL2.GL_NICEST); } static void display(GL2 gl2) { System.out.println("display..."); gl2.glClear(GL2.GL_COLOR_BUFFER_BIT | GL2.GL_DEPTH_BUFFER_BIT); float[] triangle_1_position = {0, -4, -cameraDistance}; SceneObject triangle_1 = new SceneObject(triangle_1_position, "triangle_1", gl2); triangle_1.m_colorID = new int[]{255, 0, 0}; triangle_1.picking(); float[] triangle_2_position = {0, -8, -cameraDistance}; SceneObject triangle_2 = new SceneObject(triangle_2_position, "triangle_2", gl2); triangle_2.m_colorID = new int[]{0, 255, 0}; triangle_2.picking(); list.add(triangle_1); list.add(triangle_2); } }