Ejemplo n.º 1
0
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);


}
Ejemplo n.º 2
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, &sectors );
    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 );
    }
}
Ejemplo n.º 3
0
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 );
        }
    }
}
Ejemplo n.º 4
0
//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();
}