Java/SWT JFace Eclipse/OpenGL

Материал из Java эксперт
Перейти к: навигация, поиск

draw a rectangle using the org.eclipse.opengl OpenGL binding

   <source lang="java">

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

* Copyright (c) 2000, 2005 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
*     Sebastian Davids - initial implementation
*     IBM Corporation
*******************************************************************************/

package org.eclipse.swt.snippets; /*

* SWT OpenGL snippet: draw a square
* 
* This snippet requires the experimental org.eclipse.swt.opengl plugin, which
* is not included in swt by default.  For information on this plugin see
* http://www.eclipse.org/swt/opengl/opengl.html  
* 
* For a list of all SWT example snippets see
* http://www.eclipse.org/swt/snippets/
* 
* @since 3.2
*/

import org.eclipse.opengl.*; import org.eclipse.swt.SWT; import org.eclipse.swt.events.*; import org.eclipse.swt.graphics.*; import org.eclipse.swt.layout.*; import org.eclipse.swt.opengl.*; import org.eclipse.swt.widgets.*; public class Snippet174 { public static void main(String[] args) {

   Display display = new Display();
   Shell shell = new Shell(display);
   shell.setText("OpenGL in SWT");
   shell.setLayout(new FillLayout());
   GLData data = new GLData();
   data.doubleBuffer = true;
   final GLCanvas canvas = new GLCanvas(shell, SWT.NO_BACKGROUND, data);
   canvas.addControlListener(new ControlAdapter() {
       public void controlResized(ControlEvent e) {
           resize(canvas);
       }
   });
   init(canvas);
   new Runnable() {
       public void run() {
           if (canvas.isDisposed()) return;
           render();
           canvas.swapBuffers();
           canvas.getDisplay().timerExec(50, this);
       }
   }.run();
   shell.open();
   while (!shell.isDisposed()) {
       if (!display.readAndDispatch()) display.sleep();
   }
   display.dispose();

} static void init(GLCanvas canvas) {

   canvas.setCurrent();
   resize(canvas);
   GL.glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
   GL.glColor3f(0.0f, 0.0f, 0.0f);
   GL.glClearDepth(1.0f);
   GL.glEnable(GL.GL_DEPTH_TEST);
   GL.glHint(GL.GL_PERSPECTIVE_CORRECTION_HINT, GL.GL_NICEST);

} static void render() {

   GL.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
   GL.glLoadIdentity();
   GL.glTranslatef(0.0f, 0.0f, -6.0f);
   GL.glBegin(GL.GL_QUADS);
   GL.glVertex3f(-1.0f, 1.0f, 0.0f);
   GL.glVertex3f(1.0f, 1.0f, 0.0f);
   GL.glVertex3f(1.0f, -1.0f, 0.0f);
   GL.glVertex3f(-1.0f, -1.0f, 0.0f);
   GL.glEnd();

} static void resize(GLCanvas canvas) {

   canvas.setCurrent();
   Rectangle rect = canvas.getClientArea();
   int width = rect.width;
   int height = Math.max(rect.height, 1);
   GL.glViewport(0, 0, width, height);
   GL.glMatrixMode(GL.GL_PROJECTION);
   GL.glLoadIdentity();
   float aspect = (float) width / (float) height;
   GLU.gluPerspective(45.0f, aspect, 0.5f, 400.0f);
   GL.glMatrixMode(GL.GL_MODELVIEW);
   GL.glLoadIdentity();

} }

      </source>
   
  
 
  



draw a rotating torus using the JOGL OpenGL binding

   <source lang="java">

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

* Copyright (c) 2000, 2005 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
*     IBM Corporation - initial API and implementation
*******************************************************************************/

package org.eclipse.swt.snippets; /*

* SWT OpenGL snippet: use JOGL to draw to an SWT GLCanvas
*
* For a list of all SWT example snippets see
* http://www.eclipse.org/swt/snippets/
* 
* @since 3.2
*/

