void Controller::onSpecialKeyReleased(int key) { if(_firstPlayer == NULL){ _firstPlayer = _pm->firstPlayer(); specialKeyReleased(key); } else specialKeyReleased(key); }
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; } }