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