1 /* 2 ** License Applicability. Except to the extent portions of this file are 3 ** made subject to an alternative license as permitted in the SGI Free 4 ** Software License B, Version 1.1 (the "License"), the contents of this 5 ** file are subject only to the provisions of the License. You may not use 6 ** this file except in compliance with the License. You may obtain a copy 7 ** of the License at Silicon Graphics, Inc., attn: Legal Services, 1600 8 ** Amphitheatre Parkway, Mountain View, CA 94043-1351, or at: 9 ** 10 ** http://oss.sgi.com/projects/FreeB 11 ** 12 ** Note that, as provided in the License, the Software is distributed on an 13 ** "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS 14 ** DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND 15 ** CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A 16 ** PARTICULAR PURPOSE, AND NON-INFRINGEMENT. 17 ** 18 ** Original Code. The Original Code is: OpenGL Sample Implementation, 19 ** Version 1.2.1, released January 26, 2000, developed by Silicon Graphics, 20 ** Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc. 21 ** Copyright in any portions created by third parties is as indicated 22 ** elsewhere herein. All Rights Reserved. 23 ** 24 ** Additional Notice Provisions: The application programming interfaces 25 ** established by SGI in conjunction with the Original Code are The 26 ** OpenGL(R) Graphics System: A Specification (Version 1.2.1), released 27 ** April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version 28 ** 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X 29 ** Window System(R) (Version 1.3), released October 19, 1998. This software 30 ** was created using the OpenGL(R) version 1.2.1 Sample Implementation 31 ** published by SGI, but has not been independently verified as being 32 ** compliant with the OpenGL(R) version 1.2.1 Specification. 33 ** 34 */ 35 /* 36 */ 37 38 #include "gluos.h" 39 //#include <stdlib.h> 40 //#include <stdio.h> 41 #include <assert.h> 42 #include <GL/gl.h> 43 44 #include "primitiveStream.h" 45 46 Int primStream::num_triangles() 47 { 48 Int i; 49 Int ret=0; 50 for(i=0; i<index_lengths; i++) 51 { 52 ret += lengths[i]-2; 53 } 54 return ret; 55 } 56 57 58 59 /*the begining of inserting a new primitive. 60 *reset counter to be 0. 61 */ 62 void primStream::begin() 63 { 64 counter = 0; 65 } 66 67 void primStream::insert(Real u, Real v) 68 { 69 /*if the space cannot hold u and v, 70 *we have to expand the array 71 */ 72 if(index_vertices+1 >= size_vertices) { 73 Real* temp = (Real*) malloc (sizeof(Real) * (2*size_vertices + 2)); 74 assert(temp); 75 76 /*copy*/ 77 for(Int i=0; i<index_vertices; i++) 78 temp[i] = vertices[i]; 79 80 free(vertices); 81 vertices = temp; 82 size_vertices = 2*size_vertices + 2; 83 } 84 85 vertices[index_vertices++] = u; 86 vertices[index_vertices++] = v; 87 counter++; 88 } 89 90 /*the end of a primitive. 91 *increase index_lengths 92 */ 93 void primStream::end(Int type) 94 { 95 Int i; 96 /*if there is no vertex in this primitive, 97 *nothing needs to be done 98 */ 99 if(counter == 0) return ; 100 101 if(index_lengths >= size_lengths){ 102 Int* temp = (Int*) malloc(sizeof(Int) * (2*size_lengths + 2)); 103 assert(temp); 104 Int* tempTypes = (Int*) malloc(sizeof(Int) * (2*size_lengths + 2)); 105 assert(tempTypes); 106 107 /*copy*/ 108 for(i=0; i<index_lengths; i++){ 109 temp[i] = lengths[i]; 110 tempTypes[i] = types[i]; 111 } 112 113 free(lengths); 114 free(types); 115 lengths = temp; 116 types = tempTypes; 117 size_lengths = 2*size_lengths + 2; 118 } 119 lengths[index_lengths] = counter; 120 types[index_lengths] = type; 121 index_lengths++; 122 } 123 124 void primStream::print() 125 { 126 Int i,j,k; 127 printf("index_lengths=%i,size_lengths=%i\n", index_lengths, size_lengths); 128 printf("index_vertices=%i,size_vertices=%i\n", index_vertices, size_vertices); 129 k=0; 130 for(i=0; i<index_lengths; i++) 131 { 132 if(types[i] == PRIMITIVE_STREAM_FAN) 133 printf("primitive-FAN:\n"); 134 else 135 printf("primitive-STRIP:\n"); 136 for(j=0; j<lengths[i]; j++) 137 { 138 printf("(%f,%f) ", vertices[k], vertices[k+1]); 139 k += 2; 140 } 141 printf("\n"); 142 } 143 } 144 145 primStream::primStream(Int sizeLengths, Int sizeVertices) 146 { 147 lengths = (Int*)malloc (sizeof(Int) * sizeLengths); 148 assert(lengths); 149 types = (Int*)malloc (sizeof(Int) * sizeLengths); 150 assert(types); 151 152 vertices = (Real*) malloc(sizeof(Real) * sizeVertices); 153 assert(vertices); 154 155 index_lengths = 0; 156 index_vertices = 0; 157 size_lengths = sizeLengths; 158 size_vertices = sizeVertices; 159 160 counter = 0; 161 } 162 163 primStream::~primStream() 164 { 165 free(lengths); 166 free(types); 167 free(vertices); 168 } 169 170 void primStream::draw() 171 { 172 Int i,j,k; 173 k=0; 174 for(i=0; i<index_lengths; i++) 175 { 176 switch(types[i]){ 177 case PRIMITIVE_STREAM_FAN: 178 glBegin(GL_TRIANGLE_FAN); 179 break; 180 case PRIMITIVE_STREAM_STRIP: 181 glBegin(GL_TRIANGLE_STRIP); 182 break; 183 } 184 185 for(j=0; j<lengths[i]; j++){ 186 glVertex2fv(vertices+k); 187 k += 2; 188 } 189 glEnd(); 190 } 191 } 192 193