void Gl1_Aabb::go(const shared_ptr<Bound>& bv, Scene* scene){ Aabb* aabb = static_cast<Aabb*>(bv.get()); glColor3v(bv->color); if(!scene->isPeriodic){ glTranslatev(Vector3r(.5*(aabb->min+aabb->max))); glScalev(Vector3r(aabb->max-aabb->min)); } else { glTranslatev(Vector3r(scene->cell->shearPt(scene->cell->wrapPt(.5*(aabb->min+aabb->max))))); glMultMatrixd(scene->cell->getGlShearTrsfMatrix()); glScalev(Vector3r(aabb->max-aabb->min)); } glutWireCube(1); }
// called for rendering spheres both and ellipsoids, differing in the scale parameter void Gl1_Sphere::renderScaledSphere(const shared_ptr<Shape>& shape, const Vector3r& shift, bool wire2, const GLViewInfo& glInfo, const Real& radius, const Vector3r& scaleAxes){ const shared_ptr<Node>& n=shape->nodes[0]; Vector3r dPos=(n->hasData<GlData>()?n->getData<GlData>().dGlPos:Vector3r::Zero()); GLUtils::setLocalCoords(shape->nodes[0]->pos+shift+dPos,shape->nodes[0]->ori); // for rendering ellipsoid if(!isnan(scaleAxes[0])) glScalev(scaleAxes); glClearDepth(1.0f); glEnable(GL_NORMALIZE); if(quality>10) quality=10; // insane setting can quickly kill the GPU Real r=radius*scale; //glColor3v(CompUtils::mapColor(shape->getBaseColor())); bool doPoints=(Renderer::fastDraw || quality<0 || (int)(quality*glutSlices)<2 || (int)(quality*glutStacks)<2); if(doPoints){ if(smooth) glEnable(GL_POINT_SMOOTH); else glDisable(GL_POINT_SMOOTH); glPointSize(1.); glBegin(GL_POINTS); glVertex3v(Vector3r(0,0,0)); glEnd(); } else if (wire || wire2 ){ glLineWidth(1.); if(!smooth) glDisable(GL_LINE_SMOOTH); glutWireSphere(r,quality*glutSlices,quality*glutStacks); if(!smooth) glEnable(GL_LINE_SMOOTH); // re-enable } else { glEnable(GL_LIGHTING); glShadeModel(GL_SMOOTH); glutSolidSphere(r,quality*glutSlices,quality*glutStacks); #if 0 //Check if quality has been modified or if previous lists are invalidated (e.g. by creating a new qt view), then regenerate lists bool somethingChanged = (abs(quality-prevQuality)>0.001 || glIsList(glStripedSphereList)!=GL_TRUE); if (somethingChanged) {initStripedGlList(); initGlutGlList(); prevQuality=quality;} glScalef(r,r,r); if(stripes) glCallList(glStripedSphereList); else glCallList(glGlutSphereList); #endif } return; }
int main() { int rotateX = 0; int rotateY = 0; //set mode 0, enable BG0 and set it to 3D videoSetMode(MODE_0_3D); // intialize gl glInit(); // enable antialiasing glEnable(GL_ANTIALIAS); // setup the rear plane glClearColor(0,0,0,31); // BG must be opaque for AA to work glClearPolyID(63); // BG must have a unique polygon ID for AA to work glClearDepth(0x7FFF); //this should work the same as the normal gl call glViewport(0,0,255,191); vramSetBankA(VRAM_A_TEXTURE); glEnable(GL_TEXTURE_2D); int cafe_texid; glGenTextures( 1, &cafe_texid ); glBindTexture( 0, cafe_texid ); glTexImage2D( 0, 0, GL_RGB, TEXTURE_SIZE_128 , TEXTURE_SIZE_128, 0, GL_TEXTURE_WRAP_S|GL_TEXTURE_WRAP_T|TEXGEN_NORMAL, (u8*)cafe_bin ); //any floating point gl call is being converted to fixed prior to being implemented glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(70, 256.0 / 192.0, 0.1, 40); while(1) { //TEXGEN_NORMAL helpfully pops our normals into this matrix and uses the result as texcoords glMatrixMode(GL_TEXTURE); glLoadIdentity(); GLvector tex_scale = { 64<<16, -64<<16, 1<<16 }; glScalev( &tex_scale ); //scale normals up from (-1,1) range into texcoords glRotateXi(rotateX); //rotate texture-matrix to match the camera glRotateYi(rotateY); glMatrixMode(GL_POSITION); glLoadIdentity(); glTranslatef32(0, 0, floattof32(-3)); glRotateXi(rotateX); glRotateYi(rotateY); glMaterialf(GL_EMISSION, RGB15(31,31,31)); glPolyFmt(POLY_ALPHA(31) | POLY_CULL_BACK ); scanKeys(); u32 keys = keysHeld(); if( keys & KEY_UP ) rotateX += 3<<3; if( keys & KEY_DOWN ) rotateX -= 3<<3; if( keys & KEY_LEFT ) rotateY += 3<<3; if( keys & KEY_RIGHT ) rotateY -= 3<<3; int pen_delta[2]; get_pen_delta( &pen_delta[0], &pen_delta[1] ); rotateY -= pen_delta[0]; rotateX -= pen_delta[1]; glBindTexture( 0, cafe_texid ); glCallList((u32*)teapot_bin); glFlush(0); } return 0; }//end main