diff -r fb4b0c6dfdbd -r 53ffc8853008 hedgewars/hwengine.pas --- a/hedgewars/hwengine.pas Mon Jun 04 08:11:47 2012 -0400 +++ b/hedgewars/hwengine.pas Mon Jun 04 21:32:30 2012 +0400 @@ -31,7 +31,7 @@ uses SDLh, uMisc, uConsole, uGame, uConsts, uLand, uAmmos, uVisualGears, uGears, uStore, uWorld, uInputHandler, uSound, uScript, uTeams, uStats, uIO, uLocale, uChat, uAI, uAIMisc, uRandom, uLandTexture, uCollisions, - SysUtils, uTypes, uVariables, uCommands, uUtils, uCaptions, uDebug, uCommandHandlers, uLandPainted + SysUtils, uTypes, uVariables, uCommands, uUtils, uCaptions, uDebug, uCommandHandlers, uLandPainted, uVideoRec {$IFDEF SDL13}, uTouch{$ENDIF}{$IFDEF ANDROID}, GLUnit{$ENDIF}; {$IFDEF HWLIBRARY} @@ -101,6 +101,9 @@ SwapBuffers; + if flagPrerecording then + SaveCameraPosition; + if flagMakeCapture then begin flagMakeCapture:= false; @@ -261,6 +264,32 @@ end; end; +//////////////// +procedure RecorderMainLoop; +var CurrTime, PrevTime: LongInt; +begin + if not BeginVideoRecording() then + exit; + DoTimer(0); // gsLandGen -> gsStart + DoTimer(0); // gsStart -> gsGame + + CurrTime:= LoadNextCameraPosition(); + fastScrolling:= true; + DoTimer(CurrTime); + fastScrolling:= false; + while true do + begin + EncodeFrame(); + PrevTime:= CurrTime; + CurrTime:= LoadNextCameraPosition(); + if CurrTime = -1 then + break; + DoTimer(CurrTime - PrevTime); + IPCCheckSock(); + end; + StopVideoRecording(); +end; + /////////////// procedure Game{$IFDEF HWLIBRARY}(gameArgs: PPChar); cdecl; export{$ENDIF}; var p: TPathType; @@ -327,11 +356,16 @@ SDLTry(TTF_Init() <> -1, true); WriteLnToConsole(msgOK); - // show main window - if cFullScreen then - ParseCommand('fullscr 1', true) + if GameType = gmtRecord then + InitOffscreenOpenGL() else - ParseCommand('fullscr 0', true); + begin + // show main window + if cFullScreen then + ParseCommand('fullscr 1', true) + else + ParseCommand('fullscr 0', true); + end; ControllerInit(); // has to happen before InitKbdKeyTable to map keys InitKbdKeyTable(); @@ -368,12 +402,20 @@ InitTeams(); AssignStores(); + + if GameType = gmtRecord then + SetSound(false); + InitSound(); isDeveloperMode:= false; TryDo(InitStepsFlags = cifAllInited, 'Some parameters not set (flags = ' + inttostr(InitStepsFlags) + ')', true); ParseCommand('rotmask', true); - MainLoop(); + + if GameType = gmtRecord then + RecorderMainLoop() + else + MainLoop(); // clean up all the memory allocated freeEverything(true); @@ -456,6 +498,7 @@ //uAIAmmoTests does not need to be freed //uAIActions does not need to be freed uStore.freeModule; + uVideoRec.freeModule; end; uIO.freeModule; @@ -530,7 +573,7 @@ if (ParamCount = 3) and ((ParamStr(3) = '--stats-only') or (ParamStr(3) = 'landpreview')) then internalSetGameTypeLandPreviewFromParameters() else - if (ParamCount = cDefaultParamNum) then + if (ParamCount = cDefaultParamNum) or (ParamCount = cDefaultParamNum+1) then internalStartGameWithParameters() else playReplayFileWithParameters();