~ubuntu-branches/ubuntu/oneiric/mesa-demos/oneiric

« back to all changes in this revision

Viewing changes to src/redbook/feedback.c

  • Committer: Bazaar Package Importer
  • Author(s): Christopher James Halse Rogers
  • Date: 2010-09-27 16:18:27 UTC
  • Revision ID: james.westby@ubuntu.com-20100927161827-1yfgolc1oy9sjhi8
Tags: upstream-8.0.1
ImportĀ upstreamĀ versionĀ 8.0.1

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * Copyright (c) 1993-1997, Silicon Graphics, Inc.
 
3
 * ALL RIGHTS RESERVED 
 
4
 * Permission to use, copy, modify, and distribute this software for 
 
5
 * any purpose and without fee is hereby granted, provided that the above
 
6
 * copyright notice appear in all copies and that both the copyright notice
 
7
 * and this permission notice appear in supporting documentation, and that 
 
8
 * the name of Silicon Graphics, Inc. not be used in advertising
 
9
 * or publicity pertaining to distribution of the software without specific,
 
10
 * written prior permission. 
 
11
 *
 
12
 * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
 
13
 * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
 
14
 * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
 
15
 * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
 
16
 * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
 
17
 * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
 
18
 * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
 
19
 * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
 
20
 * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
 
21
 * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
 
22
 * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
 
23
 * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
 
24
 * 
 
25
 * US Government Users Restricted Rights 
 
26
 * Use, duplication, or disclosure by the Government is subject to
 
27
 * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
 
28
 * (c)(1)(ii) of the Rights in Technical Data and Computer Software
 
29
 * clause at DFARS 252.227-7013 and/or in similar or successor
 
30
 * clauses in the FAR or the DOD or NASA FAR Supplement.
 
31
 * Unpublished-- rights reserved under the copyright laws of the
 
32
 * United States.  Contractor/manufacturer is Silicon Graphics,
 
33
 * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
 
34
 *
 
35
 * OpenGL(R) is a registered trademark of Silicon Graphics, Inc.
 
36
 */
 
37
 
 
38
/*
 
39
 * feedback.c
 
40
 * This program demonstrates use of OpenGL feedback.  First,
 
41
 * a lighting environment is set up and a few lines are drawn.
 
42
 * Then feedback mode is entered, and the same lines are 
 
43
 * drawn.  The results in the feedback buffer are printed.
 
44
 */
 
45
#include <GL/glut.h>
 
46
#include <stdlib.h>
 
47
#include <stdio.h>
 
48
 
 
49
/*  Initialize lighting.
 
50
 */
 
51
static void init(void)
 
52
{
 
53
   glEnable(GL_LIGHTING);
 
54
   glEnable(GL_LIGHT0);
 
55
}
 
56
 
 
57
/* Draw a few lines and two points, one of which will 
 
58
 * be clipped.  If in feedback mode, a passthrough token 
 
59
 * is issued between the each primitive.
 
60
 */
 
61
static void drawGeometry (GLenum mode)
 
62
{
 
63
   glBegin (GL_LINE_STRIP);
 
64
   glNormal3f (0.0, 0.0, 1.0);
 
65
   glVertex3f (30.0, 30.0, 0.0);
 
66
   glVertex3f (50.0, 60.0, 0.0);
 
67
   glVertex3f (70.0, 40.0, 0.0);
 
68
   glEnd ();
 
69
   if (mode == GL_FEEDBACK)
 
70
      glPassThrough (1.0);
 
71
   glBegin (GL_POINTS);
 
72
   glVertex3f (-100.0, -100.0, -100.0);  /*  will be clipped  */
 
73
   glEnd ();
 
74
   if (mode == GL_FEEDBACK)
 
75
      glPassThrough (2.0);
 
76
   glBegin (GL_POINTS);
 
77
   glNormal3f (0.0, 0.0, 1.0);
 
78
   glVertex3f (50.0, 50.0, 0.0);
 
79
   glEnd ();
 
80
}
 
81
 
 
82
/* Write contents of one vertex to stdout.      */
 
83
static void print3DcolorVertex (GLint size, GLint *count, 
 
84
                                GLfloat *buffer)
 
85
{
 
86
   int i;
 
87
 
 
88
   printf ("  ");
 
89
   for (i = 0; i < 7; i++) {
 
90
      printf ("%4.2f ", buffer[size-(*count)]);
 
91
      *count = *count - 1;
 
92
   }
 
93
   printf ("\n");
 
94
}
 
95
 
 
96
/*  Write contents of entire buffer.  (Parse tokens!)   */
 
97
static void printBuffer(GLint size, GLfloat *buffer)
 
98
{
 
99
   GLint count;
 
100
   GLfloat token;
 
101
 
 
102
   count = size;
 
103
   while (count) {
 
104
      token = buffer[size-count]; count--;
 
105
      if (token == GL_PASS_THROUGH_TOKEN) {
 
106
         printf ("GL_PASS_THROUGH_TOKEN\n");
 
107
         printf ("  %4.2f\n", buffer[size-count]);
 
108
         count--;
 
109
      }
 
110
      else if (token == GL_POINT_TOKEN) {
 
111
         printf ("GL_POINT_TOKEN\n");
 
112
         print3DcolorVertex (size, &count, buffer);
 
113
      }
 
114
      else if (token == GL_LINE_TOKEN) {
 
115
         printf ("GL_LINE_TOKEN\n");
 
116
         print3DcolorVertex (size, &count, buffer);
 
117
         print3DcolorVertex (size, &count, buffer);
 
118
      }
 
119
      else if (token == GL_LINE_RESET_TOKEN) {
 
120
         printf ("GL_LINE_RESET_TOKEN\n");
 
121
         print3DcolorVertex (size, &count, buffer);
 
122
         print3DcolorVertex (size, &count, buffer);
 
123
      }
 
124
   }
 
125
}
 
126
 
 
127
static void display(void)
 
128
{
 
129
   GLfloat feedBuffer[1024];
 
130
   GLint size;
 
131
 
 
132
   glMatrixMode (GL_PROJECTION);
 
133
   glLoadIdentity ();
 
134
   glOrtho (0.0, 100.0, 0.0, 100.0, 0.0, 1.0);
 
135
 
 
136
   glClearColor (0.0, 0.0, 0.0, 0.0);
 
137
   glClear(GL_COLOR_BUFFER_BIT);
 
138
   drawGeometry (GL_RENDER);
 
139
 
 
140
   glFeedbackBuffer (1024, GL_3D_COLOR, feedBuffer);
 
141
   (void) glRenderMode (GL_FEEDBACK);
 
142
   drawGeometry (GL_FEEDBACK);
 
143
 
 
144
   size = glRenderMode (GL_RENDER);
 
145
   printBuffer (size, feedBuffer);
 
146
 
 
147
   glFinish();
 
148
}
 
149
 
 
150
/* ARGSUSED1 */
 
151
static void keyboard(unsigned char key, int x, int y)
 
152
{
 
153
   switch (key) {
 
154
      case 27:
 
155
         exit(0);
 
156
         break;
 
157
   }
 
158
}
 
159
 
 
160
/*  Main Loop  */
 
161
int main(int argc, char** argv)
 
162
{
 
163
   glutInit(&argc, argv);
 
164
   glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
 
165
   glutInitWindowSize (100, 100);
 
166
   glutInitWindowPosition (100, 100);
 
167
   glutCreateWindow(argv[0]);
 
168
   init();
 
169
   glutDisplayFunc(display);
 
170
   glutKeyboardFunc (keyboard);
 
171
   glutMainLoop();
 
172
   return 0; 
 
173
}