/opengles/redbook/alpha3D.c
http://ftk.googlecode.com/ · C · 175 lines · 115 code · 18 blank · 42 comment · 5 complexity · e59d52815763bc9f41efe4d824db0faa MD5 · raw file
- /*
- * License Applicability. Except to the extent portions of this file are
- * made subject to an alternative license as permitted in the SGI Free
- * Software License B, Version 1.1 (the "License"), the contents of this
- * file are subject only to the provisions of the License. You may not use
- * this file except in compliance with the License. You may obtain a copy
- * of the License at Silicon Graphics, Inc., attn: Legal Services, 1600
- * Amphitheatre Parkway, Mountain View, CA 94043-1351, or at:
- *
- * http://oss.sgi.com/projects/FreeB
- *
- * Note that, as provided in the License, the Software is distributed on an
- * "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS
- * DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND
- * CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A
- * PARTICULAR PURPOSE, AND NON-INFRINGEMENT.
- *
- * Original Code. The Original Code is: OpenGL Sample Implementation,
- * Version 1.2.1, released January 26, 2000, developed by Silicon Graphics,
- * Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc.
- * Copyright in any portions created by third parties is as indicated
- * elsewhere herein. All Rights Reserved.
- *
- * Additional Notice Provisions: The application programming interfaces
- * established by SGI in conjunction with the Original Code are The
- * OpenGL(R) Graphics System: A Specification (Version 1.2.1), released
- * April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version
- * 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X
- * Window System(R) (Version 1.3), released October 19, 1998. This software
- * was created using the OpenGL(R) version 1.2.1 Sample Implementation
- * published by SGI, but has not been independently verified as being
- * compliant with the OpenGL(R) version 1.2.1 Specification.
- *
- */
- /*
- * alpha3D.c
- * This program demonstrates how to intermix opaque and
- * alpha blended polygons in the same scene, by using
- * glDepthMask. Press the 'a' key to animate moving the
- * transparent object through the opaque object. Press
- * the 'r' key to reset the scene.
- */
- #include <stdlib.h>
- #include <stdio.h>
- #include "ug.h"
- #define MAXZ 8.0
- #define MINZ -8.0
- #define ZINC 0.4
- static float solidZ = MAXZ;
- static float transparentZ = MINZ;
- static void init(void)
- {
- GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 0.15 };
- GLfloat mat_shininess[] = { 100.0 };
- GLfloat position[] = { 0.5, 0.5, 1.0, 0.0 };
- glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, mat_specular);
- glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, mat_shininess);
- glLightfv(GL_LIGHT0, GL_POSITION, position);
- glEnable(GL_LIGHTING);
- glEnable(GL_LIGHT0);
- glEnable(GL_DEPTH_TEST);
- }
- static void display(UGWindow uwin)
- {
- GLfloat mat_solid[] = { 0.75, 0.75, 0.0, 1.0 };
- GLfloat mat_zero[] = { 0.0, 0.0, 0.0, 1.0 };
- GLfloat mat_transparent[] = { 0.0, 0.8, 0.8, 0.6 };
- GLfloat mat_emission[] = { 0.0, 0.3, 0.3, 0.6 };
- glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- glPushMatrix ();
- glTranslatef (-0.15, -0.15, solidZ);
- glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, mat_zero);
- glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mat_solid);
- ugSolidSpheref(0.4, 32, 32);
- glPopMatrix ();
- glPushMatrix ();
- glTranslatef (0.15, 0.15, transparentZ);
- glRotatef (15.0, 1.0, 1.0, 0.0);
- glRotatef (30.0, 0.0, 1.0, 0.0);
- glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, mat_emission);
- glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mat_transparent);
- glEnable (GL_BLEND);
- glDepthMask (GL_FALSE);
- glBlendFunc (GL_SRC_ALPHA, GL_ONE);
- ugSolidCubef(0.6);
- glDepthMask (GL_TRUE);
- glDisable (GL_BLEND);
- glPopMatrix ();
- ugSwapBuffers(uwin);
- }
- static void reshape(UGWindow uwin, int w, int h)
- {
- glViewport(0, 0, (GLint) w, (GLint) h);
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- if (w <= h)
- glOrthof(-1.5, 1.5, -1.5*(GLfloat)h/(GLfloat)w,
- 1.5*(GLfloat)h/(GLfloat)w, -10.0, 10.0);
- else
- glOrthof(-1.5*(GLfloat)w/(GLfloat)h,
- 1.5*(GLfloat)w/(GLfloat)h, -1.5, 1.5, -10.0, 10.0);
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- }
- static void animate(UGWindow uwin)
- {
- if (solidZ <= MINZ || transparentZ >= MAXZ)
- ugIdleFunc(ugCtxFromWin(uwin), NULL);
- else {
- solidZ -= ZINC;
- transparentZ += ZINC;
- ugPostRedisplay(uwin);
- }
- }
- static void keyboard(UGWindow uwin, int key, int x, int y)
- {
- switch (key) {
- case 'a':
- case 'A':
- solidZ = MAXZ;
- transparentZ = MINZ;
- ugIdleFunc(ugCtxFromWin(uwin), animate);
- break;
- case 'r':
- case 'R':
- solidZ = MAXZ;
- transparentZ = MINZ;
- ugPostRedisplay(uwin);
- break;
- case 27:
- exit(0);
- }
- }
- #ifdef FTK_AS_PLUGIN
- #include "ftk_app_demo.h"
- FTK_HIDE int FTK_MAIN(int argc, char* argv[]);
- FtkApp* ftk_app_demo_alpha3D_create()
- {
- return ftk_app_demo_create(_("alpha3D"), ftk_main);
- }
- #else
- #define FTK_HIDE extern
- #endif /*FTK_AS_PLUGIN*/
- FTK_HIDE int FTK_MAIN(int argc, char* argv[])
- {
- UGCtx ug = ugInit();
- UGWindow uwin = ugCreateWindow (ug, "", "alpha3D", 500, 500, 100, 100);
- init();
- ugDisplayFunc(uwin, display);
- ugReshapeFunc(uwin, reshape);
- ugKeyboardFunc(uwin, keyboard);
- ugIdleFunc(ugCtxFromWin(uwin), animate);
- #ifndef FTK_AS_PLUGIN
- ugMainLoop(ug);
- #endif
- return 0;
- }