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 |
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} |