import org.eclipse.swt.*; import org.eclipse.swt.layout.*; import org.eclipse.swt.widgets.*; import org.eclipse.swt.graphics.*; import org.eclipse.swt.opengl.GLCanvas; import org.eclipse.swt.opengl.GLData; import javax.media.opengl.GL; import javax.media.opengl.GLContext; import javax.media.opengl.GLDrawableFactory; import javax.media.opengl.glu.GLU; public class Snippet209 {

 static void drawTorus(GL gl, float r, float R, int nsides, int rings) {
   float ringDelta = 2.0f * (float) Math.PI / rings;
   float sideDelta = 2.0f * (float) Math.PI / nsides;
   float theta = 0.0f, cosTheta = 1.0f, sinTheta = 0.0f;
   for (int i = rings - 1; i >= 0; i--) {
     float theta1 = theta + ringDelta;
     float cosTheta1 = (float) Math.cos(theta1);
     float sinTheta1 = (float) Math.sin(theta1);
     gl.glBegin(GL.GL_QUAD_STRIP);
     float phi = 0.0f;
     for (int j = nsides; j >= 0; j--) {
       phi += sideDelta;
       float cosPhi = (float) Math.cos(phi);
       float sinPhi = (float) Math.sin(phi);
       float dist = R + r * cosPhi;
       gl.glNormal3f(cosTheta1 * cosPhi, -sinTheta1 * cosPhi, sinPhi);
       gl.glVertex3f(cosTheta1 * dist, -sinTheta1 * dist, r * sinPhi);
       gl.glNormal3f(cosTheta * cosPhi, -sinTheta * cosPhi, sinPhi);
       gl.glVertex3f(cosTheta * dist, -sinTheta * dist, r * sinPhi);
     }
     gl.glEnd();
     theta = theta1;
     cosTheta = cosTheta1;
     sinTheta = sinTheta1;
   }
 }
 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.NONE, data);
   canvas.setCurrent();
   final GLContext context = GLDrawableFactory.getFactory().createExternalGLContext();
   canvas.addListener(SWT.Resize, new Listener() {
     public void handleEvent(Event event) {
       Rectangle bounds = canvas.getBounds();
       float fAspect = (float) bounds.width / (float) bounds.height;
       canvas.setCurrent();
       context.makeCurrent();
       GL gl = context.getGL ();
       gl.glViewport(0, 0, bounds.width, bounds.height);
       gl.glMatrixMode(GL.GL_PROJECTION);
       gl.glLoadIdentity();
       GLU glu = new GLU();
       glu.gluPerspective(45.0f, fAspect, 0.5f, 400.0f);
       gl.glMatrixMode(GL.GL_MODELVIEW);
       gl.glLoadIdentity();
       context.release();
     }
   });
   context.makeCurrent();
   GL gl = context.getGL ();
   gl.glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
   gl.glColor3f(1.0f, 0.0f, 0.0f);
   gl.glHint(GL.GL_PERSPECTIVE_CORRECTION_HINT, GL.GL_NICEST);
   gl.glClearDepth(1.0);
   gl.glLineWidth(2);
   gl.glEnable(GL.GL_DEPTH_TEST);
   context.release();
   shell.setText("SWT/JOGL Example");
   shell.setSize(640, 480);
   shell.open();
   display.asyncExec(new Runnable() {
     int rot = 0;
     public void run() {
       if (!canvas.isDisposed()) {
         canvas.setCurrent();
         context.makeCurrent();
         GL gl = context.getGL ();
         gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
         gl.glClearColor(.3f, .5f, .8f, 1.0f);
         gl.glLoadIdentity();
         gl.glTranslatef(0.0f, 0.0f, -10.0f);
         float frot = rot;
         gl.glRotatef(0.15f * rot, 2.0f * frot, 10.0f * frot, 1.0f);
         gl.glRotatef(0.3f * rot, 3.0f * frot, 1.0f * frot, 1.0f);
         rot++;
         gl.glPolygonMode(GL.GL_FRONT_AND_BACK, GL.GL_LINE);
         gl.glColor3f(0.9f, 0.9f, 0.9f);
         drawTorus(gl, 1, 1.9f + ((float) Math.sin((0.004f * frot))), 15, 15);
         canvas.swapBuffers();
         context.release();
         display.asyncExec(this);
       }
     }
   });
   while (!shell.isDisposed()) {
     if (!display.readAndDispatch())
       display.sleep();
   }
   display.dispose();
 }

}

      </source>
   
  
 
  



draw a rotating torus using the LWJGL OpenGL binding

   <source lang="java">

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

* Copyright (c) 2000, 2005 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
*     IBM Corporation - initial API and implementation
*******************************************************************************/

package org.eclipse.swt.snippets; /*

* SWT OpenGL snippet: use LWJGL to draw to an SWT GLCanvas
*
* For a list of all SWT example snippets see
* http://www.eclipse.org/swt/snippets/
* 
* @since 3.2
*/

