feedback.c revision 32001f49
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 "glut_wrap.h" 46#include <stdlib.h> 47#include <stdio.h> 48 49/* Initialize lighting. 50 */ 51static 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 */ 61static 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. */ 83static 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!) */ 97static 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 127static 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 */ 151static 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 */ 161int 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} 174