diff options
author | Sven Gothel <[email protected]> | 2011-08-22 01:59:00 +0200 |
---|---|---|
committer | Sven Gothel <[email protected]> | 2011-08-22 01:59:00 +0200 |
commit | 6c346d98f04e2355210960fe9ffde47432f04d62 (patch) | |
tree | 938536365abee309d5acf9ada1ac75bc1a49e939 /src/newt | |
parent | 47b0d317df3c860b6cf3ea10196dfee82b3b3dc1 (diff) |
Misc Rename/Reloc; GLArrayData*/PMVMatrix enhancments; Test fixes/adds (GearsES1/ES2)
rename/reloc:
- javax.media.nativewindow.util:
DimensionReadOnly -> DimensionImmutable
PointReadOnly -> PointImmutable
RectangleReadOnly -> RectangleImmutable
unified 'immutable' name as used within jogamp already
- remove array handler from public API
com.jogamp.opengl.util.GL*ArrayHandler -> jogamp.opengl.util.GL*ArrayHandler
- GLArrayData: Clarify method names
getComponentNumber() -> getComponentCount()
getComponentSize() -> getComponentSizeInBytes()
getElementNumber() -> getElementCount()
getByteSize() -> getSizeInBytes()
- FixedFuncPipeline: Moved def. array names to GLPointerFuncUtil
enhancement:
- GLArrayDataServer: Add support for interleaved arrays/VBO
- GLArrayData*.createFixed(..) remove 'name' argument (non sense for fixed function)
- PMVMatrix:
- one nio buffer
- removed 'Pmv' multiplied matrix
- removed 2x2 cut down 'Mvi' normal matrix (use 4x4 Mvi)
-
tests:
- RedSquare -> RedSquareES1/RedSquareES2
- Gears ES1 fixed + ES2 added. Both work properly and share common Gears VBO construction
- Added TestMapBuffer01NEWT, testing glMapBuffer
Diffstat (limited to 'src/newt')
5 files changed, 18 insertions, 440 deletions
diff --git a/src/newt/classes/com/jogamp/newt/ScreenMode.java b/src/newt/classes/com/jogamp/newt/ScreenMode.java index 2a05d842e..414e2fb9c 100644 --- a/src/newt/classes/com/jogamp/newt/ScreenMode.java +++ b/src/newt/classes/com/jogamp/newt/ScreenMode.java @@ -28,7 +28,7 @@ package com.jogamp.newt; -import javax.media.nativewindow.util.DimensionReadOnly; +import javax.media.nativewindow.util.DimensionImmutable; import com.jogamp.newt.util.MonitorMode; @@ -206,7 +206,7 @@ public class ScreenMode implements Cloneable { } private final int getRotatedWH(boolean width) { - final DimensionReadOnly d = getMonitorMode().getSurfaceSize().getResolution(); + final DimensionImmutable d = getMonitorMode().getSurfaceSize().getResolution(); final boolean swap = ScreenMode.ROTATE_90 == rotation || ScreenMode.ROTATE_270 == rotation ; if ( ( width && swap ) || ( !width && !swap ) ) { return d.getHeight(); diff --git a/src/newt/classes/com/jogamp/newt/util/MonitorMode.java b/src/newt/classes/com/jogamp/newt/util/MonitorMode.java index fb2d0ceb5..69dc584d3 100644 --- a/src/newt/classes/com/jogamp/newt/util/MonitorMode.java +++ b/src/newt/classes/com/jogamp/newt/util/MonitorMode.java @@ -33,16 +33,16 @@ import javax.media.nativewindow.util.*; /** Immutable MonitorMode Class, consisting of it's read only components:<br> * <ul> * <li>{@link javax.media.nativewindow.util.SurfaceSize} surface memory size</li> - * <li>{@link javax.media.nativewindow.util.DimensionReadOnly} size in [mm]</li> + * <li>{@link javax.media.nativewindow.util.DimensionImmutable} size in [mm]</li> * <li><code>refresh rate</code></li> * </ul> */ public class MonitorMode implements Cloneable { SurfaceSize surfaceSize; - DimensionReadOnly screenSizeMM; // in [mm] + DimensionImmutable screenSizeMM; // in [mm] int refreshRate; - public MonitorMode(SurfaceSize surfaceSize, DimensionReadOnly screenSizeMM, int refreshRate) { + public MonitorMode(SurfaceSize surfaceSize, DimensionImmutable screenSizeMM, int refreshRate) { if(null==surfaceSize || refreshRate<=0) { throw new IllegalArgumentException("surfaceSize must be set and refreshRate greater 0"); } @@ -63,7 +63,7 @@ public class MonitorMode implements Cloneable { return surfaceSize; } - public final DimensionReadOnly getScreenSizeMM() { + public final DimensionImmutable getScreenSizeMM() { return screenSizeMM; } diff --git a/src/newt/classes/com/jogamp/newt/util/ScreenModeUtil.java b/src/newt/classes/com/jogamp/newt/util/ScreenModeUtil.java index 9c4993f1d..6986e3657 100644 --- a/src/newt/classes/com/jogamp/newt/util/ScreenModeUtil.java +++ b/src/newt/classes/com/jogamp/newt/util/ScreenModeUtil.java @@ -33,7 +33,7 @@ import com.jogamp.newt.ScreenMode; import java.util.ArrayList; import java.util.List; import javax.media.nativewindow.util.Dimension; -import javax.media.nativewindow.util.DimensionReadOnly; +import javax.media.nativewindow.util.DimensionImmutable; import javax.media.nativewindow.util.SurfaceSize; /** @@ -84,7 +84,7 @@ public class ScreenModeUtil { * @param resolution * @return modes with nearest resolution, or matching ones */ - public static List/*<ScreenMode>*/ filterByResolution(List/*<ScreenMode>*/ screenModes, DimensionReadOnly resolution) { + public static List/*<ScreenMode>*/ filterByResolution(List/*<ScreenMode>*/ screenModes, DimensionImmutable resolution) { if(null==screenModes || screenModes.size()==0) { return null; } @@ -94,7 +94,7 @@ public class ScreenModeUtil { for (int i=0; null!=screenModes && i<screenModes.size(); i++) { ScreenMode sm = (ScreenMode)screenModes.get(i); - DimensionReadOnly res = sm.getMonitorMode().getSurfaceSize().getResolution(); + DimensionImmutable res = sm.getMonitorMode().getSurfaceSize().getResolution(); int dsq = Math.abs(resolution_sq - res.getHeight()*res.getWidth()); if(dsq<sm_dsq) { sm_dsq = dsq; @@ -216,19 +216,19 @@ public class ScreenModeUtil { } /** WARNING: must be synchronized with ScreenMode.h, native implementation */ - public static DimensionReadOnly streamInResolution(int[] resolutionProperties, int offset) { + public static DimensionImmutable streamInResolution(int[] resolutionProperties, int offset) { Dimension resolution = new Dimension(resolutionProperties[offset++], resolutionProperties[offset++]); return resolution; } /** WARNING: must be synchronized with ScreenMode.h, native implementation */ - public static SurfaceSize streamInSurfaceSize(DimensionReadOnly resolution, int[] sizeProperties, int offset) { + public static SurfaceSize streamInSurfaceSize(DimensionImmutable resolution, int[] sizeProperties, int offset) { SurfaceSize surfaceSize = new SurfaceSize(resolution, sizeProperties[offset++]); return surfaceSize; } /** WARNING: must be synchronized with ScreenMode.h, native implementation */ - public static MonitorMode streamInMonitorMode(SurfaceSize surfaceSize, DimensionReadOnly screenSizeMM, int[] monitorProperties, int offset) { + public static MonitorMode streamInMonitorMode(SurfaceSize surfaceSize, DimensionImmutable screenSizeMM, int[] monitorProperties, int offset) { int refreshRate = monitorProperties[offset++]; return new MonitorMode(surfaceSize, screenSizeMM, refreshRate); } @@ -288,10 +288,10 @@ public class ScreenModeUtil { throw new RuntimeException("properties array too short, should be >= "+NUM_SCREEN_MODE_PROPERTIES_ALL+", is "+(modeProperties.length-offset)); } offset++; - DimensionReadOnly resolution = ScreenModeUtil.streamInResolution(modeProperties, offset); + DimensionImmutable resolution = ScreenModeUtil.streamInResolution(modeProperties, offset); offset += ScreenModeUtil.NUM_RESOLUTION_PROPERTIES; if(null!=resolutionPool) { - resolution = (DimensionReadOnly) resolutionPool.getOrAdd(resolution); + resolution = (DimensionImmutable) resolutionPool.getOrAdd(resolution); } SurfaceSize surfaceSize = ScreenModeUtil.streamInSurfaceSize(resolution, modeProperties, offset); @@ -300,10 +300,10 @@ public class ScreenModeUtil { surfaceSize = (SurfaceSize) surfaceSizePool.getOrAdd(surfaceSize); } - DimensionReadOnly screenSizeMM = ScreenModeUtil.streamInResolution(modeProperties, offset); + DimensionImmutable screenSizeMM = ScreenModeUtil.streamInResolution(modeProperties, offset); offset += ScreenModeUtil.NUM_RESOLUTION_PROPERTIES; if(null!=screenSizeMMPool) { - screenSizeMM = (DimensionReadOnly) screenSizeMMPool.getOrAdd(screenSizeMM); + screenSizeMM = (DimensionImmutable) screenSizeMMPool.getOrAdd(screenSizeMM); } MonitorMode monitorMode = ScreenModeUtil.streamInMonitorMode(surfaceSize, screenSizeMM, modeProperties, offset); diff --git a/src/newt/classes/jogamp/newt/WindowImpl.java b/src/newt/classes/jogamp/newt/WindowImpl.java index e03c4553e..54a8c2bb8 100644 --- a/src/newt/classes/jogamp/newt/WindowImpl.java +++ b/src/newt/classes/jogamp/newt/WindowImpl.java @@ -64,7 +64,7 @@ import javax.media.nativewindow.NativeWindow; import javax.media.nativewindow.NativeWindowException; import javax.media.nativewindow.NativeWindowFactory; import javax.media.nativewindow.SurfaceUpdatedListener; -import javax.media.nativewindow.util.DimensionReadOnly; +import javax.media.nativewindow.util.DimensionImmutable; import javax.media.nativewindow.util.Insets; import javax.media.nativewindow.util.Point; import javax.media.nativewindow.util.Rectangle; @@ -1527,7 +1527,7 @@ public abstract class WindowImpl implements Window, NEWTEventConsumer } if(success) { - DimensionReadOnly screenSize = sm.getMonitorMode().getSurfaceSize().getResolution(); + DimensionImmutable screenSize = sm.getMonitorMode().getSurfaceSize().getResolution(); if ( getHeight() > screenSize.getHeight() || getWidth() > screenSize.getWidth() ) { setSize(screenSize.getWidth(), screenSize.getHeight()); diff --git a/src/newt/classes/jogamp/newt/driver/android/test/GearsGL2ES1.java b/src/newt/classes/jogamp/newt/driver/android/test/GearsGL2ES1.java deleted file mode 100644 index 1a4e16112..000000000 --- a/src/newt/classes/jogamp/newt/driver/android/test/GearsGL2ES1.java +++ /dev/null @@ -1,422 +0,0 @@ - -package jogamp.newt.driver.android.test; - -import javax.media.opengl.GL; -import javax.media.opengl.GL2ES1; -import javax.media.opengl.GLAutoDrawable; -import javax.media.opengl.GLEventListener; -import javax.media.opengl.GLProfile; -import com.jogamp.opengl.util.ImmModeSink; - -import com.jogamp.newt.Window; -import com.jogamp.newt.event.KeyAdapter; -import com.jogamp.newt.event.KeyEvent; -import com.jogamp.newt.event.KeyListener; -import com.jogamp.newt.event.MouseAdapter; -import com.jogamp.newt.event.MouseEvent; -import com.jogamp.newt.event.MouseListener; - -/** - * Gears.java <BR> - * author: Brian Paul (converted to Java by Ron Cemer and Sven Gothel) <P> - * - * This version is equal to Brian Paul's version 1.2 1999/10/21 - */ - -public class GearsGL2ES1 implements GLEventListener { - private final float pos[] = { 5.0f, 5.0f, 10.0f, 0.0f }; - private final float red[] = { 0.8f, 0.1f, 0.0f, 0.7f }; - private final float green[] = { 0.0f, 0.8f, 0.2f, 0.7f }; - private final float blue[] = { 0.2f, 0.2f, 1.0f, 0.7f }; - - private float view_rotx = 20.0f, view_roty = 30.0f, view_rotz = 0.0f; - private GearBuffers gear1=null, gear2=null, gear3=null; - private float angle = 0.0f; - private int swapInterval; - - private int prevMouseX, prevMouseY; - - public GearsGL2ES1(int swapInterval) { - this.swapInterval = swapInterval; - } - - public GearsGL2ES1() { - this.swapInterval = 1; - } - - public void init(GLAutoDrawable drawable) { - System.err.println("Gears: Init: "+drawable); - // Use debug pipeline - // drawable.setGL(new DebugGL(drawable.getGL())); - - GL _gl = drawable.getGL(); - // GL2ES1 gl = FixedFuncUtil.wrapFixedFuncEmul(_gl /*, true*/); - GL2ES1 gl = _gl.getGL2ES1(); - - System.err.println("Chosen GLCapabilities: " + drawable.getChosenGLCapabilities()); - System.err.println("INIT GL IS: " + gl.getClass().getName()); - System.err.println("GL_VENDOR: " + gl.glGetString(GL.GL_VENDOR)); - System.err.println("GL_RENDERER: " + gl.glGetString(GL.GL_RENDERER)); - System.err.println("GL_VERSION: " + gl.glGetString(GL.GL_VERSION)); - - gl.glLightfv(GL2ES1.GL_LIGHT0, GL2ES1.GL_POSITION, pos, 0); - gl.glEnable(GL.GL_CULL_FACE); - gl.glEnable(GL2ES1.GL_LIGHTING); - gl.glEnable(GL2ES1.GL_LIGHT0); - gl.glEnable(GL2ES1.GL_DEPTH_TEST); - - /* make the gears */ - if(null == gear1) { - gear1 = gear(gl, 1.0f, 4.0f, 1.0f, 20, 0.7f); - System.err.println("gear1 created: "+gear1); - } else { - System.err.println("gear1 reused: "+gear1); - } - - if(null == gear2) { - gear2 = gear(gl, 0.5f, 2.0f, 2.0f, 10, 0.7f); - System.err.println("gear2 created: "+gear2); - } else { - System.err.println("gear2 reused: "+gear2); - } - - if(null == gear3) { - gear3 = gear(gl, 1.3f, 2.0f, 0.5f, 10, 0.7f); - System.err.println("gear3 created: "+gear3); - } else { - System.err.println("gear3 reused: "+gear3); - } - - gl.glEnable(GL2ES1.GL_NORMALIZE); - - // MouseListener gearsMouse = new TraceMouseAdapter(new GearsMouseAdapter()); - MouseListener gearsMouse = new GearsMouseAdapter(); - KeyListener gearsKeys = new GearsKeyAdapter(); - - if (drawable instanceof Window) { - Window window = (Window) drawable; - window.addMouseListener(gearsMouse); - window.addKeyListener(gearsKeys); - } /* else if (GLProfile.isAWTAvailable() && drawable instanceof java.awt.Component) { - java.awt.Component comp = (java.awt.Component) drawable; - new AWTMouseAdapter(gearsMouse).addTo(comp); - new AWTKeyAdapter(gearsKeys).addTo(comp); - } */ - } - - public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height) { - System.err.println("Gears: Reshape "+x+"/"+y+" "+width+"x"+height); - GL2ES1 gl = drawable.getGL().getGL2ES1(); - - gl.setSwapInterval(swapInterval); - - float h = (float)height / (float)width; - - gl.glMatrixMode(GL2ES1.GL_PROJECTION); - - gl.glLoadIdentity(); - gl.glFrustum(-1.0f, 1.0f, -h, h, 5.0f, 60.0f); - gl.glMatrixMode(GL2ES1.GL_MODELVIEW); - gl.glLoadIdentity(); - gl.glTranslatef(0.0f, 0.0f, -40.0f); - } - - public void dispose(GLAutoDrawable drawable) { - System.err.println("Gears: Dispose"); - } - - public void display(GLAutoDrawable drawable) { - // Turn the gears' teeth - angle += 2.0f; - - // Get the GL corresponding to the drawable we are animating - GL2ES1 gl = drawable.getGL().getGL2ES1(); - - gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); - - gl.glClear(GL2ES1.GL_COLOR_BUFFER_BIT | GL2ES1.GL_DEPTH_BUFFER_BIT); - - gl.glNormal3f(0.0f, 0.0f, 1.0f); - - // Rotate the entire assembly of gears based on how the user - // dragged the mouse around - gl.glPushMatrix(); - gl.glRotatef(view_rotx, 1.0f, 0.0f, 0.0f); - gl.glRotatef(view_roty, 0.0f, 1.0f, 0.0f); - gl.glRotatef(view_rotz, 0.0f, 0.0f, 1.0f); - - final boolean disableBufferAfterDraw = true; - - // Place the first gear and call its display list - gl.glPushMatrix(); - gl.glTranslatef(-3.0f, -2.0f, 0.0f); - gl.glRotatef(angle, 0.0f, 0.0f, 1.0f); - gl.glMaterialfv(GL2ES1.GL_FRONT_AND_BACK, GL2ES1.GL_AMBIENT_AND_DIFFUSE, red, 0); - gear1.draw(gl, disableBufferAfterDraw); - gl.glPopMatrix(); - - // Place the second gear and call its display list - gl.glPushMatrix(); - gl.glTranslatef(3.1f, -2.0f, 0.0f); - gl.glRotatef(-2.0f * angle - 9.0f, 0.0f, 0.0f, 1.0f); - gl.glMaterialfv(GL2ES1.GL_FRONT_AND_BACK, GL2ES1.GL_AMBIENT_AND_DIFFUSE, green, 0); - gear2.draw(gl, disableBufferAfterDraw); - gl.glPopMatrix(); - - // Place the third gear and call its display list - gl.glPushMatrix(); - gl.glTranslatef(-3.1f, 4.2f, 0.0f); - gl.glRotatef(-2.0f * angle - 25.0f, 0.0f, 0.0f, 1.0f); - gl.glMaterialfv(GL2ES1.GL_FRONT_AND_BACK, GL2ES1.GL_AMBIENT_AND_DIFFUSE, blue, 0); - gear3.draw(gl, disableBufferAfterDraw); - gl.glPopMatrix(); - - // Remember that every push needs a pop; this one is paired with - // rotating the entire gear assembly - gl.glPopMatrix(); - } - - static class GearBuffers { - public final ImmModeSink frontFace; - public final ImmModeSink frontSide; - public final ImmModeSink backFace; - public final ImmModeSink backSide; - public final ImmModeSink outwardFace; - public final ImmModeSink insideRadiusCyl; - - public GearBuffers( - ImmModeSink frontFace, - ImmModeSink frontSide, - ImmModeSink backFace, - ImmModeSink backSide, - ImmModeSink outwardFace, - ImmModeSink insideRadiusCyl) { - this.frontFace = frontFace; - this.frontSide = frontSide; - this.backFace = backFace; - this.backSide = backSide; - this.outwardFace = outwardFace; - this.insideRadiusCyl = insideRadiusCyl; - } - - public void draw(GL2ES1 gl, boolean disableBufferAfterDraw) { - gl.glShadeModel(GL2ES1.GL_FLAT); - frontFace.draw(gl, disableBufferAfterDraw); - frontSide.draw(gl, disableBufferAfterDraw); - backFace.draw(gl, disableBufferAfterDraw); - backSide.draw(gl, disableBufferAfterDraw); - outwardFace.draw(gl, disableBufferAfterDraw); - gl.glShadeModel(GL2ES1.GL_SMOOTH); - insideRadiusCyl.draw(gl, disableBufferAfterDraw); - } - } - - public static GearBuffers gear(GL2ES1 gl, - float inner_radius, - float outer_radius, - float width, - int teeth, - float tooth_depth) - { - final float dz = width * 0.5f; - int i; - float r0, r1, r2; - float angle, da; - float u, v, len; - - r0 = inner_radius; - r1 = outer_radius - tooth_depth / 2.0f; - r2 = outer_radius + tooth_depth / 2.0f; - - da = 2.0f * (float) Math.PI / teeth / 4.0f; - - /* draw front face */ - ImmModeSink vboFrontFace = ImmModeSink.createFixed(gl, GL.GL_STATIC_DRAW, 4*teeth+2, - /* vertex */ 3, GL.GL_FLOAT, /* color */ 0, GL.GL_FLOAT, - /* normal */ 0, GL.GL_BYTE, /* texture */ 0, GL.GL_FLOAT); - vboFrontFace.glBegin(GL.GL_TRIANGLE_STRIP); - for (i = 0; i < teeth; i++) { - angle = i * 2.0f * (float) Math.PI / teeth; - vboFrontFace.glVertex3f(r0 * (float)Math.cos(angle), r0 * (float)Math.sin(angle), dz); - vboFrontFace.glVertex3f(r1 * (float)Math.cos(angle), r1 * (float)Math.sin(angle), dz); - vboFrontFace.glVertex3f(r0 * (float)Math.cos(angle), r0 * (float)Math.sin(angle), dz); - vboFrontFace.glVertex3f(r1 * (float)Math.cos(angle + 3.0f * da), r1 * (float)Math.sin(angle + 3.0f * da), dz); - } - vboFrontFace.glVertex3f(r0 * (float)Math.cos(0f), r0 * (float)Math.sin(0f), dz); - vboFrontFace.glVertex3f(r1 * (float)Math.cos(0f), r1 * (float)Math.sin(0f), dz); - vboFrontFace.glEnd(gl, false /* immediate */); - - /* draw front sides of teeth */ - ImmModeSink vboFrontSide = ImmModeSink.createFixed(gl, GL.GL_STATIC_DRAW, 6*teeth, - /* vertex */ 3, GL.GL_FLOAT, /* color */ 0, GL.GL_FLOAT, - /* normal */ 0, GL.GL_FLOAT, /* texture */ 0, GL.GL_FLOAT); - vboFrontSide.glBegin(GL.GL_TRIANGLES); - for (i = 0; i < teeth; i++) { - // QUAD [s0..s3] -> 2x TRIs - angle = i * 2.0f * (float) Math.PI / teeth; - // s0 - vboFrontSide.glVertex3f(r1 * (float)Math.cos(angle), r1 * (float)Math.sin(angle), dz); - // s1 - vboFrontSide.glVertex3f(r2 * (float)Math.cos(angle + da), r2 * (float)Math.sin(angle + da), dz); - // s2 - vboFrontSide.glVertex3f(r2 * (float)Math.cos(angle + 2.0f * da), r2 * (float)Math.sin(angle + 2.0f * da), dz); - - // s0 - vboFrontSide.glVertex3f(r1 * (float)Math.cos(angle), r1 * (float)Math.sin(angle), dz); - // s2 - vboFrontSide.glVertex3f(r2 * (float)Math.cos(angle + 2.0f * da), r2 * (float)Math.sin(angle + 2.0f * da), dz); - // s3 - vboFrontSide.glVertex3f(r1 * (float)Math.cos(angle + 3.0f * da), r1 * (float)Math.sin(angle + 3.0f * da), dz); - } - vboFrontSide.glEnd(gl, false /* immediate */); - - /* draw back face */ - ImmModeSink vboBackFace = ImmModeSink.createFixed(gl, GL.GL_STATIC_DRAW, 4*teeth+2, - /* vertex */ 3, GL.GL_FLOAT, /* color */ 0, GL.GL_FLOAT, - /* normal */ 0, GL.GL_FLOAT, /* texture */ 0, GL.GL_FLOAT); - vboBackFace.glBegin(GL.GL_TRIANGLE_STRIP); - for (i = 0; i < teeth; i++) { - angle = i * 2.0f * (float) Math.PI / teeth; - vboBackFace.glVertex3f(r1 * (float)Math.cos(angle), r1 * (float)Math.sin(angle), -dz); - vboBackFace.glVertex3f(r0 * (float)Math.cos(angle), r0 * (float)Math.sin(angle), -dz); - vboBackFace.glVertex3f(r1 * (float)Math.cos(angle + 3 * da), r1 * (float)Math.sin(angle + 3 * da), -dz); - vboBackFace.glVertex3f(r0 * (float)Math.cos(angle), r0 * (float)Math.sin(angle), -dz); - } - vboBackFace.glVertex3f(r1 * (float)Math.cos(0f), r1 * (float)Math.sin(0f), -dz); - vboBackFace.glVertex3f(r0 * (float)Math.cos(0f), r0 * (float)Math.sin(0f), -dz); - vboBackFace.glEnd(gl, false /* immediate */); - - /* draw back sides of teeth */ - ImmModeSink vboBackSide = ImmModeSink.createFixed(gl, GL.GL_STATIC_DRAW, 6*teeth, - /* vertex */ 3, GL.GL_FLOAT, /* color */ 0, GL.GL_FLOAT, - /* normal */ 0, GL.GL_FLOAT, /* texture */ 0, GL.GL_FLOAT); - vboBackSide.glBegin(GL.GL_TRIANGLES); - for (i = 0; i < teeth; i++) { - // QUAD [s0..s3] -> 2x TRIs - angle = i * 2.0f * (float) Math.PI / teeth; - // s0 - vboBackSide.glVertex3f(r1 * (float)Math.cos(angle + 3 * da), r1 * (float)Math.sin(angle + 3 * da), -dz); - // s1 - vboBackSide.glVertex3f(r2 * (float)Math.cos(angle + 2 * da), r2 * (float)Math.sin(angle + 2 * da), -dz); - // s2 - vboBackSide.glVertex3f(r2 * (float)Math.cos(angle + da), r2 * (float)Math.sin(angle + da), -dz); - - // s0 - vboBackSide.glVertex3f(r1 * (float)Math.cos(angle + 3 * da), r1 * (float)Math.sin(angle + 3 * da), -dz); - // s2 - vboBackSide.glVertex3f(r2 * (float)Math.cos(angle + da), r2 * (float)Math.sin(angle + da), -dz); - // s3 - vboBackSide.glVertex3f(r1 * (float)Math.cos(angle), r1 * (float)Math.sin(angle), -dz); - } - vboBackSide.glEnd(gl, false /* immediate */); - - /* draw outward faces of teeth */ - ImmModeSink vboOutwardFace = ImmModeSink.createFixed(gl, GL.GL_STATIC_DRAW, 4*4*teeth, - /* vertex */ 3, GL.GL_FLOAT, /* color */ 0, GL.GL_FLOAT, - /* normal */ 3, GL.GL_FLOAT, /* texture */ 0, GL.GL_FLOAT); - vboOutwardFace.glBegin(GL.GL_TRIANGLE_STRIP); - for (i = 0; i < teeth; i++) { - angle = i * 2.0f * (float) Math.PI / teeth; - u = r2 * (float)Math.cos(angle + da) - r1 * (float)Math.cos(angle); - v = r2 * (float)Math.sin(angle + da) - r1 * (float)Math.sin(angle); - len = (float)Math.sqrt(u * u + v * v); - u /= len; - v /= len; - - vboOutwardFace.glNormal3f(v, -u, 0.0f); - vboOutwardFace.glVertex3f(r1 * (float)Math.cos(angle), r1 * (float)Math.sin(angle), dz); - vboOutwardFace.glVertex3f(r1 * (float)Math.cos(angle), r1 * (float)Math.sin(angle), -dz); - vboOutwardFace.glVertex3f(r2 * (float)Math.cos(angle + 1 * da), r2 * (float)Math.sin(angle + 1 * da), dz); - vboOutwardFace.glVertex3f(r2 * (float)Math.cos(angle + 1 * da), r2 * (float)Math.sin(angle + 1 * da), -dz); - - vboOutwardFace.glNormal3f((float)Math.cos(angle), (float)Math.sin(angle), 0.0f); - vboOutwardFace.glVertex3f(r2 * (float)Math.cos(angle + 1 * da), r2 * (float)Math.sin(angle + 1 * da), dz); - vboOutwardFace.glVertex3f(r2 * (float)Math.cos(angle + 1 * da), r2 * (float)Math.sin(angle + 1 * da), -dz); - vboOutwardFace.glVertex3f(r2 * (float)Math.cos(angle + 2 * da), r2 * (float)Math.sin(angle + 2 * da), dz); - vboOutwardFace.glVertex3f(r2 * (float)Math.cos(angle + 2 * da), r2 * (float)Math.sin(angle + 2 * da), -dz); - - u = r1 * (float)Math.cos(angle + 3 * da) - r2 * (float)Math.cos(angle + 2 * da); - v = r1 * (float)Math.sin(angle + 3 * da) - r2 * (float)Math.sin(angle + 2 * da); - vboOutwardFace.glNormal3f(v, -u, 0.0f); - vboOutwardFace.glVertex3f(r2 * (float)Math.cos(angle + 2 * da), r2 * (float)Math.sin(angle + 2 * da), dz); - vboOutwardFace.glVertex3f(r2 * (float)Math.cos(angle + 2 * da), r2 * (float)Math.sin(angle + 2 * da), -dz); - vboOutwardFace.glVertex3f(r1 * (float)Math.cos(angle + 3 * da), r1 * (float)Math.sin(angle + 3 * da), dz); - vboOutwardFace.glVertex3f(r1 * (float)Math.cos(angle + 3 * da), r1 * (float)Math.sin(angle + 3 * da), -dz); - - vboOutwardFace.glNormal3f((float)Math.cos(angle), (float)Math.sin(angle), 0.0f); - vboOutwardFace.glVertex3f(r1 * (float)Math.cos(angle + 3 * da), r1 * (float)Math.sin(angle + 3 * da), dz); - vboOutwardFace.glVertex3f(r1 * (float)Math.cos(angle + 3 * da), r1 * (float)Math.sin(angle + 3 * da), -dz); - vboOutwardFace.glVertex3f(r1 * (float)Math.cos(angle), r1 * (float)Math.sin(angle), dz); - vboOutwardFace.glVertex3f(r1 * (float)Math.cos(angle), r1 * (float)Math.sin(angle), -dz); - } - vboOutwardFace.glEnd(gl, false /* immediate */); - - /* draw inside radius cylinder */ - ImmModeSink vboInsideRadiusCyl = ImmModeSink.createFixed(gl, GL.GL_STATIC_DRAW, 2*teeth+2, - /* vertex */ 3, GL.GL_FLOAT, /* color */ 0, GL.GL_FLOAT, - /* normal */ 3, GL.GL_FLOAT, /* texture */ 0, GL.GL_FLOAT); - vboInsideRadiusCyl.glBegin(GL.GL_TRIANGLE_STRIP); - for (i = 0; i < teeth; i++) { - angle = i * 2.0f * (float) Math.PI / teeth; - vboInsideRadiusCyl.glNormal3f(-(float)Math.cos(angle), -(float)Math.sin(angle), 0.0f); - vboInsideRadiusCyl.glVertex3f(r0 * (float)Math.cos(angle), r0 * (float)Math.sin(angle), -dz); - vboInsideRadiusCyl.glVertex3f(r0 * (float)Math.cos(angle), r0 * (float)Math.sin(angle), dz); - } - vboInsideRadiusCyl.glNormal3f(-(float)Math.cos(0f), -(float)Math.sin(0f), 0.0f); - vboInsideRadiusCyl.glVertex3f(r0 * (float)Math.cos(0f), r0 * (float)Math.sin(0f), -dz); - vboInsideRadiusCyl.glVertex3f(r0 * (float)Math.cos(0f), r0 * (float)Math.sin(0f), dz); - vboInsideRadiusCyl.glEnd(gl, false /* immediate */); - return new GearBuffers(vboFrontFace, vboFrontSide, vboBackFace, vboBackSide, vboOutwardFace, vboInsideRadiusCyl); - } - - class GearsKeyAdapter extends KeyAdapter { - public void keyPressed(KeyEvent e) { - int kc = e.getKeyCode(); - if(KeyEvent.VK_LEFT == kc) { - view_roty -= 1; - } else if(KeyEvent.VK_RIGHT == kc) { - view_roty += 1; - } else if(KeyEvent.VK_UP == kc) { - view_rotx -= 1; - } else if(KeyEvent.VK_DOWN == kc) { - view_rotx += 1; - } - } - } - - class GearsMouseAdapter extends MouseAdapter { - public void mousePressed(MouseEvent e) { - prevMouseX = e.getX(); - prevMouseY = e.getY(); - } - - public void mouseReleased(MouseEvent e) { - } - - public void mouseDragged(MouseEvent e) { - int x = e.getX(); - int y = e.getY(); - int width=0, height=0; - Object source = e.getSource(); - if(source instanceof Window) { - Window window = (Window) source; - width=window.getWidth(); - height=window.getHeight(); - } else if (GLProfile.isAWTAvailable() && source instanceof java.awt.Component) { - java.awt.Component comp = (java.awt.Component) source; - width=comp.getWidth(); - height=comp.getHeight(); - } else { - throw new RuntimeException("Event source neither Window nor Component: "+source); - } - float thetaY = 360.0f * ( (float)(x-prevMouseX)/(float)width); - float thetaX = 360.0f * ( (float)(prevMouseY-y)/(float)height); - - prevMouseX = x; - prevMouseY = y; - - view_rotx += thetaX; - view_roty += thetaY; - } - } -} |