void init(void) { GLuint id = 1; glClearColor(0, 0, 0, 0); glColor3f(1, 1, 1); glShadeModel(GL_SMOOTH); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(45, 1, 1, 100); glEnable(GL_LIGHTING); //init our scenegraph SG = new SceneGraph(); insertLight(light_pos1, amb1, diff1, spec1, 1); insertLight(light_pos0, amb0, diff0, spec0, 0); }
void MainForm::insertWorld(engine::IBSP* bsp, HTREEITEM parentItem) { HTREEITEM bspItem = assetGraph.InsertItem( bsp->getName(), 0, 0, parentItem, TVI_LAST ); assert( bspItem != NULL ); assetGraph.SetItemData( bspItem, (DWORD)( bsp ) ); HTREEITEM sectorFolder = assetGraph.InsertItem( "BSP", -1, -1, bspItem, TVI_LAST ); assert( sectorFolder != NULL ); // collect sectors BSPSectorL sectors; bsp->forAllSectors( collectSectorCB, §ors ); for( BSPSectorI sectorI = sectors.begin(); sectorI != sectors.end(); sectorI++ ) { if( (*sectorI)->isLeaf() ) { insertSector( *sectorI, sectorFolder ); } } // collect lights LightL lights; bsp->forAllLights( collectLightCB, &lights ); if( lights.size() ) { HTREEITEM lightFolder = assetGraph.InsertItem( "Lights", -1, -1, bspItem, TVI_LAST ); assert( lightFolder != NULL ); for( LightI lightI = lights.begin(); lightI != lights.end(); lightI++ ) { insertLight( *lightI, lightFolder ); } } // add clumps from asset for( ClumpI clumpI = clumpList.begin(); clumpI != clumpList.end(); clumpI++ ) { insertClump( *clumpI, bspItem ); } }
void MainForm::insertFrame(engine::IFrame* frame, HTREEITEM parentItem, AtomicL& atomics, LightL& lights) { const char* frameName = frame->getName(); if( frameName == NULL || strcmp( frameName, "" ) == 0 ) { frameName = "Root"; } HTREEITEM frameItem = assetGraph.InsertItem( frameName, 2, 2, parentItem, TVI_LAST ); assert( frameItem != NULL ); assetGraph.SetItemData( frameItem, (DWORD)( frame ) ); // attach children frames FrameL childrenFrames; frame->forAllChildren( collectChildrenFramesCB, &childrenFrames ); for( FrameI frameI = childrenFrames.begin(); frameI != childrenFrames.end(); frameI++ ) { insertFrame( *frameI, frameItem, atomics, lights ); } // find atomics, attached to this frame for( AtomicI atomicI = atomics.begin(); atomicI != atomics.end(); atomicI++ ) { if( (*atomicI)->getFrame() == frame ) { insertAtomic( *atomicI, frameItem ); } } // find lights, attached to this frame for( LightI lightI = lights.begin(); lightI != lights.end(); lightI++ ) { if( (*lightI)->getFrame() == frame ) { insertLight( *lightI, frameItem ); } } }
//callbacks void keyboard(unsigned char key, int x, int y) { switch (key) { case 27: exit (0); break; //draw objects case 'y': insertObj(Cube); break; case 'u': insertObj(Sphere); break; case 'i': insertObj(Cone); break; case 'o': insertObj(Torus); break; case 'p': insertObj(Teapot); break; //transformations case 'a': //-x if (sceneObjs->size()!=0) { if (mode%3==0) currentObj->translate(-0.1, 0, 0); if (mode%3==1&&!currentObj->isLight) currentObj->scale(-0.1, 0,0); if (mode%3==2&&!currentObj->isLight) currentObj->rotate(-5,0,0); } break; case 'd': //+x if (sceneObjs->size()!=0) { if (mode%3==0) currentObj->translate(0.1, 0, 0); if (mode%3==1&&!currentObj->isLight) currentObj->scale(0.1,0,0); if (mode%3==2&&!currentObj->isLight) currentObj->rotate(5,0,0); } break; case 'q': //-z if (sceneObjs->size()!=0) { if (mode%3==0) currentObj->translate(0, 0, -0.1); if (mode%3==1&&!currentObj->isLight) currentObj->scale(0, 0,-0.1); if (mode%3==2&&!currentObj->isLight) currentObj->rotate(0,0,-5); } break; case 'e': //+z if (sceneObjs->size()!=0) { if (mode%3==0) currentObj->translate(0, 0, 0.1); if (mode%3==1&&!currentObj->isLight) currentObj->scale(0, 0,0.1); if (mode%3==2&&!currentObj->isLight) currentObj->rotate(0,0,5); } break; case 's': //-y if (sceneObjs->size()!=0) { if (mode%3==0) currentObj->translate(0, -0.1, 0); if (mode%3==1&&!currentObj->isLight) currentObj->scale(0, -0.1,0); if (mode%3==2&&!currentObj->isLight) currentObj->rotate(0,-5,0); } break; case 'w': //+y if (sceneObjs->size()!=0) { if (mode%3==0) currentObj->translate(0, 0.1, 0); if (mode%3==1&&!currentObj->isLight) currentObj->scale(0, 0.1,0); if (mode%3==2&&!currentObj->isLight) currentObj->rotate(0,5,0); } break; case 't': //transform type toggle mode++; if (mode%3==0) transformMode = t; if (mode%3==1) transformMode = s; if (mode%3==2) transformMode = r; break; case 32: //load/save if (glutGetModifiers()==GLUT_ACTIVE_CTRL) { sceneObjs = SG->load(); nextChild = sceneObjs->size(); currentObj = sceneObjs->at(0); currentObj->select(); } else SG->save(); break; //toggle materials case '1': curMat = m1; break; case '2': curMat = m2; break; case '3': curMat = m3; break; case '4': curMat = m4; break; case '5': curMat = m5; break; //change selected object's material to current material case 'm': if (!currentObj->isLight) currentObj->changeMaterial(curMat); break; //delete selected object case 'x': if (sceneObjs->size()!=0) { deleteObj(currentObj->ID); } break; //reset scene case 'r': SG = new SceneGraph(); nextChild = 0; sceneObjs = new vector<SceneObj*>; insertLight(light_pos0, amb0, diff0, spec0, 0); insertLight(light_pos1, amb1, diff1, spec1, 1); break; case 9: // toggle selected object (was used before ray picking implemented, still useful anyway) currentObj->unselect(); currentObj = sceneObjs->at(currentObjIndex++%sceneObjs->size()); currentObj->select(); break; default: break; } glutPostRedisplay(); }