xref: /haiku/src/apps/glteapot/GLObject.cpp (revision c8c44fa0297afaa3ef4bfac13d6600436f34d93c)
1*c8c44fa0SJérôme Duval /*
2*c8c44fa0SJérôme Duval 	Copyright 1999, Be Incorporated.   All Rights Reserved.
3*c8c44fa0SJérôme Duval 	This file may be used under the terms of the Be Sample Code License.
4*c8c44fa0SJérôme Duval */
5*c8c44fa0SJérôme Duval 
6*c8c44fa0SJérôme Duval #include <stdlib.h>
7*c8c44fa0SJérôme Duval #include <GL/gl.h>
8*c8c44fa0SJérôme Duval 
9*c8c44fa0SJérôme Duval #include <InterfaceKit.h>
10*c8c44fa0SJérôme Duval 
11*c8c44fa0SJérôme Duval #include "GLObject.h"
12*c8c44fa0SJérôme Duval #include "glob.h"
13*c8c44fa0SJérôme Duval 
14*c8c44fa0SJérôme Duval struct material {
15*c8c44fa0SJérôme Duval 	float ambient[3],diffuse[3],specular[3];
16*c8c44fa0SJérôme Duval };
17*c8c44fa0SJérôme Duval 
18*c8c44fa0SJérôme Duval float *colors[] =
19*c8c44fa0SJérôme Duval {
20*c8c44fa0SJérôme Duval 	NULL,white,yellow,blue,red,green
21*c8c44fa0SJérôme Duval };
22*c8c44fa0SJérôme Duval 
23*c8c44fa0SJérôme Duval material materials[] = {
24*c8c44fa0SJérôme Duval 	// Null
25*c8c44fa0SJérôme Duval 	{
26*c8c44fa0SJérôme Duval 		{0.1745, 0.03175, 0.03175},
27*c8c44fa0SJérôme Duval 		{0.61424, 0.10136, 0.10136},
28*c8c44fa0SJérôme Duval 		{0.727811, 0.626959, 0.626959}
29*c8c44fa0SJérôme Duval 	},
30*c8c44fa0SJérôme Duval 	// White
31*c8c44fa0SJérôme Duval 	{
32*c8c44fa0SJérôme Duval 		{0.1745, 0.1745, 0.1745},
33*c8c44fa0SJérôme Duval 		{0.61424, 0.61424, 0.61424},
34*c8c44fa0SJérôme Duval 		{0.727811, 0.727811, 0.727811}
35*c8c44fa0SJérôme Duval 	},
36*c8c44fa0SJérôme Duval 	// Yellow
37*c8c44fa0SJérôme Duval 	{
38*c8c44fa0SJérôme Duval 		{0.1745, 0.1745, 0.03175},
39*c8c44fa0SJérôme Duval 		{0.61424, 0.61424, 0.10136},
40*c8c44fa0SJérôme Duval 		{0.727811, 0.727811, 0.626959}
41*c8c44fa0SJérôme Duval 	},
42*c8c44fa0SJérôme Duval 	// Blue
43*c8c44fa0SJérôme Duval 	{
44*c8c44fa0SJérôme Duval 		{0.03175, 0.03175, 0.1745},
45*c8c44fa0SJérôme Duval 		{0.10136, 0.10136, 0.61424},
46*c8c44fa0SJérôme Duval 		{0.626959, 0.626959, 0.727811}
47*c8c44fa0SJérôme Duval 	},
48*c8c44fa0SJérôme Duval 	// Red
49*c8c44fa0SJérôme Duval 	{
50*c8c44fa0SJérôme Duval 		{0.1745, 0.03175, 0.03175},
51*c8c44fa0SJérôme Duval 		{0.61424, 0.10136, 0.10136},
52*c8c44fa0SJérôme Duval 		{0.727811, 0.626959, 0.626959}
53*c8c44fa0SJérôme Duval 	},
54*c8c44fa0SJérôme Duval 	// Green
55*c8c44fa0SJérôme Duval 	{
56*c8c44fa0SJérôme Duval 		{0.03175, 0.1745, 0.03175},
57*c8c44fa0SJérôme Duval 		{0.10136, 0.61424, 0.10136},
58*c8c44fa0SJérôme Duval 		{0.626959, 0.727811, 0.626959}
59*c8c44fa0SJérôme Duval 	},
60*c8c44fa0SJérôme Duval };
61*c8c44fa0SJérôme Duval 
62*c8c44fa0SJérôme Duval #define USE_QUAD_STRIPS 1
63*c8c44fa0SJérôme Duval 
64*c8c44fa0SJérôme Duval extern long 	setEvent(sem_id event);
65*c8c44fa0SJérôme Duval 
66*c8c44fa0SJérôme Duval GLObject::GLObject(ObjectView *ov)
67*c8c44fa0SJérôme Duval {
68*c8c44fa0SJérôme Duval 	rotX = rotY = lastRotX = lastRotY = 0;
69*c8c44fa0SJérôme Duval 	spinX = spinY = 2;
70*c8c44fa0SJérôme Duval 	x = y = 0;
71*c8c44fa0SJérôme Duval 	z = -2.0;
72*c8c44fa0SJérôme Duval 	color = 4;
73*c8c44fa0SJérôme Duval 	solidity = 0;
74*c8c44fa0SJérôme Duval 	changed = false;
75*c8c44fa0SJérôme Duval 	objView = ov;
76*c8c44fa0SJérôme Duval };
77*c8c44fa0SJérôme Duval 
78*c8c44fa0SJérôme Duval GLObject::~GLObject()
79*c8c44fa0SJérôme Duval {
80*c8c44fa0SJérôme Duval };
81*c8c44fa0SJérôme Duval 
82*c8c44fa0SJérôme Duval void GLObject::MenuInvoked(BPoint point)
83*c8c44fa0SJérôme Duval {
84*c8c44fa0SJérôme Duval 	BPopUpMenu *m = new BPopUpMenu("Object",false,false);
85*c8c44fa0SJérôme Duval 	BMenuItem *i;
86*c8c44fa0SJérôme Duval 
87*c8c44fa0SJérôme Duval 	int c = 1;
88*c8c44fa0SJérôme Duval 	m->AddItem(i = new BMenuItem("White",NULL));
89*c8c44fa0SJérôme Duval 	if (color == c++)
90*c8c44fa0SJérôme Duval 		i->SetMarked(true);
91*c8c44fa0SJérôme Duval 	m->AddItem(i = new BMenuItem("Yellow",NULL));
92*c8c44fa0SJérôme Duval 	if (color == c++)
93*c8c44fa0SJérôme Duval 		i->SetMarked(true);
94*c8c44fa0SJérôme Duval 	m->AddItem(i = new BMenuItem("Blue",NULL));
95*c8c44fa0SJérôme Duval 	if (color == c++)
96*c8c44fa0SJérôme Duval 		i->SetMarked(true);
97*c8c44fa0SJérôme Duval 	m->AddItem(i = new BMenuItem("Red",NULL));
98*c8c44fa0SJérôme Duval 	if (color == c++)
99*c8c44fa0SJérôme Duval 		i->SetMarked(true);
100*c8c44fa0SJérôme Duval 	m->AddItem(i = new BMenuItem("Green",NULL));
101*c8c44fa0SJérôme Duval 	if (color == c++)
102*c8c44fa0SJérôme Duval 		i->SetMarked(true);
103*c8c44fa0SJérôme Duval 	m->AddSeparatorItem();
104*c8c44fa0SJérôme Duval 
105*c8c44fa0SJérôme Duval 	c = 0;
106*c8c44fa0SJérôme Duval 	m->AddItem(i = new BMenuItem("Solid",NULL));
107*c8c44fa0SJérôme Duval 	if (solidity == c++)
108*c8c44fa0SJérôme Duval 		i->SetMarked(true);
109*c8c44fa0SJérôme Duval 	m->AddItem(i = new BMenuItem("Translucent",NULL));
110*c8c44fa0SJérôme Duval 	if (solidity == c++)
111*c8c44fa0SJérôme Duval 		i->SetMarked(true);
112*c8c44fa0SJérôme Duval 	m->AddItem(i = new BMenuItem("Transparent",NULL));
113*c8c44fa0SJérôme Duval 	if (solidity == c++)
114*c8c44fa0SJérôme Duval 		i->SetMarked(true);
115*c8c44fa0SJérôme Duval 
116*c8c44fa0SJérôme Duval 	i = m->Go(point);
117*c8c44fa0SJérôme Duval 	int32 index = m->IndexOf(i);
118*c8c44fa0SJérôme Duval 	delete m;
119*c8c44fa0SJérôme Duval 
120*c8c44fa0SJérôme Duval 	if (index < 5) {
121*c8c44fa0SJérôme Duval 		color = index+1;
122*c8c44fa0SJérôme Duval 	} else if (index > 5) {
123*c8c44fa0SJérôme Duval 		solidity = index-6;
124*c8c44fa0SJérôme Duval 	};
125*c8c44fa0SJérôme Duval 	changed = true;
126*c8c44fa0SJérôme Duval 	setEvent(objView->drawEvent);
127*c8c44fa0SJérôme Duval };
128*c8c44fa0SJérôme Duval 
129*c8c44fa0SJérôme Duval bool GLObject::SpinIt()
130*c8c44fa0SJérôme Duval {
131*c8c44fa0SJérôme Duval 	rotX += spinX;
132*c8c44fa0SJérôme Duval 	rotY += spinY;
133*c8c44fa0SJérôme Duval 	bool c = changed;
134*c8c44fa0SJérôme Duval 	c = c || ((rotX != lastRotX) || (rotY != lastRotY));
135*c8c44fa0SJérôme Duval 	lastRotX = rotX;
136*c8c44fa0SJérôme Duval 	lastRotY = rotY;
137*c8c44fa0SJérôme Duval 
138*c8c44fa0SJérôme Duval 	return c;
139*c8c44fa0SJérôme Duval };
140*c8c44fa0SJérôme Duval 
141*c8c44fa0SJérôme Duval void GLObject::Draw(bool forID, float IDcolor[])
142*c8c44fa0SJérôme Duval {
143*c8c44fa0SJérôme Duval 	glPushMatrix();
144*c8c44fa0SJérôme Duval 		glTranslatef(x, y, z);
145*c8c44fa0SJérôme Duval 		glRotatef(rotY, 0.0,1.0,0.0);
146*c8c44fa0SJérôme Duval 		glRotatef(rotX, 1.0,0.0,0.0);
147*c8c44fa0SJérôme Duval 
148*c8c44fa0SJérôme Duval 		if (forID) {
149*c8c44fa0SJérôme Duval 			glColor3fv(IDcolor);
150*c8c44fa0SJérôme Duval 		};
151*c8c44fa0SJérôme Duval 
152*c8c44fa0SJérôme Duval 		DoDrawing(forID);
153*c8c44fa0SJérôme Duval 
154*c8c44fa0SJérôme Duval 	glPopMatrix();
155*c8c44fa0SJérôme Duval 
156*c8c44fa0SJérôme Duval 	changed = false;
157*c8c44fa0SJérôme Duval };
158*c8c44fa0SJérôme Duval 
159*c8c44fa0SJérôme Duval TriangleObject::TriangleObject(ObjectView *ov, char *filename)
160*c8c44fa0SJérôme Duval 	: 	GLObject(ov),
161*c8c44fa0SJérôme Duval 		points(100,100),
162*c8c44fa0SJérôme Duval 		triangles(100,100),
163*c8c44fa0SJérôme Duval 		qs(50,50)
164*c8c44fa0SJérôme Duval {
165*c8c44fa0SJérôme Duval 	float maxp=0;
166*c8c44fa0SJérôme Duval 	int numPt,numTri;
167*c8c44fa0SJérôme Duval 
168*c8c44fa0SJérôme Duval 	FILE *f = fopen(filename,"r");
169*c8c44fa0SJérôme Duval 	fscanf(f,"%d",&numPt);
170*c8c44fa0SJérôme Duval //	printf("Points: %d\n",numPt);
171*c8c44fa0SJérôme Duval 	for (int i=0;i<numPt;i++) {
172*c8c44fa0SJérôme Duval 		point p;
173*c8c44fa0SJérôme Duval 		fscanf(f,"%f %f %f %f %f %f",
174*c8c44fa0SJérôme Duval 			&p.x,
175*c8c44fa0SJérôme Duval 			&p.y,
176*c8c44fa0SJérôme Duval 			&p.z,
177*c8c44fa0SJérôme Duval 			&p.nx,
178*c8c44fa0SJérôme Duval 			&p.ny,
179*c8c44fa0SJérôme Duval 			&p.nz);
180*c8c44fa0SJérôme Duval 		if (fabs(p.x) > maxp)
181*c8c44fa0SJérôme Duval 			maxp = fabs(p.x);
182*c8c44fa0SJérôme Duval 		if (fabs(p.y) > maxp)
183*c8c44fa0SJérôme Duval 			maxp = fabs(p.y);
184*c8c44fa0SJérôme Duval 		if (fabs(p.z) > maxp)
185*c8c44fa0SJérôme Duval 			maxp = fabs(p.z);
186*c8c44fa0SJérôme Duval 		points.add(p);
187*c8c44fa0SJérôme Duval 	};
188*c8c44fa0SJérôme Duval 	for (int i=0;i<points.num_items;i++) {
189*c8c44fa0SJérôme Duval 		points[i].x /= maxp;
190*c8c44fa0SJérôme Duval 		points[i].y /= maxp;
191*c8c44fa0SJérôme Duval 		points[i].z /= maxp;
192*c8c44fa0SJérôme Duval 	};
193*c8c44fa0SJérôme Duval 
194*c8c44fa0SJérôme Duval 	fscanf(f,"%d",&numTri);
195*c8c44fa0SJérôme Duval //	printf("Triangles: %d\n",numTri);
196*c8c44fa0SJérôme Duval 	int tpts=0;
197*c8c44fa0SJérôme Duval 	for (int i=0;i<numTri;i++) {
198*c8c44fa0SJérôme Duval 		tri t;
199*c8c44fa0SJérôme Duval 		fscanf(f,"%d %d %d",
200*c8c44fa0SJérôme Duval 			&t.p1,
201*c8c44fa0SJérôme Duval 			&t.p2,
202*c8c44fa0SJérôme Duval 			&t.p3);
203*c8c44fa0SJérôme Duval 		triangles.add(t);
204*c8c44fa0SJérôme Duval 		tpts+=3;
205*c8c44fa0SJérôme Duval 	};
206*c8c44fa0SJérôme Duval 
207*c8c44fa0SJérôme Duval 	int qpts=4;
208*c8c44fa0SJérôme Duval 	int qp[1024];
209*c8c44fa0SJérôme Duval 	quadStrip q;
210*c8c44fa0SJérôme Duval 	q.pts = qp;
211*c8c44fa0SJérôme Duval 	q.numpts = 4;
212*c8c44fa0SJérôme Duval 	q.pts[2] = triangles[0].p1;
213*c8c44fa0SJérôme Duval 	q.pts[0] = triangles[0].p2;
214*c8c44fa0SJérôme Duval 	q.pts[1] = triangles[0].p3;
215*c8c44fa0SJérôme Duval 	q.pts[3] = triangles[1].p3;
216*c8c44fa0SJérôme Duval 
217*c8c44fa0SJérôme Duval 	for (int i=2;i<numTri;i+=2) {
218*c8c44fa0SJérôme Duval 		if ((triangles[i-1].p1 == triangles[i].p2) &&
219*c8c44fa0SJérôme Duval 			(triangles[i-1].p3 == triangles[i].p3)) {
220*c8c44fa0SJérôme Duval 			q.pts[q.numpts++] = triangles[i+1].p1;
221*c8c44fa0SJérôme Duval 			q.pts[q.numpts++] = triangles[i+1].p3;
222*c8c44fa0SJérôme Duval 			qpts+=2;
223*c8c44fa0SJérôme Duval 		} else {
224*c8c44fa0SJérôme Duval 			int *np = (int*)malloc(sizeof(int)*q.numpts);
225*c8c44fa0SJérôme Duval 			memcpy(np,qp,q.numpts*sizeof(int));
226*c8c44fa0SJérôme Duval 			quadStrip nqs;
227*c8c44fa0SJérôme Duval 			nqs.numpts = q.numpts;
228*c8c44fa0SJérôme Duval 			nqs.pts = np;
229*c8c44fa0SJérôme Duval 			qs.add(nqs);
230*c8c44fa0SJérôme Duval 
231*c8c44fa0SJérôme Duval 			qpts+=4;
232*c8c44fa0SJérôme Duval 			q.numpts = 4;
233*c8c44fa0SJérôme Duval 			q.pts[2] = triangles[i].p1;
234*c8c44fa0SJérôme Duval 			q.pts[0] = triangles[i].p2;
235*c8c44fa0SJérôme Duval 			q.pts[1] = triangles[i].p3;
236*c8c44fa0SJérôme Duval 			q.pts[3] = triangles[i+1].p3;
237*c8c44fa0SJérôme Duval 		};
238*c8c44fa0SJérôme Duval 	};
239*c8c44fa0SJérôme Duval 
240*c8c44fa0SJérôme Duval 	int *np = (int*)malloc(sizeof(int)*q.numpts);
241*c8c44fa0SJérôme Duval 	memcpy(np,qp,q.numpts*sizeof(int));
242*c8c44fa0SJérôme Duval 	quadStrip nqs;
243*c8c44fa0SJérôme Duval 	nqs.numpts = q.numpts;
244*c8c44fa0SJérôme Duval 	nqs.pts = np;
245*c8c44fa0SJérôme Duval 	qs.add(nqs);
246*c8c44fa0SJérôme Duval 
247*c8c44fa0SJérôme Duval 	fclose(f);
248*c8c44fa0SJérôme Duval };
249*c8c44fa0SJérôme Duval 
250*c8c44fa0SJérôme Duval TriangleObject::~TriangleObject()
251*c8c44fa0SJérôme Duval {
252*c8c44fa0SJérôme Duval 	for (int i=0;i<qs.num_items;i++) {
253*c8c44fa0SJérôme Duval 		free(qs[i].pts);
254*c8c44fa0SJérôme Duval 	};
255*c8c44fa0SJérôme Duval };
256*c8c44fa0SJérôme Duval 
257*c8c44fa0SJérôme Duval void TriangleObject::DoDrawing(bool forID)
258*c8c44fa0SJérôme Duval {
259*c8c44fa0SJérôme Duval 	if (!forID) {
260*c8c44fa0SJérôme Duval 		float c[3][4];
261*c8c44fa0SJérôme Duval 		c[0][0] = materials[color].ambient[0];
262*c8c44fa0SJérôme Duval 		c[0][1] = materials[color].ambient[1];
263*c8c44fa0SJérôme Duval 		c[0][2] = materials[color].ambient[2];
264*c8c44fa0SJérôme Duval 		c[1][0] = materials[color].diffuse[0];
265*c8c44fa0SJérôme Duval 		c[1][1] = materials[color].diffuse[1];
266*c8c44fa0SJérôme Duval 		c[1][2] = materials[color].diffuse[2];
267*c8c44fa0SJérôme Duval 		c[2][0] = materials[color].specular[0];
268*c8c44fa0SJérôme Duval 		c[2][1] = materials[color].specular[1];
269*c8c44fa0SJérôme Duval 		c[2][2] = materials[color].specular[2];
270*c8c44fa0SJérôme Duval 
271*c8c44fa0SJérôme Duval 		float alpha = 1;
272*c8c44fa0SJérôme Duval 		if (solidity == 0)
273*c8c44fa0SJérôme Duval 			alpha = 1.0;
274*c8c44fa0SJérôme Duval 		else if (solidity == 1)
275*c8c44fa0SJérôme Duval 			alpha = 0.95;
276*c8c44fa0SJérôme Duval 		else if (solidity == 2)
277*c8c44fa0SJérôme Duval 			alpha = 0.6;
278*c8c44fa0SJérôme Duval 		c[0][3] = c[1][3] = c[2][3] = alpha;
279*c8c44fa0SJérôme Duval 		if (solidity != 0) {
280*c8c44fa0SJérôme Duval 			glBlendFunc(GL_SRC_ALPHA,GL_ONE);
281*c8c44fa0SJérôme Duval 			glEnable(GL_BLEND);
282*c8c44fa0SJérôme Duval 			glDepthMask(GL_FALSE);
283*c8c44fa0SJérôme Duval 			glDisable(GL_CULL_FACE);
284*c8c44fa0SJérôme Duval 		} else {
285*c8c44fa0SJérôme Duval 			glDisable(GL_BLEND);
286*c8c44fa0SJérôme Duval 			glDepthMask(GL_TRUE);
287*c8c44fa0SJérôme Duval 		};
288*c8c44fa0SJérôme Duval 		glMaterialfv(GL_FRONT, GL_AMBIENT, c[0]);
289*c8c44fa0SJérôme Duval 		glMaterialfv(GL_FRONT, GL_DIFFUSE, c[1]);
290*c8c44fa0SJérôme Duval 		glMaterialfv(GL_FRONT, GL_SPECULAR, c[2]);
291*c8c44fa0SJérôme Duval 	} else {
292*c8c44fa0SJérôme Duval 		glDisable(GL_BLEND);
293*c8c44fa0SJérôme Duval 		glDepthMask(GL_TRUE);
294*c8c44fa0SJérôme Duval 	};
295*c8c44fa0SJérôme Duval 
296*c8c44fa0SJérôme Duval #if USE_QUAD_STRIPS
297*c8c44fa0SJérôme Duval 		for (int i=0;i<qs.num_items;i++) {
298*c8c44fa0SJérôme Duval 			glBegin(GL_QUAD_STRIP);
299*c8c44fa0SJérôme Duval 			for (int j=0;j<qs[i].numpts;j++) {
300*c8c44fa0SJérôme Duval 				glNormal3f(
301*c8c44fa0SJérôme Duval 					points[qs[i].pts[j]].nx,
302*c8c44fa0SJérôme Duval 					points[qs[i].pts[j]].ny,
303*c8c44fa0SJérôme Duval 					points[qs[i].pts[j]].nz
304*c8c44fa0SJérôme Duval 				);
305*c8c44fa0SJérôme Duval 				glVertex3f(
306*c8c44fa0SJérôme Duval 					points[qs[i].pts[j]].x,
307*c8c44fa0SJérôme Duval 					points[qs[i].pts[j]].y,
308*c8c44fa0SJérôme Duval 					points[qs[i].pts[j]].z
309*c8c44fa0SJérôme Duval 				);
310*c8c44fa0SJérôme Duval 			};
311*c8c44fa0SJérôme Duval 			glEnd();
312*c8c44fa0SJérôme Duval 		};
313*c8c44fa0SJérôme Duval #else
314*c8c44fa0SJérôme Duval 		glBegin(GL_TRIANGLES);
315*c8c44fa0SJérôme Duval 		for (int i=0;i<triangles.num_items;i++) {
316*c8c44fa0SJérôme Duval 			int v3 = triangles[i].p1;
317*c8c44fa0SJérôme Duval 			int v1 = triangles[i].p2;
318*c8c44fa0SJérôme Duval 			int v2 = triangles[i].p3;
319*c8c44fa0SJérôme Duval 	  		glNormal3f(
320*c8c44fa0SJérôme Duval 				points[v1].nx,
321*c8c44fa0SJérôme Duval 				points[v1].ny,
322*c8c44fa0SJérôme Duval 				points[v1].nz
323*c8c44fa0SJérôme Duval 			);
324*c8c44fa0SJérôme Duval 			glVertex3f(
325*c8c44fa0SJérôme Duval 				points[v1].x,
326*c8c44fa0SJérôme Duval 				points[v1].y,
327*c8c44fa0SJérôme Duval 				points[v1].z
328*c8c44fa0SJérôme Duval 			);
329*c8c44fa0SJérôme Duval 			glNormal3f(
330*c8c44fa0SJérôme Duval 				points[v2].nx,
331*c8c44fa0SJérôme Duval 				points[v2].ny,
332*c8c44fa0SJérôme Duval 				points[v2].nz
333*c8c44fa0SJérôme Duval 			);
334*c8c44fa0SJérôme Duval 			glVertex3f(
335*c8c44fa0SJérôme Duval 				points[v2].x,
336*c8c44fa0SJérôme Duval 				points[v2].y,
337*c8c44fa0SJérôme Duval 				points[v2].z
338*c8c44fa0SJérôme Duval 			);
339*c8c44fa0SJérôme Duval 			glNormal3f(
340*c8c44fa0SJérôme Duval 				points[v3].nx,
341*c8c44fa0SJérôme Duval 				points[v3].ny,
342*c8c44fa0SJérôme Duval 				points[v3].nz
343*c8c44fa0SJérôme Duval 			);
344*c8c44fa0SJérôme Duval 			glVertex3f(
345*c8c44fa0SJérôme Duval 				points[v3].x,
346*c8c44fa0SJérôme Duval 				points[v3].y,
347*c8c44fa0SJérôme Duval 				points[v3].z
348*c8c44fa0SJérôme Duval 			);
349*c8c44fa0SJérôme Duval 		};
350*c8c44fa0SJérôme Duval 		glEnd();
351*c8c44fa0SJérôme Duval #endif
352*c8c44fa0SJérôme Duval };
353*c8c44fa0SJérôme Duval 
354