Elvenone
07-11-2007, 20:56
hello
iam trying to recode the "Stencil Shadow Volume" from C to java, but i dont know why, i cant get it to work, althrough its the same
netbeans project : www.politea.sk/tmp/Shadows.zip
the C++ code from which iam trying to get into java si on http://www.codesampler.com/source/ogl_shadow_volume.zip (http://www.codesampler.com/oglsrc/oglsrc_8.htm)
package org.yourorghere;
import com.sun.opengl.impl.windows.PIXELFORMATDESCRIPTOR;
import java.awt.*;
import java.awt.event.*;
import javax.media.opengl.*;
import com.sun.opengl.util.*;
import javax.media.opengl.glu.GLU;
public class Shadows implements GLEventListener, MouseListener, MouseMotionListener, MouseWheelListener, KeyListener {
boolean g_bRenderShadowVolume = true;
float g_fAmountOfExtrusion = 5.0f;
float g_lightPosition[] = { 2.0f, 6.0f, 0.0f, 1.0f }; // World position of light source
static float view_scale = 1.0f;
public class Vertex {
public float r, g, b;
public float x, y, z;
private Vertex(float ir, float ig, float ib, float ix,float iy, float iz) {
r = ir; g = ig; b = ib; x = ix; y = iy; z = iz;
}
public float getX() {return x;}
};
public Vertex[] g_shadowCasterVerts =
{
new Vertex(1.0f, 1.0f, 1.0f, -1.0f, 2.5f, -1.0f),
new Vertex(1.0f, 1.0f, 1.0f, -1.0f, 2.5f, 1.0f ),
new Vertex(1.0f, 1.0f, 1.0f, 1.0f, 2.5f, 1.0f ),
new Vertex(1.0f, 1.0f, 1.0f, 1.0f, 2.5f, -1.0f ),
};
public float[] g_shadowCasterNormal = { 0.0f, 1.0f, 0.0f };
class ShadowCaster {
Vertex[] verts;// = new Vertex(0f,0f,0f,0f,0f,0f); // Vertices of the actual shadow casting object
float[] normal;
int numVerts;
int shadowVolume;
};
ShadowCaster g_shadowCaster = new ShadowCaster();
public static void main(String[] args)
{
Frame frame = new Frame("Simple JOGL Application");
GLCanvas canvas = new GLCanvas();
canvas.addGLEventListener(new Shadows());
frame.add(canvas);
frame.setSize(640, 480);
final Animator animator = new Animator(canvas);
frame.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
new Thread(new Runnable()
{
public void run()
{
animator.stop();
System.exit(0);
}
}).start();
}
});
frame.setLocationRelativeTo(null);
frame.setVisible(true);
animator.start();
}
void extendVertex(float[] newVert, float[] lightPosit, Vertex vert, float ext) {
float[] lightDir = new float[3];
// Create a vector that points from the light's position to the original vertex.
lightDir[0] = vert.x - lightPosit[0];
lightDir[1] = vert.y - lightPosit[1];
lightDir[2] = vert.z - lightPosit[2];
newVert[0] = lightPosit[0] + lightDir[0] * ext;
newVert[1] = lightPosit[1] + lightDir[1] * ext;
newVert[2] = lightPosit[2] + lightDir[2] * ext;
}
void buildShadowVolume(GLAutoDrawable drawable, ShadowCaster caster, float[] lightPosit, float ext ) {
GL gl = drawable.getGL();
if ( caster.shadowVolume != -1 )
gl.glDeleteLists( caster.shadowVolume, 0 );
caster.shadowVolume = gl.glGenLists(1);
gl.glNewList( caster.shadowVolume, gl.GL_COMPILE );
{
gl.glDisable( gl.GL_LIGHTING );
gl.glBegin( gl.GL_QUADS );
{
gl.glColor3f( 0.2f, 0.8f, 0.4f );
float[] vExtended = new float[3];
for( int i = 0; i < caster.numVerts; ++i )
{
int e0 = i;
int e1 = i+1;
if( e1 >= caster.numVerts )
e1 = 0;
gl.glVertex3f(caster.verts[e0].x, caster.verts[e0].y, caster.verts[e0].z);
extendVertex(vExtended, lightPosit, caster.verts[e0], ext);
gl.glVertex3f(vExtended[0], vExtended[1], vExtended[2]);
extendVertex( vExtended, lightPosit, caster.verts[e1], ext );
gl.glVertex3f( vExtended[0], vExtended[1], vExtended[2] );
gl.glVertex3f( caster.verts[e1].x, caster.verts[e1].y, caster.verts[e1].z );
}
}
gl.glEnd();
gl.glEnable( gl.GL_LIGHTING );
}
gl.glEndList();
}
void renderScene(GLAutoDrawable drawable) {
GL gl = drawable.getGL();
GLUT glut = new GLUT();
gl.glMatrixMode( gl.GL_MODELVIEW );
gl.glLoadIdentity();
gl.glTranslatef( 0.0f, -2.0f, -15.0f );
if (mouseRButtonDown) {
view_scale += (prevMouseY - nowMouseY) / 10000f;
}
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);
gl.glPushMatrix();
{
gl.glBegin( gl.GL_QUADS );
{
gl.glNormal3f( 0.0f, 1.0f, 0.0f );
gl.glVertex3f(-5.0f, 0.0f, -5.0f );
gl.glVertex3f(-5.0f, 0.0f, 5.0f );
gl.glVertex3f( 5.0f, 0.0f, 5.0f );
gl.glVertex3f( 5.0f, 0.0f, -5.0f );
}
gl.glEnd();
}
gl.glPopMatrix();
gl.glPushMatrix();
{
gl.glTranslatef( -2.0f, 0.8f, 0.0f );
gl.glRotatef( 180.0f, 0.0f, 1.0f, 0.0f );
gl.glColor3f( 1.0f, 1.0f ,1.0f );
glut.glutSolidTeapot(1.0);
}
gl.glPopMatrix();
gl.glDisable( gl.GL_LIGHTING );
gl.glPushMatrix();
{
gl.glLightfv( gl.GL_LIGHT0, gl.GL_POSITION, g_lightPosition, 0);
gl.glTranslatef( g_lightPosition[0], g_lightPosition[1], g_lightPosition[2] );
gl.glColor3f(1.0f, 1.0f, 0.5f);
glut.glutSolidSphere( 0.1, 8, 8 );
}
gl.glPopMatrix();
gl.glEnable( gl.GL_LIGHTING );
gl.glPushMatrix();
{
gl.glBegin( gl.GL_POLYGON );
{
gl.glNormal3f(g_shadowCaster.normal[0],g_shadowCaster.normal[1], g_shadowCaster.normal[2]);
for( int i = 0; i < g_shadowCaster.numVerts; ++i )
{
gl.glVertex3f( g_shadowCaster.verts[i].x, g_shadowCaster.verts[i].y, g_shadowCaster.verts[i].z );
}
}
gl.glEnd();
}
gl.glPopMatrix();
}
public void init(GLAutoDrawable drawable)
{
GL gl = drawable.getGL();
GLU glu = new GLU();
gl.glClearStencil(128);
gl.setSwapInterval(1);
gl.glClearColor( 0.35f, 0.53f, 0.7f, 1.0f );
gl.glEnable(gl.GL_LIGHTING);
gl.glEnable(gl.GL_LIGHT0);
gl.glEnable(gl.GL_DEPTH_TEST);
gl.glMatrixMode( gl.GL_PROJECTION );
gl.glLoadIdentity();
glu.gluPerspective( 45.0f, 640.0f / 480.0f, 0.1f, 100.0f);
float[] lightAmbient = {0.2f, 0.2f, 0.2f, 1.0f};
float[] lightDiffuse = {1.0f, 1.0f, 1.0f, 1.0f};
float[] lightSpecular = {1.0f, 1.0f, 1.0f, 1.0f};
gl.glLightfv(gl.GL_LIGHT0, gl.GL_DIFFUSE, lightDiffuse, 0);
gl.glLightfv(gl.GL_LIGHT0, gl.GL_SPECULAR, lightSpecular, 0);
gl.glLightfv(gl.GL_LIGHT0, gl.GL_AMBIENT, lightAmbient, 0);
g_shadowCaster.verts = g_shadowCasterVerts;
g_shadowCaster.normal = g_shadowCasterNormal;
g_shadowCaster.numVerts = (4);
g_shadowCaster.shadowVolume = -1;
drawable.addMouseListener(this);
drawable.addMouseMotionListener(this);
drawable.addMouseWheelListener(this);
drawable.addKeyListener(this);
}
public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height)
{
GL gl = drawable.getGL();
GLU glu = new GLU();
if (height <= 0)
height = 1;
final float h = (float) width / (float) height;
gl.glViewport(0, 0, width, height);
gl.glMatrixMode(GL.GL_PROJECTION);
gl.glLoadIdentity();
glu.gluPerspective(45.0f, h, 1.0, 20.0);
gl.glMatrixMode(GL.GL_MODELVIEW);
gl.glLoadIdentity();
}
public void display(GLAutoDrawable drawable)
{
GL gl = drawable.getGL();
buildShadowVolume(drawable, g_shadowCaster, g_lightPosition, g_fAmountOfExtrusion );
gl.glClear( gl.GL_COLOR_BUFFER_BIT | gl.GL_DEPTH_BUFFER_BIT | gl.GL_STENCIL_BUFFER_BIT );
gl.glColorMask( false, false, false, false );
renderScene(drawable);
gl.glEnable( gl.GL_CULL_FACE );
gl.glEnable( gl.GL_STENCIL_TEST );
gl.glDepthMask(false);
gl.glStencilFunc( gl.GL_ALWAYS, 0, 0 );
gl.glStencilOp( gl.GL_KEEP, gl.GL_KEEP, gl.GL_INCR );
gl.glCullFace( gl.GL_BACK );
gl.glCallList( g_shadowCaster.shadowVolume );
gl.glStencilOp( gl.GL_KEEP, gl.GL_KEEP, gl.GL_DECR );
gl.glCullFace( gl.GL_FRONT );
gl.glCallList( g_shadowCaster.shadowVolume );
gl.glDepthMask( true );
gl.glDepthFunc( gl.GL_LEQUAL );
gl.glColorMask( true, true, true, true );
gl.glStencilOp( gl.GL_KEEP, gl.GL_KEEP, gl.GL_KEEP );
gl.glCullFace( gl.GL_BACK );
gl.glDisable( gl.GL_CULL_FACE );
gl.glStencilFunc( gl.GL_EQUAL, 1, 1 );
gl.glDisable( gl.GL_LIGHT0 );
renderScene(drawable);
gl.glStencilFunc( gl.GL_EQUAL, 0, 1 );
gl.glEnable( gl.GL_LIGHT0 );
renderScene(drawable);
gl.glDepthFunc( gl.GL_LESS );
gl.glDisable( gl.GL_STENCIL_TEST );
if( g_bRenderShadowVolume )
{
gl.glPolygonMode( gl.GL_FRONT_AND_BACK, gl.GL_LINE );
gl.glCallList( g_shadowCaster.shadowVolume );
gl.glPolygonMode( gl.GL_FRONT_AND_BACK, gl.GL_FILL );
}
}
public void displayChanged(GLAutoDrawable drawable, boolean modeChanged, boolean deviceChanged)
{}
static int prevMouseX = 0, prevMouseY = 0, nowMouseX, nowMouseY;
static boolean mouseRButtonDown = false;
private float view_rotx = 20.0f, view_roty = 30.0f, view_rotz = 0.0f;
public void mouseClicked(MouseEvent e) {
}
public void mousePressed(MouseEvent e) {
if ((e.getModifiers() & e.BUTTON1_MASK) != 0) {
//view_scale += 0.5;
}
if ((e.getModifiers() & e.BUTTON3_MASK) != 0) {
//view_scale -= 0.5;
}
prevMouseX = e.getX();
prevMouseY = e.getY();
if ((e.getModifiers() & e.BUTTON3_MASK) != 0) {
mouseRButtonDown = true;
}
}
public void mouseReleased(MouseEvent e) {
if ((e.getModifiers() & e.BUTTON3_MASK) != 0) {
mouseRButtonDown = false;
}
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
public void mouseDragged(MouseEvent e) {
if ((e.getModifiers() & e.BUTTON3_MASK) != 0) {
nowMouseX = e.getX();
nowMouseY = e.getY();
}
if ((e.getModifiers() & e.BUTTON1_MASK) != 0) {
int x = e.getX();
int y = e.getY();
Dimension size = e.getComponent().getSize();
float thetaY = 360.0f * ( (float)(x-prevMouseX)/(float)size.width);
float thetaX = 360.0f * ( (float)(prevMouseY-y)/(float)size.height);
prevMouseX = x;
prevMouseY = y;
view_rotx += thetaX;
view_roty += thetaY;
}
//throw new UnsupportedOperationException("Not supported yet.");
}
public void mouseMoved(MouseEvent e) {
}
public void mouseWheelMoved(MouseWheelEvent e) {
if (e.getWheelRotation() < 0) {
view_scale += 0.1;
} else {
view_scale -= 0.1;
}
}
public void keyTyped(KeyEvent e) {
}
public void keyPressed(KeyEvent e) {
if (e.getKeyChar() == KeyEvent.CHAR_UNDEFINED) {
int key = e.getKeyCode();
if (key == KeyEvent.VK_F5) {
g_lightPosition[0] += 0.1f;
}
if (key == KeyEvent.VK_F6) {
g_lightPosition[0] -= 0.1f;
}
if (key == KeyEvent.VK_F7) {
g_lightPosition[1] += 0.1f;
}
if (key == KeyEvent.VK_F8) {
g_lightPosition[1] -= 0.1f;
}
}
}
public void keyReleased(KeyEvent e) {
}
}
iam trying to recode the "Stencil Shadow Volume" from C to java, but i dont know why, i cant get it to work, althrough its the same
netbeans project : www.politea.sk/tmp/Shadows.zip
the C++ code from which iam trying to get into java si on http://www.codesampler.com/source/ogl_shadow_volume.zip (http://www.codesampler.com/oglsrc/oglsrc_8.htm)
package org.yourorghere;
import com.sun.opengl.impl.windows.PIXELFORMATDESCRIPTOR;
import java.awt.*;
import java.awt.event.*;
import javax.media.opengl.*;
import com.sun.opengl.util.*;
import javax.media.opengl.glu.GLU;
public class Shadows implements GLEventListener, MouseListener, MouseMotionListener, MouseWheelListener, KeyListener {
boolean g_bRenderShadowVolume = true;
float g_fAmountOfExtrusion = 5.0f;
float g_lightPosition[] = { 2.0f, 6.0f, 0.0f, 1.0f }; // World position of light source
static float view_scale = 1.0f;
public class Vertex {
public float r, g, b;
public float x, y, z;
private Vertex(float ir, float ig, float ib, float ix,float iy, float iz) {
r = ir; g = ig; b = ib; x = ix; y = iy; z = iz;
}
public float getX() {return x;}
};
public Vertex[] g_shadowCasterVerts =
{
new Vertex(1.0f, 1.0f, 1.0f, -1.0f, 2.5f, -1.0f),
new Vertex(1.0f, 1.0f, 1.0f, -1.0f, 2.5f, 1.0f ),
new Vertex(1.0f, 1.0f, 1.0f, 1.0f, 2.5f, 1.0f ),
new Vertex(1.0f, 1.0f, 1.0f, 1.0f, 2.5f, -1.0f ),
};
public float[] g_shadowCasterNormal = { 0.0f, 1.0f, 0.0f };
class ShadowCaster {
Vertex[] verts;// = new Vertex(0f,0f,0f,0f,0f,0f); // Vertices of the actual shadow casting object
float[] normal;
int numVerts;
int shadowVolume;
};
ShadowCaster g_shadowCaster = new ShadowCaster();
public static void main(String[] args)
{
Frame frame = new Frame("Simple JOGL Application");
GLCanvas canvas = new GLCanvas();
canvas.addGLEventListener(new Shadows());
frame.add(canvas);
frame.setSize(640, 480);
final Animator animator = new Animator(canvas);
frame.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
new Thread(new Runnable()
{
public void run()
{
animator.stop();
System.exit(0);
}
}).start();
}
});
frame.setLocationRelativeTo(null);
frame.setVisible(true);
animator.start();
}
void extendVertex(float[] newVert, float[] lightPosit, Vertex vert, float ext) {
float[] lightDir = new float[3];
// Create a vector that points from the light's position to the original vertex.
lightDir[0] = vert.x - lightPosit[0];
lightDir[1] = vert.y - lightPosit[1];
lightDir[2] = vert.z - lightPosit[2];
newVert[0] = lightPosit[0] + lightDir[0] * ext;
newVert[1] = lightPosit[1] + lightDir[1] * ext;
newVert[2] = lightPosit[2] + lightDir[2] * ext;
}
void buildShadowVolume(GLAutoDrawable drawable, ShadowCaster caster, float[] lightPosit, float ext ) {
GL gl = drawable.getGL();
if ( caster.shadowVolume != -1 )
gl.glDeleteLists( caster.shadowVolume, 0 );
caster.shadowVolume = gl.glGenLists(1);
gl.glNewList( caster.shadowVolume, gl.GL_COMPILE );
{
gl.glDisable( gl.GL_LIGHTING );
gl.glBegin( gl.GL_QUADS );
{
gl.glColor3f( 0.2f, 0.8f, 0.4f );
float[] vExtended = new float[3];
for( int i = 0; i < caster.numVerts; ++i )
{
int e0 = i;
int e1 = i+1;
if( e1 >= caster.numVerts )
e1 = 0;
gl.glVertex3f(caster.verts[e0].x, caster.verts[e0].y, caster.verts[e0].z);
extendVertex(vExtended, lightPosit, caster.verts[e0], ext);
gl.glVertex3f(vExtended[0], vExtended[1], vExtended[2]);
extendVertex( vExtended, lightPosit, caster.verts[e1], ext );
gl.glVertex3f( vExtended[0], vExtended[1], vExtended[2] );
gl.glVertex3f( caster.verts[e1].x, caster.verts[e1].y, caster.verts[e1].z );
}
}
gl.glEnd();
gl.glEnable( gl.GL_LIGHTING );
}
gl.glEndList();
}
void renderScene(GLAutoDrawable drawable) {
GL gl = drawable.getGL();
GLUT glut = new GLUT();
gl.glMatrixMode( gl.GL_MODELVIEW );
gl.glLoadIdentity();
gl.glTranslatef( 0.0f, -2.0f, -15.0f );
if (mouseRButtonDown) {
view_scale += (prevMouseY - nowMouseY) / 10000f;
}
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);
gl.glPushMatrix();
{
gl.glBegin( gl.GL_QUADS );
{
gl.glNormal3f( 0.0f, 1.0f, 0.0f );
gl.glVertex3f(-5.0f, 0.0f, -5.0f );
gl.glVertex3f(-5.0f, 0.0f, 5.0f );
gl.glVertex3f( 5.0f, 0.0f, 5.0f );
gl.glVertex3f( 5.0f, 0.0f, -5.0f );
}
gl.glEnd();
}
gl.glPopMatrix();
gl.glPushMatrix();
{
gl.glTranslatef( -2.0f, 0.8f, 0.0f );
gl.glRotatef( 180.0f, 0.0f, 1.0f, 0.0f );
gl.glColor3f( 1.0f, 1.0f ,1.0f );
glut.glutSolidTeapot(1.0);
}
gl.glPopMatrix();
gl.glDisable( gl.GL_LIGHTING );
gl.glPushMatrix();
{
gl.glLightfv( gl.GL_LIGHT0, gl.GL_POSITION, g_lightPosition, 0);
gl.glTranslatef( g_lightPosition[0], g_lightPosition[1], g_lightPosition[2] );
gl.glColor3f(1.0f, 1.0f, 0.5f);
glut.glutSolidSphere( 0.1, 8, 8 );
}
gl.glPopMatrix();
gl.glEnable( gl.GL_LIGHTING );
gl.glPushMatrix();
{
gl.glBegin( gl.GL_POLYGON );
{
gl.glNormal3f(g_shadowCaster.normal[0],g_shadowCaster.normal[1], g_shadowCaster.normal[2]);
for( int i = 0; i < g_shadowCaster.numVerts; ++i )
{
gl.glVertex3f( g_shadowCaster.verts[i].x, g_shadowCaster.verts[i].y, g_shadowCaster.verts[i].z );
}
}
gl.glEnd();
}
gl.glPopMatrix();
}
public void init(GLAutoDrawable drawable)
{
GL gl = drawable.getGL();
GLU glu = new GLU();
gl.glClearStencil(128);
gl.setSwapInterval(1);
gl.glClearColor( 0.35f, 0.53f, 0.7f, 1.0f );
gl.glEnable(gl.GL_LIGHTING);
gl.glEnable(gl.GL_LIGHT0);
gl.glEnable(gl.GL_DEPTH_TEST);
gl.glMatrixMode( gl.GL_PROJECTION );
gl.glLoadIdentity();
glu.gluPerspective( 45.0f, 640.0f / 480.0f, 0.1f, 100.0f);
float[] lightAmbient = {0.2f, 0.2f, 0.2f, 1.0f};
float[] lightDiffuse = {1.0f, 1.0f, 1.0f, 1.0f};
float[] lightSpecular = {1.0f, 1.0f, 1.0f, 1.0f};
gl.glLightfv(gl.GL_LIGHT0, gl.GL_DIFFUSE, lightDiffuse, 0);
gl.glLightfv(gl.GL_LIGHT0, gl.GL_SPECULAR, lightSpecular, 0);
gl.glLightfv(gl.GL_LIGHT0, gl.GL_AMBIENT, lightAmbient, 0);
g_shadowCaster.verts = g_shadowCasterVerts;
g_shadowCaster.normal = g_shadowCasterNormal;
g_shadowCaster.numVerts = (4);
g_shadowCaster.shadowVolume = -1;
drawable.addMouseListener(this);
drawable.addMouseMotionListener(this);
drawable.addMouseWheelListener(this);
drawable.addKeyListener(this);
}
public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height)
{
GL gl = drawable.getGL();
GLU glu = new GLU();
if (height <= 0)
height = 1;
final float h = (float) width / (float) height;
gl.glViewport(0, 0, width, height);
gl.glMatrixMode(GL.GL_PROJECTION);
gl.glLoadIdentity();
glu.gluPerspective(45.0f, h, 1.0, 20.0);
gl.glMatrixMode(GL.GL_MODELVIEW);
gl.glLoadIdentity();
}
public void display(GLAutoDrawable drawable)
{
GL gl = drawable.getGL();
buildShadowVolume(drawable, g_shadowCaster, g_lightPosition, g_fAmountOfExtrusion );
gl.glClear( gl.GL_COLOR_BUFFER_BIT | gl.GL_DEPTH_BUFFER_BIT | gl.GL_STENCIL_BUFFER_BIT );
gl.glColorMask( false, false, false, false );
renderScene(drawable);
gl.glEnable( gl.GL_CULL_FACE );
gl.glEnable( gl.GL_STENCIL_TEST );
gl.glDepthMask(false);
gl.glStencilFunc( gl.GL_ALWAYS, 0, 0 );
gl.glStencilOp( gl.GL_KEEP, gl.GL_KEEP, gl.GL_INCR );
gl.glCullFace( gl.GL_BACK );
gl.glCallList( g_shadowCaster.shadowVolume );
gl.glStencilOp( gl.GL_KEEP, gl.GL_KEEP, gl.GL_DECR );
gl.glCullFace( gl.GL_FRONT );
gl.glCallList( g_shadowCaster.shadowVolume );
gl.glDepthMask( true );
gl.glDepthFunc( gl.GL_LEQUAL );
gl.glColorMask( true, true, true, true );
gl.glStencilOp( gl.GL_KEEP, gl.GL_KEEP, gl.GL_KEEP );
gl.glCullFace( gl.GL_BACK );
gl.glDisable( gl.GL_CULL_FACE );
gl.glStencilFunc( gl.GL_EQUAL, 1, 1 );
gl.glDisable( gl.GL_LIGHT0 );
renderScene(drawable);
gl.glStencilFunc( gl.GL_EQUAL, 0, 1 );
gl.glEnable( gl.GL_LIGHT0 );
renderScene(drawable);
gl.glDepthFunc( gl.GL_LESS );
gl.glDisable( gl.GL_STENCIL_TEST );
if( g_bRenderShadowVolume )
{
gl.glPolygonMode( gl.GL_FRONT_AND_BACK, gl.GL_LINE );
gl.glCallList( g_shadowCaster.shadowVolume );
gl.glPolygonMode( gl.GL_FRONT_AND_BACK, gl.GL_FILL );
}
}
public void displayChanged(GLAutoDrawable drawable, boolean modeChanged, boolean deviceChanged)
{}
static int prevMouseX = 0, prevMouseY = 0, nowMouseX, nowMouseY;
static boolean mouseRButtonDown = false;
private float view_rotx = 20.0f, view_roty = 30.0f, view_rotz = 0.0f;
public void mouseClicked(MouseEvent e) {
}
public void mousePressed(MouseEvent e) {
if ((e.getModifiers() & e.BUTTON1_MASK) != 0) {
//view_scale += 0.5;
}
if ((e.getModifiers() & e.BUTTON3_MASK) != 0) {
//view_scale -= 0.5;
}
prevMouseX = e.getX();
prevMouseY = e.getY();
if ((e.getModifiers() & e.BUTTON3_MASK) != 0) {
mouseRButtonDown = true;
}
}
public void mouseReleased(MouseEvent e) {
if ((e.getModifiers() & e.BUTTON3_MASK) != 0) {
mouseRButtonDown = false;
}
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
public void mouseDragged(MouseEvent e) {
if ((e.getModifiers() & e.BUTTON3_MASK) != 0) {
nowMouseX = e.getX();
nowMouseY = e.getY();
}
if ((e.getModifiers() & e.BUTTON1_MASK) != 0) {
int x = e.getX();
int y = e.getY();
Dimension size = e.getComponent().getSize();
float thetaY = 360.0f * ( (float)(x-prevMouseX)/(float)size.width);
float thetaX = 360.0f * ( (float)(prevMouseY-y)/(float)size.height);
prevMouseX = x;
prevMouseY = y;
view_rotx += thetaX;
view_roty += thetaY;
}
//throw new UnsupportedOperationException("Not supported yet.");
}
public void mouseMoved(MouseEvent e) {
}
public void mouseWheelMoved(MouseWheelEvent e) {
if (e.getWheelRotation() < 0) {
view_scale += 0.1;
} else {
view_scale -= 0.1;
}
}
public void keyTyped(KeyEvent e) {
}
public void keyPressed(KeyEvent e) {
if (e.getKeyChar() == KeyEvent.CHAR_UNDEFINED) {
int key = e.getKeyCode();
if (key == KeyEvent.VK_F5) {
g_lightPosition[0] += 0.1f;
}
if (key == KeyEvent.VK_F6) {
g_lightPosition[0] -= 0.1f;
}
if (key == KeyEvent.VK_F7) {
g_lightPosition[1] += 0.1f;
}
if (key == KeyEvent.VK_F8) {
g_lightPosition[1] -= 0.1f;
}
}
}
public void keyReleased(KeyEvent e) {
}
}