PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Stencil Shadows



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) {
}
}

mehlvogel
08-11-2007, 05:55
So what is the actual error you've got? Or did it compile but just didn't do what it's supposed to?

Elvenone
08-11-2007, 18:21
ou sorry, i want to look it like this :

http://politea.sk/tmp/jogl.jpg

(on the left, the same code in C++)
(on the right rewritten code to java)

i cant figure out why it isnt working

thank you