hedgewars/uWorld.pas
branchexperimental3D
changeset 3696 6009d8378422
parent 3692 bbec1275e46f
child 4004 b1c2c2f6fc5e
equal deleted inserted replaced
3694:3e9c0634065c 3696:6009d8378422
    20 
    20 
    21 unit uWorld;
    21 unit uWorld;
    22 interface
    22 interface
    23 uses SDLh, uGears, uConsts, uFloat, uRandom;
    23 uses SDLh, uGears, uConsts, uFloat, uRandom;
    24 
    24 
    25 type TRenderMode = (rmDefault, rmLeftEye, rmRightEye);
       
    26 
       
    27 var FollowGear: PGear;
    25 var FollowGear: PGear;
    28     WindBarWidth: LongInt;
    26     WindBarWidth: LongInt;
    29     bShowAmmoMenu: boolean;
    27     bShowAmmoMenu: boolean;
    30     bSelected: boolean;
    28     bSelected: boolean;
    31     bShowFinger: boolean;
    29     bShowFinger: boolean;
    32     Frames: Longword;
    30     Frames: Longword;
       
    31     AFRToggle: Boolean;
    33     WaterColor, DeepWaterColor: TSDL_Color;
    32     WaterColor, DeepWaterColor: TSDL_Color;
    34     WorldDx: LongInt;
    33     WorldDx: LongInt;
    35     WorldDy: LongInt;
    34     WorldDy: LongInt;
    36     SkyOffset: LongInt;
    35     SkyOffset: LongInt;
    37     HorizontOffset: LongInt;
    36     HorizontOffset: LongInt;
       
    37     bAFRRight: Boolean;
    38 {$IFDEF COUNTTICKS}
    38 {$IFDEF COUNTTICKS}
    39     cntTicks: LongWord;
    39     cntTicks: LongWord;
    40 {$ENDIF}
    40 {$ENDIF}
    41     cOffsetY: LongInt;
    41     cOffsetY: LongInt;
    42     
    42     
   562     //glScalef(1.0, 1.0, 1.0);
   562     //glScalef(1.0, 1.0, 1.0);
   563 
   563 
   564     if not isPaused then
   564     if not isPaused then
   565         MoveCamera;
   565         MoveCamera;
   566 
   566 
   567     if not isStereoEnabled then
   567     if cStereoMode = smNone then
   568     begin
   568         begin
   569         glClear(GL_COLOR_BUFFER_BIT);
   569         glClear(GL_COLOR_BUFFER_BIT);
   570         DrawWorldStereo(Lag, rmDefault)
   570         DrawWorldStereo(Lag, rmDefault)
   571     end
   571         end
   572     else
   572     else if (cStereoMode = smAFR) then
   573     begin
   573         begin
       
   574         AFRToggle:= not AFRToggle;
       
   575         glClear(GL_COLOR_BUFFER_BIT);
       
   576         if AFRToggle then
       
   577             DrawWorldStereo(Lag, rmLeftEye)
       
   578         else
       
   579             DrawWorldStereo(Lag, rmRightEye)
       
   580         end
       
   581     else if (cStereoMode = smHorizontal) or (cStereoMode = smVertical) then
       
   582         begin
   574         // create left fb
   583         // create left fb
   575         glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, framel);
   584         glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, framel);
   576         glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
   585         glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
   577         DrawWorldStereo(Lag, rmLeftEye);
   586         DrawWorldStereo(Lag, rmLeftEye);
   578 
   587 
   581         glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
   590         glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
   582         DrawWorldStereo(0, rmRightEye);
   591         DrawWorldStereo(0, rmRightEye);
   583 
   592 
   584         // detatch drawing from fbs
   593         // detatch drawing from fbs
   585         glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
   594         glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
   586         glGetFloatv(GL_COLOR_CLEAR_VALUE, @cc);
       
   587         glClearColor(0, 0, 0, 0);
       
   588         glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
   595         glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
   589         glClearColor(cc[0], cc[1], cc[2], cc[3]);
       
   590         SetScale(cDefaultZoomLevel);
   596         SetScale(cDefaultZoomLevel);
   591 
       
   592         // enable gl stuff
       
   593         glEnable(GL_TEXTURE_2D);
       
   594         glEnable(GL_BLEND);
       
   595         glBlendFunc(GL_ONE, GL_ONE);
       
   596 
   597 
   597         // draw left frame
   598         // draw left frame
   598         glBindTexture(GL_TEXTURE_2D, texl);
   599         glBindTexture(GL_TEXTURE_2D, texl);
   599         glColor3f(0.0, 1.0, 1.0);
       
   600         glBegin(GL_QUADS);
   600         glBegin(GL_QUADS);
   601             glTexCoord2f(0.0, 0.0);
   601             if cStereoMode = smHorizontal then
   602             glVertex2d(cScreenWidth / -2, cScreenHeight);
   602                 begin
   603             glTexCoord2f(1.0, 0.0);
   603                 glTexCoord2f(0.0, 0.0);
   604             glVertex2d(cScreenWidth / 2, cScreenHeight);
   604                 glVertex2d(cScreenWidth / -2, cScreenHeight);
   605             glTexCoord2f(1.0, 1.0);
   605                 glTexCoord2f(1.0, 0.0);
   606             glVertex2d(cScreenWidth / 2, 0);
   606                 glVertex2d(0, cScreenHeight);
   607             glTexCoord2f(0.0, 1.0);
   607                 glTexCoord2f(1.0, 1.0);
   608             glVertex2d(cScreenWidth / -2, 0);
   608                 glVertex2d(0, 0);
       
   609                 glTexCoord2f(0.0, 1.0);
       
   610                 glVertex2d(cScreenWidth / -2, 0);
       
   611                 end
       
   612             else
       
   613                 begin
       
   614                 glTexCoord2f(0.0, 0.0);
       
   615                 glVertex2d(cScreenWidth / -2, cScreenHeight / 2);
       
   616                 glTexCoord2f(1.0, 0.0);
       
   617                 glVertex2d(cScreenWidth / 2, cScreenHeight / 2);
       
   618                 glTexCoord2f(1.0, 1.0);
       
   619                 glVertex2d(cScreenWidth / 2, 0);
       
   620                 glTexCoord2f(0.0, 1.0);
       
   621                 glVertex2d(cScreenWidth / -2, 0);
       
   622                 end;
   609         glEnd();
   623         glEnd();
   610 
   624 
   611         // draw right frame
   625         // draw right frame
   612         glBindTexture(GL_TEXTURE_2D, texr);
   626         glBindTexture(GL_TEXTURE_2D, texr);
   613         glColor3f(1.0, 0.0, 0.0);
       
   614         glBegin(GL_QUADS);
   627         glBegin(GL_QUADS);
   615             glTexCoord2f(0.0, 0.0);
   628             if cStereoMode = smHorizontal then
   616             glVertex2d(cScreenWidth / -2, cScreenHeight);
   629                 begin
   617             glTexCoord2f(1.0, 0.0);
   630                 glTexCoord2f(0.0, 0.0);
   618             glVertex2d(cScreenWidth / 2, cScreenHeight);
   631                 glVertex2d(0, cScreenHeight);
   619             glTexCoord2f(1.0, 1.0);
   632                 glTexCoord2f(1.0, 0.0);
   620             glVertex2d(cScreenWidth / 2, 0);
   633                 glVertex2d(cScreenWidth / 2, cScreenHeight);
   621             glTexCoord2f(0.0, 1.0);
   634                 glTexCoord2f(1.0, 1.0);
   622             glVertex2d(cScreenWidth / -2, 0);
   635                 glVertex2d(cScreenWidth / 2, 0);
       
   636                 glTexCoord2f(0.0, 1.0);
       
   637                 glVertex2d(0, 0);
       
   638                 end
       
   639             else
       
   640                 begin
       
   641                 glTexCoord2f(0.0, 0.0);
       
   642                 glVertex2d(cScreenWidth / -2, cScreenHeight);
       
   643                 glTexCoord2f(1.0, 0.0);
       
   644                 glVertex2d(cScreenWidth / 2, cScreenHeight);
       
   645                 glTexCoord2f(1.0, 1.0);
       
   646                 glVertex2d(cScreenWidth / 2, cScreenHeight / 2);
       
   647                 glTexCoord2f(0.0, 1.0);
       
   648                 glVertex2d(cScreenWidth / -2, cScreenHeight / 2);
       
   649                 end;
   623         glEnd();
   650         glEnd();
   624 
       
   625         // reset
       
   626         glColor3f(1.0, 1.0, 1.0);
       
   627         glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
       
   628         SetScale(zoom);
   651         SetScale(zoom);
   629     end
   652         end
       
   653     else
       
   654         begin
       
   655         // clear scene
       
   656         glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
       
   657         glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
       
   658         // draw left eye in red channel only
       
   659         if cStereoMode = smGreenRed then
       
   660             glColorMask(GL_FALSE, GL_TRUE, GL_FALSE, GL_TRUE)
       
   661         else if cStereoMode = smBlueRed then
       
   662             glColorMask(GL_FALSE, GL_FALSE, GL_TRUE, GL_TRUE)
       
   663         else if cStereoMode = smCyanRed then
       
   664             glColorMask(GL_FALSE, GL_TRUE, GL_TRUE, GL_TRUE)
       
   665         else
       
   666             glColorMask(GL_TRUE, GL_FALSE, GL_FALSE, GL_TRUE);
       
   667         DrawWorldStereo(Lag, rmLeftEye);
       
   668         // draw right eye in selected channel(s) only
       
   669         if cStereoMode = smRedGreen then
       
   670             glColorMask(GL_FALSE, GL_TRUE, GL_FALSE, GL_TRUE)
       
   671         else if cStereoMode = smRedBlue then
       
   672             glColorMask(GL_FALSE, GL_FALSE, GL_TRUE, GL_TRUE)
       
   673         else if cStereoMode = smRedCyan then
       
   674             glColorMask(GL_FALSE, GL_TRUE, GL_TRUE, GL_TRUE)
       
   675         else
       
   676             glColorMask(GL_TRUE, GL_FALSE, GL_FALSE, GL_TRUE);
       
   677         DrawWorldStereo(Lag, rmRightEye);
       
   678         end
   630 end;
   679 end;
   631 
   680 
   632 procedure ChangeDepth(rm: TRenderMode; d: GLfloat);
   681 procedure ChangeDepth(rm: TRenderMode; d: GLfloat);
   633 begin
   682 begin
       
   683     d:= d / 5;
   634     if rm = rmDefault then exit
   684     if rm = rmDefault then exit
   635     else if rm = rmRightEye then d:= -d;
   685     else if rm = rmLeftEye then d:= -d;
   636     stereoDepth:= stereoDepth + d;
   686     stereoDepth:= stereoDepth + d;
   637     glMatrixMode(GL_PROJECTION);
   687     glMatrixMode(GL_PROJECTION);
   638     glTranslatef(d, 0, 0);
   688     glTranslatef(d, 0, 0);
   639     glMatrixMode(GL_MODELVIEW)
   689     glMatrixMode(GL_MODELVIEW)
   640 end;
   690 end;
   969 offsetX:= 10;
  1019 offsetX:= 10;
   970 {$ENDIF}
  1020 {$ENDIF}
   971 offsetY:= cOffsetY;
  1021 offsetY:= cOffsetY;
   972 
  1022 
   973 // don't increment fps when drawing the right frame
  1023 // don't increment fps when drawing the right frame
   974 if (RM = rmDefault) or (RM = rmLeftEye) then
  1024 if (RM = rmDefault) or (RM = rmRightEye) then
   975 begin
  1025 begin
   976     inc(Frames);
  1026     inc(Frames);
   977 
  1027 
   978     if cShowFPS or (GameType = gmtDemo) then
  1028     if cShowFPS or (GameType = gmtDemo) then
   979         inc(CountTicks, Lag);
  1029         inc(CountTicks, Lag);