import org.eclipse.swt.*; import org.eclipse.swt.layout.*; import org.eclipse.swt.widgets.*; import org.eclipse.swt.graphics.*; import org.eclipse.swt.opengl.GLCanvas; import org.eclipse.swt.opengl.GLData; import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GLContext; import org.lwjgl.opengl.glu.GLU; import org.lwjgl.LWJGLException; public class Snippet195 {

 static void drawTorus(float r, float R, int nsides, int rings) {
   float ringDelta = 2.0f * (float) Math.PI / rings;
   float sideDelta = 2.0f * (float) Math.PI / nsides;
   float theta = 0.0f, cosTheta = 1.0f, sinTheta = 0.0f;
   for (int i = rings - 1; i >= 0; i--) {
     float theta1 = theta + ringDelta;
     float cosTheta1 = (float) Math.cos(theta1);
     float sinTheta1 = (float) Math.sin(theta1);
     GL11.glBegin(GL11.GL_QUAD_STRIP);
     float phi = 0.0f;
     for (int j = nsides; j >= 0; j--) {
       phi += sideDelta;
       float cosPhi = (float) Math.cos(phi);
       float sinPhi = (float) Math.sin(phi);
       float dist = R + r * cosPhi;
       GL11.glNormal3f(cosTheta1 * cosPhi, -sinTheta1 * cosPhi, sinPhi);
       GL11.glVertex3f(cosTheta1 * dist, -sinTheta1 * dist, r * sinPhi);
       GL11.glNormal3f(cosTheta * cosPhi, -sinTheta * cosPhi, sinPhi);
       GL11.glVertex3f(cosTheta * dist, -sinTheta * dist, r * sinPhi);
     }
     GL11.glEnd();
     theta = theta1;
     cosTheta = cosTheta1;
     sinTheta = sinTheta1;
   }
 }
 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.NONE, data);
   canvas.setCurrent();
   try {
     GLContext.useContext(canvas);
   } catch(LWJGLException e) { e.printStackTrace(); }
   canvas.addListener(SWT.Resize, new Listener() {
     public void handleEvent(Event event) {
       Rectangle bounds = canvas.getBounds();
       float fAspect = (float) bounds.width / (float) bounds.height;
       canvas.setCurrent();
       try {
         GLContext.useContext(canvas);
       } catch(LWJGLException e) { e.printStackTrace(); }
       GL11.glViewport(0, 0, bounds.width, bounds.height);
       GL11.glMatrixMode(GL11.GL_PROJECTION);
       GL11.glLoadIdentity();
       GLU.gluPerspective(45.0f, fAspect, 0.5f, 400.0f);
       GL11.glMatrixMode(GL11.GL_MODELVIEW);
       GL11.glLoadIdentity();
     }
   });
   GL11.glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
   GL11.glColor3f(1.0f, 0.0f, 0.0f);
   GL11.glHint(GL11.GL_PERSPECTIVE_CORRECTION_HINT, GL11.GL_NICEST);
   GL11.glClearDepth(1.0);
   GL11.glLineWidth(2);
   GL11.glEnable(GL11.GL_DEPTH_TEST);
   shell.setText("SWT/LWJGL Example");
   shell.setSize(640, 480);
   shell.open();
   display.asyncExec(new Runnable() {
     int rot = 0;
     public void run() {
       if (!canvas.isDisposed()) {
         canvas.setCurrent();
         try {
           GLContext.useContext(canvas);
         } catch(LWJGLException e) { e.printStackTrace(); }
         GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);
         GL11.glClearColor(.3f, .5f, .8f, 1.0f);
         GL11.glLoadIdentity();
         GL11.glTranslatef(0.0f, 0.0f, -10.0f);
         float frot = rot;
         GL11.glRotatef(0.15f * rot, 2.0f * frot, 10.0f * frot, 1.0f);
         GL11.glRotatef(0.3f * rot, 3.0f * frot, 1.0f * frot, 1.0f);
         rot++;
         GL11.glPolygonMode(GL11.GL_FRONT_AND_BACK, GL11.GL_LINE);
         GL11.glColor3f(0.9f, 0.9f, 0.9f);
         drawTorus(1, 1.9f + ((float) Math.sin((0.004f * frot))), 15, 15);
         canvas.swapBuffers();
         display.asyncExec(this);
       }
     }
   });
   while (!shell.isDisposed()) {
     if (!display.readAndDispatch())
       display.sleep();
   }
   display.dispose();
 }

}

      </source>