root / PyOpenGL-Demo / redbook / fog.py @ 11
History | View | Annotate | Download (5.1 kB)
1 |
#!/usr/bin/python
|
---|---|
2 |
|
3 |
# This is statement is required by the build system to query build info
|
4 |
if __name__ == '__build__': |
5 |
raise(Exception) |
6 |
|
7 |
'''
|
8 |
fog.c from the Redbook examples.
|
9 |
Converted to Python by Jason L. Petrone 7/00
|
10 |
|
11 |
/*
|
12 |
* Copyright (c) 1993-1997, Silicon Graphics, Inc.
|
13 |
* ALL RIGHTS RESERVED
|
14 |
* Permission to use, copy, modify, and distribute this software for
|
15 |
* any purpose and without fee is hereby granted, provided that the above
|
16 |
* copyright notice appear in all copies and that both the copyright notice
|
17 |
* and this permission notice appear in supporting documentation, and that
|
18 |
* the name of Silicon Graphics, Inc. not be used in advertising
|
19 |
* or publicity pertaining to distribution of the software without specific,
|
20 |
* written prior permission.
|
21 |
*
|
22 |
* THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
|
23 |
* AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
|
24 |
* INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
|
25 |
* FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
|
26 |
* GRAPHICS, INC. BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
|
27 |
* SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
|
28 |
* KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
|
29 |
* LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
|
30 |
* THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC. HAS BEEN
|
31 |
* ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
|
32 |
* ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
|
33 |
* POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
|
34 |
*
|
35 |
* US Government Users Restricted Rights
|
36 |
* Use, duplication, or disclosure by the Government is subject to
|
37 |
* restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
|
38 |
* (c)(1)(ii) of the Rights in Technical Data and Computer Software
|
39 |
* clause at DFARS 252.227-7013 and/or in similar or successor
|
40 |
* clauses in the FAR or the DOD or NASA FAR Supplement.
|
41 |
* Unpublished-- rights reserved under the copyright laws of the
|
42 |
* United States. Contractor/manufacturer is Silicon Graphics,
|
43 |
* Inc., 2011 N. Shoreline Blvd., Mountain View, CA 94039-7311.
|
44 |
*
|
45 |
* OpenGL(R) is a registered trademark of Silicon Graphics, Inc.
|
46 |
*/
|
47 |
'''
|
48 |
|
49 |
'''
|
50 |
/*
|
51 |
* fog.c
|
52 |
* This program draws 5 red spheres, each at a different
|
53 |
* z distance from the eye, in different types of fog.
|
54 |
* Pressing the f key chooses between 3 types of
|
55 |
* fog: exponential, exponential squared, and linear.
|
56 |
* In this program, there is a fixed density value, as well
|
57 |
* as fixed start and end values for the linear fog.
|
58 |
*/
|
59 |
'''
|
60 |
|
61 |
import sys |
62 |
|
63 |
try:
|
64 |
from OpenGL.GLUT import * |
65 |
from OpenGL.GL import * |
66 |
except:
|
67 |
print('''
|
68 |
ERROR: PyOpenGL not installed properly.
|
69 |
''')
|
70 |
sys.exit() |
71 |
|
72 |
|
73 |
# Initialize depth buffer, fog, light source,
|
74 |
# material property, and lighting model.
|
75 |
|
76 |
def init(): |
77 |
position = [ 0.5, 0.5, 3.0, 0.0 ] |
78 |
glEnable(GL_DEPTH_TEST) |
79 |
glLightfv(GL_LIGHT0, GL_POSITION, position) |
80 |
glEnable(GL_LIGHTING) |
81 |
glEnable(GL_LIGHT0) |
82 |
mat = [0.1745, 0.01175, 0.01175, 1.0] |
83 |
glMaterialfv(GL_FRONT, GL_AMBIENT, mat) |
84 |
mat[0] = 0.61424; mat[1] = 0.04136; mat[2] = 0.04136 |
85 |
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat) |
86 |
mat[0] = 0.727811; mat[1] = 0.626959; mat[2] = 0.626959 |
87 |
glMaterialfv(GL_FRONT, GL_SPECULAR, mat) |
88 |
glMaterialf(GL_FRONT, GL_SHININESS, 0.6*128.0) |
89 |
|
90 |
glEnable(GL_FOG) |
91 |
fogColor = [0.5, 0.5, 0.5, 1.0] |
92 |
|
93 |
global fogMode
|
94 |
fogMode = GL_EXP |
95 |
glFogi (GL_FOG_MODE, fogMode) |
96 |
glFogfv (GL_FOG_COLOR, fogColor) |
97 |
glFogf (GL_FOG_DENSITY, 0.35)
|
98 |
glHint (GL_FOG_HINT, GL_DONT_CARE) |
99 |
glFogf (GL_FOG_START, 1.0)
|
100 |
glFogf (GL_FOG_END, 5.0)
|
101 |
glClearColor(0.5, 0.5, 0.5, 1.0) |
102 |
|
103 |
def renderSphere(x, y, z): |
104 |
glPushMatrix() |
105 |
glTranslatef (x, y, z) |
106 |
glutSolidSphere(0.4, 16, 16) |
107 |
glPopMatrix() |
108 |
|
109 |
# display() draws 5 spheres at different z positions.
|
110 |
def display(): |
111 |
print('redisplay')
|
112 |
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) |
113 |
renderSphere (-2., -0.5, -1.0) |
114 |
renderSphere (-1., -0.5, -2.0) |
115 |
renderSphere (0., -0.5, -3.0) |
116 |
renderSphere (1., -0.5, -4.0) |
117 |
renderSphere (2., -0.5, -5.0) |
118 |
glFlush() |
119 |
|
120 |
def reshape(w, h): |
121 |
glViewport(0, 0, w, h) |
122 |
glMatrixMode(GL_PROJECTION) |
123 |
glLoadIdentity() |
124 |
if (w <= h):
|
125 |
glOrtho(-2.5, 2.5, -2.5*h/w, 2.5*h/w, -10.0, 10.0) |
126 |
else:
|
127 |
glOrtho(-2.5*w/h, 2.5*w/h, -2.5, 2.5, -10.0, 10.0) |
128 |
glMatrixMode(GL_MODELVIEW) |
129 |
glLoadIdentity() |
130 |
|
131 |
def keyboard(key, x, y): |
132 |
global fogMode
|
133 |
if key in [b'f',b'F']: |
134 |
if (fogMode == GL_EXP):
|
135 |
fogMode = GL_EXP2; |
136 |
print("Fog mode is GL_EXP2")
|
137 |
elif (fogMode == GL_EXP2):
|
138 |
fogMode = GL_LINEAR |
139 |
print("Fog mode is GL_LINEAR")
|
140 |
elif (fogMode == GL_LINEAR):
|
141 |
fogMode = GL_EXP |
142 |
print("Fog mode is GL_EXP")
|
143 |
glFogi(GL_FOG_MODE, fogMode) |
144 |
glutPostRedisplay() |
145 |
|
146 |
elif ord(key) == 27: |
147 |
sys.exit() |
148 |
|
149 |
|
150 |
# Main Loop
|
151 |
# Open window with initial window size, title bar,
|
152 |
# RGBA display mode, depth buffer, and handle input events.
|
153 |
|
154 |
glutInit(sys.argv) |
155 |
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH); |
156 |
glutInitWindowSize(500, 500) |
157 |
glutCreateWindow(b'fog')
|
158 |
init() |
159 |
glutReshapeFunc(reshape) |
160 |
glutKeyboardFunc(keyboard) |
161 |
glutDisplayFunc(display) |
162 |
glutMainLoop() |