Exemplo n.º 1
0
bool EventRecorder::keyTyped(unsigned char c, modifier m, int x, int y)
{
    if (c == 'p') {
        isPlaying = ! isPlaying;
        return true;
    }

    if (isRecording) {
        recordedEvents.push_back(Event(Event::KEYBOARD, (int) m, c, x, y, 0));
        saveEvents();
        if (c == 27) {
            specialKey(KEY_F12, m, x, y);
        }
    } else if (isPlaying) {
        if (c == 27) {
            ::exit(0);
        }
        return true;
    }
    return next != NULL && next->keyTyped(c, m, x, y);
}
Exemplo n.º 2
0
void EventRecorder::redisplay(double t, double dt)
{
     if (isRecording) {
        recordedEvents.push_back(Event(t, dt, TerrainNode::nextGroundHeightAtCamera));
    } else if (isPlaying) {
        ostringstream s;
        bool replay = true;
        isPlaying = false;
        while (replay && lastPlayed < recordedEvents.size()) {
            Event e = recordedEvents[lastPlayed++];
            switch (e.kind) {
            case Event::DISPLAY:
                t = e.display.t;
                dt = e.display.dt;
                TerrainNode::nextGroundHeightAtCamera = e.display.groundHeight;
                replay = false;
                break;
            case Event::MOUSE:
                mouseClick((button) e.e.arg1, (state) e.e.arg2, (modifier) e.e.m, e.e.arg3, e.e.arg4);
                savedX = e.e.arg3;
                savedY = e.e.arg4;
                break;
            case Event::MOTION:
                mouseMotion(e.e.arg1, e.e.arg2);
                savedX = e.e.arg1;
                savedY = e.e.arg2;
                break;
            case Event::PASSIVEMOTION:
                mousePassiveMotion(e.e.arg1, e.e.arg2);
                savedX = e.e.arg1;
                savedY = e.e.arg2;
                break;
            case Event::WHEEL:
                mouseWheel((wheel) e.e.arg1, (modifier) e.e.m, e.e.arg2, e.e.arg3);
                savedX = e.e.arg2;
                savedY = e.e.arg3;
                break;
            case Event::KEYBOARD:
                if (e.e.arg4 == 0) {
                    keyTyped(e.e.arg1, (modifier) e.e.m, e.e.arg2, e.e.arg3);
                    if (e.e.arg1 == 27) {
                        ::exit(0);
                    }
                } else {
                    keyReleased(e.e.arg1, (modifier) e.e.m, e.e.arg2, e.e.arg3);
                }
                break;
            case Event::SPECIAL:
                if (e.e.arg4 == 0) {
                    specialKey((key) e.e.arg1, (modifier) e.e.m, e.e.arg2, e.e.arg3);
                } else {
                    specialKeyReleased((key) e.e.arg1, (modifier) e.e.m, e.e.arg2, e.e.arg3);
                }
                break;
            }
        }
        isPlaying = lastPlayed < recordedEvents.size();
    }

    if (next != NULL) {
        next->redisplay(t, dt);
    }

    if (isPlaying) {
        ptr<FrameBuffer> fb = FrameBuffer::getDefault();
        vec4<GLint> vp = fb->getViewport();

        fb->setBlend(true, ADD, SRC_ALPHA, ONE_MINUS_SRC_ALPHA, ADD, ZERO, ONE);
        fb->setColorMask(true, true, true, false);
        fb->setDepthMask(false);
        fb->setStencilMask(0, 0);

        correctU->set(vec3f(0.f, 0.f, 1.f));
        rescaleU->set(vec4f(2.0f * (float)(savedX + 0.5f * cursW) / vp.z - 1.0f, 2.0f * (float)(vp.w - savedY - 0.5f * cursH) / vp.w - 1.0f, cursW / (float)vp.z, cursH / (float)vp.w));

        cursorSamplerU->set(cursor);
        fb->drawQuad(cursorProg);

        fb->setBlend(false);
        fb->setColorMask(true, true, true, true);
        fb->setDepthMask(true);
        fb->setStencilMask(0xFFFFFFFF,0xFFFFFFFF);
    }

    if (isPlaying && saveVideo) {
        int frameCount = 0;
        if (lastSavedEvent >= 0) {
            double prevTime = recordedEvents[lastSavedEvent].display.t;
            double curTime = recordedEvents[lastPlayed - 1].display.t;
            assert(recordedEvents[lastSavedEvent].kind == Event::DISPLAY && prevTime > 0.0);
            assert(recordedEvents[lastPlayed - 1].kind == Event::DISPLAY && curTime > 0.0);
            frameCount = int(floor(curTime / 40000.0) - floor(prevTime / 40000.0));
        }
        // if the delay between two recorded frames is more than 1/25 of a second
        // the first one must be saved several times in the video to keep a video
        // framerate of 25 frames per second.
        for (int i = 0; i < frameCount; ++i) {
            char name[256];
            sprintf(name, frames, lastSavedFrame++);
            saveFrame(name);
        }
        lastSavedEvent = lastPlayed - 1;
    }
}
Exemplo n.º 3
0
int scanCodeToAscii(int scanCode) {
    specialKey(scanCode);
    if(shifted == 1)
        return scanCodeToAsciiShiftedTable[scanCode];
    return scanCodeToAsciiTable[scanCode];
}