/* * Portions Copyright (C) 2003 Sun Microsystems, Inc. * All rights reserved. */ /* * * COPYRIGHT NVIDIA CORPORATION 2003. ALL RIGHTS RESERVED. * BY ACCESSING OR USING THIS SOFTWARE, YOU AGREE TO: * * 1) ACKNOWLEDGE NVIDIA'S EXCLUSIVE OWNERSHIP OF ALL RIGHTS * IN AND TO THE SOFTWARE; * * 2) NOT MAKE OR DISTRIBUTE COPIES OF THE SOFTWARE WITHOUT * INCLUDING THIS NOTICE AND AGREEMENT; * * 3) ACKNOWLEDGE THAT TO THE MAXIMUM EXTENT PERMITTED BY * APPLICABLE LAW, THIS SOFTWARE IS PROVIDED *AS IS* AND * THAT NVIDIA AND ITS SUPPLIERS DISCLAIM ALL WARRANTIES, * EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED * TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE. * * IN NO EVENT SHALL NVIDIA OR ITS SUPPLIERS BE LIABLE FOR ANY * SPECIAL, INCIDENTAL, INDIRECT, OR CONSEQUENTIAL DAMAGES * WHATSOEVER (INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS * OF BUSINESS PROFITS, BUSINESS INTERRUPTION, LOSS OF BUSINESS * INFORMATION, OR ANY OTHER PECUNIARY LOSS), INCLUDING ATTORNEYS' * FEES, RELATING TO THE USE OF OR INABILITY TO USE THIS SOFTWARE, * EVEN IF NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. * */ package demos.cg.runtime_ogl; import com.jogamp.opengl.cg.*; import javax.media.opengl.*; import javax.media.opengl.awt.*; import javax.media.opengl.glu.*; import java.awt.*; import java.awt.event.*; import java.io.*; /** * cgGL_vertex_example: simple demo of Nvidia CgGL API. Based upon C version * distributed with the NVidia Cg Toolkit. Ported to the Java language by * Christopher Kline 5/29/2003. */ public class cgGL_vertex_example implements GLEventListener { /******************************************************************************/ /*** Static Data ***/ /******************************************************************************/ private final int TextureRes = 512; private GLU glu = new GLU(); private static CGcontext Context = null; private static CGprogram Program = null; private static CGparameter KdParam = null; private static CGparameter ModelViewProjParam = null; private static CGparameter TestColorParam = null; private static /*CGprofile*/ int profile; static { String os = System.getProperty("os.name").toLowerCase(); profile = os.startsWith("mac os") ? CgGL.CG_PROFILE_ARBVP1 : CgGL.CG_PROFILE_VP20; } private float LightDiffuse[] = {1.0f, 0.0f, 0.0f, 1.0f}; private float LightPosition[] = {1.0f, 1.0f, 1.0f, 0.0f}; private float CubeNormals[/*6*/][/*3*/] = { {-1.0f, 0.0f, 0.0f}, {0.0f, 1.0f, 0.0f}, {1.0f, 0.0f, 0.0f}, {0.0f, -1.0f, 0.0f}, {0.0f, 0.0f, 1.0f}, {0.0f, 0.0f, -1.0f} }; private int CubeFaces[/*6*/][/*4*/] = { {0, 1, 2, 3}, {3, 2, 6, 7}, {7, 6, 5, 4}, {4, 5, 1, 0}, {5, 6, 2, 1}, {7, 4, 0, 3} }; private float CubeVertices[][] = new float[8][3]; /******************************************************************************/ private int MATRIX_INDEX(int i, int j) { return (j + i * 4); } private static void CheckCgError() { /*CGerror*/ int err = CgGL.cgGetError(); if (err != CgGL.CG_NO_ERROR) { System.out.println("CG error: " + CgGL.cgGetErrorString(err)); System.exit(1); } } private void DrawCube(GL2 gl) { int i; CgGL.cgGLBindProgram(Program); CheckCgError(); /* * Set various uniform parameters including the ModelViewProjection * matrix for transforming the incoming position into HPOS. */ if(KdParam != null) CgGL.cgGLSetParameter4f(KdParam, 1.0f, 1.0f, 0.0f, 1.0f); /* Set the concatenate modelview and projection matrices */ if(ModelViewProjParam != null) CgGL.cgGLSetStateMatrixParameter(ModelViewProjParam, CgGL.CG_GL_MODELVIEW_PROJECTION_MATRIX, CgGL.CG_GL_MATRIX_IDENTITY); CgGL.cgGLEnableProfile(profile); /* * Create cube with per-vertex varying attributes */ for(i = 0; i < 6; i++) { gl.glBegin(gl.GL_QUADS); gl.glNormal3f(CubeNormals[i][0], CubeNormals[i][1], CubeNormals[i][0]); CgGL.cgGLSetParameter3f(TestColorParam, 1.0f, 0.0f, 0.0f); float[] verts = CubeVertices[CubeFaces[i][0]]; gl.glVertex3f(verts[0], verts[1], verts[2]); CgGL.cgGLSetParameter3f(TestColorParam, 0.0f, 1.0f, 0.0f); verts = CubeVertices[CubeFaces[i][1]]; gl.glVertex3f(verts[0], verts[1], verts[2]); CgGL.cgGLSetParameter3f(TestColorParam, 0.0f, 0.0f, 1.0f); verts = CubeVertices[CubeFaces[i][2]]; gl.glVertex3f(verts[0], verts[1], verts[2]); CgGL.cgGLSetParameter3f(TestColorParam, 1.0f, 1.0f, 1.0f); verts = CubeVertices[CubeFaces[i][3]]; gl.glVertex3f(verts[0], verts[1], verts[2]); gl.glEnd(); } CgGL.cgGLDisableProfile(profile); } public void dispose(GLAutoDrawable drawable) { } public void display(GLAutoDrawable drawable) { GL2 gl = drawable.getGL().getGL2(); gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); DrawCube(gl); //glutSwapBuffers(); } void InitializeCube(float v[/*8*/][/*3*/]) { /* Setup cube vertex data. */ v[0][0] = v[1][0] = v[2][0] = v[3][0] = -1; v[4][0] = v[5][0] = v[6][0] = v[7][0] = 1; v[0][1] = v[1][1] = v[4][1] = v[5][1] = -1; v[2][1] = v[3][1] = v[6][1] = v[7][1] = 1; v[0][2] = v[3][2] = v[4][2] = v[7][2] = 1; v[1][2] = v[2][2] = v[5][2] = v[6][2] = -1; } public void displayChanged(GLAutoDrawable drawable, boolean modeChanged, boolean deviceChanged) { // nothing } public void init(GLAutoDrawable drawable) { // Note: we initialize Cg in this init() method instead of main() // because Cg (apparently) requires an active OpenGL context in order to // initialize correctly (otherwise the CheckCgError() call after // cgGLLoadProgram() will fail). /* Test cgContext creation */ Context = CgGL.cgCreateContext(); CheckCgError(); /* Test adding source text to context */ try { Program = CgGL.cgCreateProgramFromStream( Context, CgGL.CG_SOURCE, getClass().getClassLoader().getResourceAsStream("demos/cg/runtime_ogl/cgGL_vertex_example.cg"), profile, null, null); } catch (IOException e) { throw new RuntimeException("Error loading Cg vertex program", e); } CheckCgError(); System.err.println( "LAST LISTING----" + CgGL.cgGetLastListing(Context) + "----\n"); System.err.println( "---- PROGRAM BEGIN ----\n"+ CgGL.cgGetProgramString(Program, CgGL.CG_COMPILED_PROGRAM)+ "---- PROGRAM END ----\n"); if(Program != null) { CgGL.cgGLLoadProgram(Program); CheckCgError(); KdParam = CgGL.cgGetNamedParameter(Program, "Kd"); CheckCgError(); ModelViewProjParam = CgGL.cgGetNamedParameter(Program, "ModelViewProj"); CheckCgError(); TestColorParam = CgGL.cgGetNamedParameter(Program, "IN.TestColor"); CheckCgError(); } GL2 gl = drawable.getGL().getGL2(); InitializeCube(CubeVertices); /* Enable a single OpenGL light. */ gl.glLightfv(GL2ES1.GL_LIGHT0, GL2ES1.GL_DIFFUSE, LightDiffuse, 0); gl.glLightfv(GL2ES1.GL_LIGHT0, GL2ES1.GL_POSITION, LightPosition, 0); gl.glEnable(GL2ES1.GL_LIGHT0); if (false) { // #if 0 gl.glEnable(GL2ES1.GL_LIGHTING); } else { // #else gl.glDisable(GL2ES1.GL_LIGHTING); } // #endif /* Use depth buffering for hidden surface elimination. */ gl.glEnable(GL.GL_DEPTH_TEST); /* Setup the view of the cube. */ gl.glMatrixMode(GL2ES1.GL_PROJECTION); glu.gluPerspective( /* field of view in degree */ 40.0f, /* aspect ratio */ 1.0f, /* Z near */ 1.0f, /* Z far */ 10.0f); gl.glMatrixMode(GL2ES1.GL_MODELVIEW); glu.gluLookAt(0.0f, 0.0f, 5.0f, /* eye is at (0,0,5) */ 0.0f, 0.0f, 0.0f, /* center is at (0,0,0) */ 0.0f, 1.0f, 0.); /* up is in positive Y direction */ /* Adjust cube position to be asthetic angle. */ gl.glTranslatef(0.0f, 0.0f, -1.0f); if (true) { // #if 1 gl.glRotatef(60, 1.0f, 0.0f, 0.0f); gl.glRotatef(-20, 0.0f, 0.0f, 1.0f); } //#endif } public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height) { // do nothing } public static void main(String[] argv) { // set argument 'NotFirstUIActionOnProcess' in the JNLP's application-desc tag for example // // NotFirstUIActionOnProcess // boolean firstUIActionOnProcess = 0==argv.length || !argv[0].equals("NotFirstUIActionOnProcess") ; GLProfile.initSingleton(firstUIActionOnProcess); // GLCapabilities caps = new GLCapabilities(GLProfile.getDefault()); // GLCanvas canvas = new GLCanvas(caps); GLCanvas canvas = new GLCanvas(); Frame frame = new Frame("NVidia Cg Toolkit \"cgGL_vertex_example\" demo"); canvas.addGLEventListener(new cgGL_vertex_example()); frame.add(canvas); frame.setSize(500, 500); frame.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { // Run this on another thread than the AWT event queue to // avoid deadlocks on shutdown on some platforms new Thread(new Runnable() { public void run() { System.exit(0); } }).start(); } }); frame.setVisible(true); } }