/opengles/redbook/fog.c
http://ftk.googlecode.com/ · C · 182 lines · 116 code · 14 blank · 52 comment · 10 complexity · dd653fc2efc8c0400ee39c6444f9701b 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.
- *
- */
- /*
- * fog.c
- * This program draws 5 red spheres, each at a different
- * z distance from the eye, in different types of fog.
- * Pressing the f key chooses between 3 types of
- * fog: exponential, exponential squared, and linear.
- * In this program, there is a fixed density value, as well
- * as fixed start and end values for the linear fog.
- */
- #include <math.h>
- #include <stdlib.h>
- #include <stdio.h>
- #include "ug.h"
- static GLint fogMode;
- /* Initialize depth buffer, fog, light source,
- * material property, and lighting model.
- */
- static void init(void)
- {
- GLfloat position[] = { 0.5, 0.5, 3.0, 0.0 };
- glEnable(GL_DEPTH_TEST);
- glLightfv(GL_LIGHT0, GL_POSITION, position);
- glEnable(GL_LIGHTING);
- glEnable(GL_LIGHT0);
- {
- GLfloat mat[3] = {0.1745, 0.01175, 0.01175};
- glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT, mat);
- mat[0] = 0.61424; mat[1] = 0.04136; mat[2] = 0.04136;
- glMaterialfv (GL_FRONT_AND_BACK, GL_DIFFUSE, mat);
- mat[0] = 0.727811; mat[1] = 0.626959; mat[2] = 0.626959;
- glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, mat);
- glMaterialf (GL_FRONT_AND_BACK, GL_SHININESS, 0.6*128.0);
- }
- glEnable(GL_FOG);
- {
- GLfloat fogColor[4] = {0.5, 0.5, 0.5, 1.0};
- fogMode = GL_EXP;
- glFogx (GL_FOG_MODE, fogMode);
- glFogfv (GL_FOG_COLOR, fogColor);
- glFogf (GL_FOG_DENSITY, 0.35);
- glHint (GL_FOG_HINT, GL_DONT_CARE);
- glFogf (GL_FOG_START, 1.0);
- glFogf (GL_FOG_END, 5.0);
- }
- glClearColor(0.5, 0.5, 0.5, 1.0); /* fog color */
- }
- static void renderSphere (GLfloat x, GLfloat y, GLfloat z)
- {
- glPushMatrix();
- glTranslatef (x, y, z);
- ugSolidSpheref(0.4, 32, 32);
- glPopMatrix();
- }
- /* display() draws 5 spheres at different z positions.
- */
- static void display(UGWindow uwin)
- {
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- renderSphere (-2., -0.5, -1.0);
- renderSphere (-1., -0.5, -2.0);
- renderSphere (0., -0.5, -3.0);
- renderSphere (1., -0.5, -4.0);
- renderSphere (2., -0.5, -5.0);
- glFlush();
- ugSwapBuffers(uwin);
- }
- static void reshape(UGWindow uwin, int w, int h)
- {
- glViewport(0, 0, (GLsizei) w, (GLsizei) h);
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- if (w <= h)
- glOrthof(-2.5, 2.5, -2.5*(GLfloat)h/(GLfloat)w,
- 2.5*(GLfloat)h/(GLfloat)w, -10.0, 10.0);
- else
- glOrthof(-2.5*(GLfloat)w/(GLfloat)h,
- 2.5*(GLfloat)w/(GLfloat)h, -2.5, 2.5, -10.0, 10.0);
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity ();
- }
- static void keyboard(UGWindow uwin, int key, int x, int y)
- {
- switch (key) {
- case 'f':
- case 'F':
- if (fogMode == GL_EXP) {
- fogMode = GL_EXP2;
- printf ("Fog mode is GL_EXP2\n");
- }
- else if (fogMode == GL_EXP2) {
- fogMode = GL_LINEAR;
- printf ("Fog mode is GL_LINEAR\n");
- }
- else if (fogMode == GL_LINEAR) {
- fogMode = GL_EXP;
- printf ("Fog mode is GL_EXP\n");
- }
- glFogx(GL_FOG_MODE, fogMode);
- ugPostRedisplay(uwin);
- break;
- case 27:
- exit(0);
- break;
- default:
- break;
- }
- }
- /* Main Loop
- * Open window with initial window size, title bar,
- * RGBA display mode, depth buffer, and handle input events.
- */
- #ifdef FTK_AS_PLUGIN
- #include "ftk_app_demo.h"
- FTK_HIDE int FTK_MAIN(int argc, char* argv[]);
- FtkApp* ftk_app_demo_fog_create()
- {
- return ftk_app_demo_create(_("fog"), 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, "UG_DEPTH", "fog", 500, 500, 100, 100);
- init();
- ugDisplayFunc(uwin, display);
- ugReshapeFunc(uwin, reshape);
- ugKeyboardFunc(uwin, keyboard);
- #ifndef FTK_AS_PLUGIN
- ugMainLoop(ug);
- #endif
- return 0;
- }