hedgewars/uStore.pas
changeset 7615 b39beffcf05e
parent 7565 00568d3054d0
child 7634 ca14ec44b223
equal deleted inserted replaced
7614:3ae60c8a15f2 7615:b39beffcf05e
    38 function  RenderHelpWindow(caption, subcaption, description, extra: ansistring; extracolor: LongInt; iconsurf: PSDL_Surface; iconrect: PSDL_Rect): PTexture;
    38 function  RenderHelpWindow(caption, subcaption, description, extra: ansistring; extracolor: LongInt; iconsurf: PSDL_Surface; iconrect: PSDL_Rect): PTexture;
    39 procedure RenderWeaponTooltip(atype: TAmmoType);
    39 procedure RenderWeaponTooltip(atype: TAmmoType);
    40 procedure ShowWeaponTooltip(x, y: LongInt);
    40 procedure ShowWeaponTooltip(x, y: LongInt);
    41 procedure FreeWeaponTooltip;
    41 procedure FreeWeaponTooltip;
    42 procedure MakeCrossHairs;
    42 procedure MakeCrossHairs;
       
    43 {$IFDEF USE_VIDEO_RECORDING}
       
    44 procedure InitOffscreenOpenGL;
       
    45 {$ENDIF}
    43 
    46 
    44 procedure WarpMouse(x, y: Word); inline;
    47 procedure WarpMouse(x, y: Word); inline;
    45 procedure SwapBuffers; inline;
    48 procedure SwapBuffers; inline;
    46 
    49 
    47 implementation
    50 implementation
    48 uses uMisc, uConsole, uMobile, uVariables, uUtils, uTextures, uRender, uRenderUtils, uCommands,
    51 uses uMisc, uConsole, uMobile, uVariables, uUtils, uTextures, uRender, uRenderUtils, uCommands,
    49      uDebug{$IFDEF USE_CONTEXT_RESTORE}, uWorld{$ENDIF};
    52      uDebug{$IFDEF USE_CONTEXT_RESTORE}, uWorld{$ENDIF}
       
    53      {$IF NOT DEFINED(SDL13) AND DEFINED(USE_VIDEO_RECORDING)}, glut {$ENDIF};
    50 
    54 
    51 //type TGPUVendor = (gvUnknown, gvNVIDIA, gvATI, gvIntel, gvApple);
    55 //type TGPUVendor = (gvUnknown, gvNVIDIA, gvATI, gvIntel, gvApple);
    52 
    56 
    53 var MaxTextureSize: LongInt;
    57 var MaxTextureSize: LongInt;
    54 {$IFDEF SDL13}
    58 {$IFDEF SDL13}
   466 if not reload then
   470 if not reload then
   467     AddProgress;
   471     AddProgress;
   468 IMG_Quit();
   472 IMG_Quit();
   469 end;
   473 end;
   470 
   474 
       
   475 {$IF NOT DEFINED(S3D_DISABLED) OR DEFINED(USE_VIDEO_RECORDING)}
       
   476 procedure CreateFramebuffer(var frame, depth, tex: GLuint);
       
   477 begin
       
   478     glGenFramebuffersEXT(1, @frame);
       
   479     glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, frame);
       
   480     glGenRenderbuffersEXT(1, @depth);
       
   481     glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, depth);
       
   482     glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT, cScreenWidth, cScreenHeight);
       
   483     glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, depth);
       
   484     glGenTextures(1, @tex);
       
   485     glBindTexture(GL_TEXTURE_2D, tex);
       
   486     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8,  cScreenWidth, cScreenHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, nil);
       
   487     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
       
   488     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
       
   489     glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, tex, 0);
       
   490 end;
       
   491 
       
   492 procedure DeleteFramebuffer(var frame, depth, tex: GLuint);
       
   493 begin
       
   494     glDeleteTextures(1, @tex);
       
   495     glDeleteRenderbuffersEXT(1, @depth);
       
   496     glDeleteFramebuffersEXT(1, @frame);
       
   497 end;
       
   498 {$ENDIF}
       
   499 
   471 procedure StoreRelease(reload: boolean);
   500 procedure StoreRelease(reload: boolean);
   472 var ii: TSprite;
   501 var ii: TSprite;
   473     ai: TAmmoType;
   502     ai: TAmmoType;
   474     i, t: LongInt;
   503     i, t: LongInt;
   475 begin
   504 begin
   539                 FreeTexture(TeamsArray[t]^.Hedgehogs[i].HatTex);
   568                 FreeTexture(TeamsArray[t]^.Hedgehogs[i].HatTex);
   540                 TeamsArray[t]^.Hedgehogs[i].HatTex:= nil;
   569                 TeamsArray[t]^.Hedgehogs[i].HatTex:= nil;
   541                 end;
   570                 end;
   542             end;
   571             end;
   543         end;
   572         end;
       
   573 {$IFDEF USE_VIDEO_RECORDING}
       
   574     if defaultFrame <> 0 then
       
   575         DeleteFramebuffer(defaultFrame, depthv, texv);
       
   576 {$ENDIF}
   544 {$IFNDEF S3D_DISABLED}
   577 {$IFNDEF S3D_DISABLED}
   545     if (cStereoMode = smHorizontal) or (cStereoMode = smVertical) or (cStereoMode = smAFR) then
   578     if (cStereoMode = smHorizontal) or (cStereoMode = smVertical) or (cStereoMode = smAFR) then
   546         begin
   579         begin
   547         glDeleteTextures(1, @texl);
   580         DeleteFramebuffer(framel, depthl, texl);
   548         glDeleteRenderbuffersEXT(1, @depthl);
   581         DeleteFramebuffer(framer, depthr, texr);
   549         glDeleteFramebuffersEXT(1, @framel);
       
   550         glDeleteTextures(1, @texr);
       
   551         glDeleteRenderbuffersEXT(1, @depthr);
       
   552         glDeleteFramebuffersEXT(1, @framer)
       
   553         end
   582         end
   554 {$ENDIF}
   583 {$ENDIF}
   555 end;
   584 end;
   556 
   585 
   557 
   586 
   656 end;
   685 end;
   657 
   686 
   658 procedure SetupOpenGL;
   687 procedure SetupOpenGL;
   659 //var vendor: shortstring = '';
   688 //var vendor: shortstring = '';
   660 var buf: array[byte] of char;
   689 var buf: array[byte] of char;
       
   690     AuxBufNum: LongInt;
   661 begin
   691 begin
   662     buf[0]:= char(0); // avoid compiler hint
   692     buf[0]:= char(0); // avoid compiler hint
   663     AddFileLog('Setting up OpenGL (using driver: ' + shortstring(SDL_VideoDriverName(buf, sizeof(buf))) + ')');
   693     AddFileLog('Setting up OpenGL (using driver: ' + shortstring(SDL_VideoDriverName(buf, sizeof(buf))) + ')');
   664 
   694 
   665 {$IFDEF SDL13}
   695 {$IFDEF SDL13}
   701     else
   731     else
   702         AddFileLog('OpenGL Warning - unknown hardware vendor; please report');
   732         AddFileLog('OpenGL Warning - unknown hardware vendor; please report');
   703 {$ENDIF}
   733 {$ENDIF}
   704 //SupportNPOTT:= glLoadExtension('GL_ARB_texture_non_power_of_two');
   734 //SupportNPOTT:= glLoadExtension('GL_ARB_texture_non_power_of_two');
   705 *)
   735 *)
       
   736     glGetIntegerv(GL_AUX_BUFFERS, @AuxBufNum);
   706 
   737 
   707     // everyone love debugging
   738     // everyone love debugging
   708     AddFileLog('OpenGL-- Renderer: ' + shortstring(pchar(glGetString(GL_RENDERER))));
   739     AddFileLog('OpenGL-- Renderer: ' + shortstring(pchar(glGetString(GL_RENDERER))));
   709     AddFileLog('  |----- Vendor: ' + shortstring(pchar(glGetString(GL_VENDOR))));
   740     AddFileLog('  |----- Vendor: ' + shortstring(pchar(glGetString(GL_VENDOR))));
   710     AddFileLog('  |----- Version: ' + shortstring(pchar(glGetString(GL_VERSION))));
   741     AddFileLog('  |----- Version: ' + shortstring(pchar(glGetString(GL_VERSION))));
   711     AddFileLog('  |----- Texture Size: ' + inttostr(MaxTextureSize));
   742     AddFileLog('  |----- Texture Size: ' + inttostr(MaxTextureSize));
   712     AddFileLog('  \----- Extensions: ' + shortstring(pchar(glGetString(GL_EXTENSIONS))));
   743     AddFileLog('  |----- Number of auxilary buffers: ' + inttostr(AuxBufNum));
   713     //TODO: don't have the Extensions line trimmed but slipt it into multiple lines
   744     AddFileLog('  \----- Extensions: ');
       
   745     AddFileLogRaw(glGetString(GL_EXTENSIONS));
       
   746     AddFileLog('');
       
   747     //TODO: slipt Extensions line into multiple lines
       
   748 
       
   749     defaultFrame:= 0;
       
   750 {$IFDEF USE_VIDEO_RECORDING}
       
   751     if GameType = gmtRecord then
       
   752     begin
       
   753         if glLoadExtension('GL_EXT_framebuffer_object') then
       
   754         begin
       
   755             CreateFramebuffer(defaultFrame, depthv, texv);
       
   756             glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, defaultFrame);
       
   757             AddFileLog('Using framebuffer for video recording.');
       
   758         end
       
   759         else if AuxBufNum > 0 then
       
   760         begin
       
   761             glDrawBuffer(GL_AUX0);
       
   762             glReadBuffer(GL_AUX0);
       
   763             AddFileLog('Using auxilary buffer for video recording.');
       
   764         end
       
   765         else
       
   766         begin
       
   767             glDrawBuffer(GL_BACK);
       
   768             glReadBuffer(GL_BACK);
       
   769             AddFileLog('Warning: off-screen rendering is not supported; using back buffer but it may not work.');
       
   770         end;
       
   771     end;
       
   772 {$ENDIF}
   714 
   773 
   715 {$IFNDEF S3D_DISABLED}
   774 {$IFNDEF S3D_DISABLED}
   716     if (cStereoMode = smHorizontal) or (cStereoMode = smVertical) or (cStereoMode = smAFR) then
   775     if (cStereoMode = smHorizontal) or (cStereoMode = smVertical) or (cStereoMode = smAFR) then
   717     begin
   776     begin
   718         // prepare left and right frame buffers and associated textures
   777         // prepare left and right frame buffers and associated textures
   719         if glLoadExtension('GL_EXT_framebuffer_object') then
   778         if glLoadExtension('GL_EXT_framebuffer_object') then
   720             begin
   779             begin
   721             // left
   780             CreateFramebuffer(framel, depthl, texl);
   722             glGenFramebuffersEXT(1, @framel);
   781             CreateFramebuffer(framer, depthr, texr);
   723             glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, framel);
       
   724             glGenRenderbuffersEXT(1, @depthl);
       
   725             glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, depthl);
       
   726             glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT, cScreenWidth, cScreenHeight);
       
   727             glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, depthl);
       
   728             glGenTextures(1, @texl);
       
   729             glBindTexture(GL_TEXTURE_2D, texl);
       
   730             glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8,  cScreenWidth, cScreenHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, nil);
       
   731             glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
       
   732             glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
       
   733             glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, texl, 0);
       
   734 
       
   735             // right
       
   736             glGenFramebuffersEXT(1, @framer);
       
   737             glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, framer);
       
   738             glGenRenderbuffersEXT(1, @depthr);
       
   739             glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, depthr);
       
   740             glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT, cScreenWidth, cScreenHeight);
       
   741             glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, depthr);
       
   742             glGenTextures(1, @texr);
       
   743             glBindTexture(GL_TEXTURE_2D, texr);
       
   744             glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8,  cScreenWidth, cScreenHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, nil);
       
   745             glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
       
   746             glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
       
   747             glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, texr, 0);
       
   748 
   782 
   749             // reset
   783             // reset
   750             glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0)
   784             glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, defaultFrame)
   751             end
   785             end
   752         else
   786         else
   753             cStereoMode:= smNone;
   787             cStereoMode:= smNone;
   754     end;
   788     end;
   755 {$ENDIF}
   789 {$ENDIF}
  1018 begin
  1052 begin
  1019 // free the existing texture (if there is any)
  1053 // free the existing texture (if there is any)
  1020 FreeTexture(WeaponTooltipTex);
  1054 FreeTexture(WeaponTooltipTex);
  1021 WeaponTooltipTex:= nil
  1055 WeaponTooltipTex:= nil
  1022 end;
  1056 end;
       
  1057 
       
  1058 {$IFDEF USE_VIDEO_RECORDING}
       
  1059 {$IFDEF SDL13}
       
  1060 procedure InitOffscreenOpenGL;
       
  1061 begin
       
  1062     // create hidden window
       
  1063     SDLwindow:= SDL_CreateWindow('hedgewars (you don''t see this)',
       
  1064                                  SDL_WINDOWPOS_CENTERED_MASK, SDL_WINDOWPOS_CENTERED_MASK,
       
  1065                                  cScreenWidth, cScreenHeight,
       
  1066                                  SDL_WINDOW_HIDDEN or SDL_WINDOW_OPENGL);
       
  1067     SDLTry(SDLwindow <> nil, true);
       
  1068     SetupOpenGL();
       
  1069 end;
       
  1070 {$ELSE}
       
  1071 procedure InitOffscreenOpenGL;
       
  1072 var ArgCount: LongInt;
       
  1073     PrgName: pchar;
       
  1074 begin
       
  1075     ArgCount:= 1;
       
  1076     PrgName:= 'hwengine';
       
  1077     glutInit(@ArgCount, @PrgName);
       
  1078     glutInitWindowSize(cScreenWidth, cScreenHeight);
       
  1079     glutCreateWindow('hedgewars (you don''t see this)'); // we don't need a window, but if this function is not called then OpenGL will not be initialized
       
  1080     glutHideWindow();
       
  1081     SetupOpenGL();
       
  1082 end;
       
  1083 {$ENDIF} // SDL13
       
  1084 {$ENDIF} // USE_VIDEO_RECORDING
  1023 
  1085 
  1024 procedure chFullScr(var s: shortstring);
  1086 procedure chFullScr(var s: shortstring);
  1025 var flags: Longword = 0;
  1087 var flags: Longword = 0;
  1026     reinit: boolean = false;
  1088     reinit: boolean = false;
  1027     {$IFNDEF DARWIN}ico: PSDL_Surface;{$ENDIF}
  1089     {$IFNDEF DARWIN}ico: PSDL_Surface;{$ENDIF}
  1199 {$ENDIF}
  1261 {$ENDIF}
  1200 end;
  1262 end;
  1201 
  1263 
  1202 procedure SwapBuffers; inline;
  1264 procedure SwapBuffers; inline;
  1203 begin
  1265 begin
       
  1266     if GameType = gmtRecord then
       
  1267         exit;
  1204 {$IFDEF SDL13}
  1268 {$IFDEF SDL13}
  1205     SDL_GL_SwapWindow(SDLwindow);
  1269     SDL_GL_SwapWindow(SDLwindow);
  1206 {$ELSE}
  1270 {$ELSE}
  1207     SDL_GL_SwapBuffers();
  1271     SDL_GL_SwapBuffers();
  1208 {$ENDIF}
  1272 {$ENDIF}