1/*
2 * Copyright (c) 1991, 1992, 1993 Silicon Graphics, Inc.
3 *
4 * Permission to use, copy, modify, distribute, and sell this software and
5 * its documentation for any purpose is hereby granted without fee, provided
6 * that (i) the above copyright notices and this permission notice appear in
7 * all copies of the software and related documentation, and (ii) the name of
8 * Silicon Graphics may not be used in any advertising or
9 * publicity relating to the software without the specific, prior written
10 * permission of Silicon Graphics.
11 *
12 * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF
13 * ANY KIND,
14 * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
15 * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
16 *
17 * IN NO EVENT SHALL SILICON GRAPHICS BE LIABLE FOR
18 * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
19 * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
20 * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
21 * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
22 * OF THIS SOFTWARE.
23 */
24
25#include <stdio.h>
26#include <string.h>
27#include <stdlib.h>
28#include "glut_wrap.h"
29
30GLenum doubleBuffer = 1;
31int win;
32static float tx = 0;
33static float ty = 0;
34static float tw = 0;
35static float th = 0;
36static float z = -5;
37
38
39static float win_width = 250;
40static float win_height = 250;
41static enum {
42   ORTHO,
43   FRUSTUM,
44   MODE_MAX
45} mode = ORTHO;
46
47static void Init(void)
48{
49   fprintf(stderr, "GL_RENDERER   = %s\n", (char *) glGetString(GL_RENDERER));
50   fprintf(stderr, "GL_VERSION    = %s\n", (char *) glGetString(GL_VERSION));
51   fprintf(stderr, "GL_VENDOR     = %s\n", (char *) glGetString(GL_VENDOR));
52   fflush(stderr);
53
54   glClearColor(0, 0, 0, 0.0);
55}
56
57static void Reshape(int width, int height)
58{
59   win_width = width;
60   win_height = height;
61   glutPostRedisplay();
62}
63
64
65static void Key(unsigned char key, int x, int y)
66{
67   switch (key) {
68   case 27:
69      exit(0);
70   case 'w':
71      tw += 1.0;
72      break;
73   case 'W':
74      tw -= 1.0;
75      break;
76   case 'h':
77      th += 1.0;
78      break;
79   case 'H':
80      th -= 1.0;
81      break;
82
83   case 'z':
84      z += 1.0;
85      break;
86   case 'Z':
87      z -= 1.0;
88      break;
89   case 'm':
90      mode++;
91      mode %= MODE_MAX;
92      break;
93   case ' ':
94      tw = th = tx = ty = 0;
95      z = -5;
96      mode = ORTHO;
97      break;
98   default:
99      break;
100   }
101   glutPostRedisplay();
102}
103
104
105static void Draw(void)
106{
107   int i;
108   float w = tw + win_width;
109   float h = th + win_height;
110
111   fprintf(stderr, "glViewport(%f %f %f %f)\n", tx, ty, w, h);
112   fprintf(stderr, "mode: %s\n", mode == FRUSTUM ? "FRUSTUM" : "ORTHO");
113   fprintf(stderr, "z: %f\n", z);
114   fflush(stderr);
115
116   glMatrixMode(GL_PROJECTION);
117   glLoadIdentity();
118
119   switch (mode) {
120   case FRUSTUM:
121      glFrustum(-1.0, 1.0, -1.0, 1.0, 5.0, 25.0);
122      break;
123   case ORTHO:
124   default:
125      glOrtho(-1.0, 1.0, -1.0, 1.0, -0.5, 1000.0);
126      break;
127   }
128
129   glMatrixMode(GL_MODELVIEW);
130   glLoadIdentity();
131
132
133   glClear(GL_COLOR_BUFFER_BIT);
134
135
136   /***********************************************************************
137    * Should be clipped to be no larger than the triangles:
138    */
139   glViewport(tx, ty, w, h);
140
141   glBegin(GL_POLYGON);
142   glColor3f(1,1,0);
143   glVertex3f(-100, -100, z);
144   glVertex3f(-100, 100, z);
145   glVertex3f(100, 100, z);
146   glVertex3f(100, -100, z);
147   glEnd();
148
149   glBegin(GL_POLYGON);
150   glColor3f(0,1,1);
151   glVertex3f(-10, -10, z);
152   glVertex3f(-10, 10, z);
153   glVertex3f(10, 10, z);
154   glVertex3f(10, -10, z);
155   glEnd();
156
157   glBegin(GL_POLYGON);
158   glColor3f(1,0,0);
159   glVertex3f(-2, -2, z);
160   glVertex3f(-2, 2, z);
161   glVertex3f(2, 2, z);
162   glVertex3f(2, -2, z);
163   glEnd();
164
165
166   glBegin(GL_POLYGON);
167   glColor3f(.5,.5,1);
168   glVertex3f(-1, -1, z);
169   glVertex3f(-1, 1, z);
170   glVertex3f(1, 1, z);
171   glVertex3f(1, -1, z);
172   glEnd();
173
174   /***********************************************************************
175    */
176   glViewport(0, 0, win_width, win_height);
177   glBegin(GL_LINES);
178   glColor3f(1,1,0);
179   glVertex3f(-1, 0, z);
180   glVertex3f(1, 0, z);
181
182   glVertex3f(0,  -1, z);
183   glVertex3f(0,  1, z);
184   glEnd();
185
186
187   /***********************************************************************
188    */
189   glViewport(tx, ty, w, h);
190   glBegin(GL_TRIANGLES);
191   glColor3f(1,0,0);
192   glVertex3f(-1, -1, z);
193   glVertex3f(0, -1, z);
194   glVertex3f(-.5,  -.5, z);
195
196   glColor3f(1,1,1);
197   glVertex3f(0, -1, z);
198   glVertex3f(1, -1, z);
199   glVertex3f(.5,  -.5, z);
200
201   glVertex3f(-.5, -.5, z);
202   glVertex3f(.5, -.5, z);
203   glVertex3f(0,  0, z);
204
205
206   glColor3f(0,1,0);
207   glVertex3f(1, 1, z);
208   glVertex3f(0, 1, z);
209   glVertex3f(.5,  .5, z);
210
211   glColor3f(1,1,1);
212   glVertex3f(0, 1, z);
213   glVertex3f(-1, 1, z);
214   glVertex3f(-.5,  .5, z);
215
216   glVertex3f(.5, .5, z);
217   glVertex3f(-.5, .5, z);
218   glVertex3f( 0,  0, z);
219
220   glEnd();
221
222
223   glViewport(0, 0, win_width, win_height);
224
225   glBegin(GL_LINES);
226   glColor3f(.5,.5,0);
227   for (i = -10; i < 10; i++) {
228      float f = i / 10.0;
229
230      if (i == 0)
231         continue;
232
233      glVertex3f(-1, f, z);
234      glVertex3f(1, f, z);
235
236      glVertex3f(f, -1, z);
237      glVertex3f(f, 1, z);
238   }
239   glEnd();
240
241
242
243   glFlush();
244
245   if (doubleBuffer) {
246      glutSwapBuffers();
247   }
248}
249
250static GLenum Args(int argc, char **argv)
251{
252   GLint i;
253
254   if (getenv("VPX"))
255      tx = atof(getenv("VPX"));
256
257   if (getenv("VPY"))
258      ty = atof(getenv("VPY"));
259
260
261   for (i = 1; i < argc; i++) {
262      if (strcmp(argv[i], "-sb") == 0) {
263         doubleBuffer = GL_FALSE;
264      } else if (strcmp(argv[i], "-db") == 0) {
265         doubleBuffer = GL_TRUE;
266      } else {
267         fprintf(stderr, "%s (Bad option).\n", argv[i]);
268         return GL_FALSE;
269      }
270   }
271   return GL_TRUE;
272}
273
274
275static void
276special(int k, int x, int y)
277{
278   switch (k) {
279   case GLUT_KEY_UP:
280      ty += 1.0;
281      break;
282   case GLUT_KEY_DOWN:
283      ty -= 1.0;
284      break;
285   case GLUT_KEY_LEFT:
286      tx -= 1.0;
287      break;
288   case GLUT_KEY_RIGHT:
289      tx += 1.0;
290      break;
291   default:
292      break;
293   }
294   glutPostRedisplay();
295}
296
297
298int main(int argc, char **argv)
299{
300   GLenum type;
301
302   glutInit(&argc, argv);
303
304   if (Args(argc, argv) == GL_FALSE) {
305      exit(1);
306   }
307
308   glutInitWindowPosition(0, 0); glutInitWindowSize( 250, 250);
309
310   type = GLUT_RGB | GLUT_ALPHA;
311   type |= (doubleBuffer) ? GLUT_DOUBLE : GLUT_SINGLE;
312   glutInitDisplayMode(type);
313
314   win = glutCreateWindow(*argv);
315   if (!win) {
316      exit(1);
317   }
318
319   Init();
320
321   glutReshapeFunc(Reshape);
322   glutKeyboardFunc(Key);
323   glutSpecialFunc(special);
324   glutDisplayFunc(Draw);
325   glutMainLoop();
326   return 0;
327}
328