hedgewars/uWorld.pas
changeset 7080 dbf43c07a507
parent 7069 bcf9d8e64e92
child 7082 17b0892ac794
equal deleted inserted replaced
7079:939f53515489 7080:dbf43c07a507
   812     end;
   812     end;
   813 end;
   813 end;
   814 
   814 
   815 procedure DrawWaves(Dir, dX, dY: LongInt; tnt: Byte);
   815 procedure DrawWaves(Dir, dX, dY: LongInt; tnt: Byte);
   816 var VertexBuffer, TextureBuffer: array [0..3] of TVertex2f;
   816 var VertexBuffer, TextureBuffer: array [0..3] of TVertex2f;
   817     lw, waves, shift: GLfloat;
   817     lw, waves: GLfloat;
   818     sprite: TSprite;
   818     sprite: TSprite;
       
   819     r: TSDL_Rect;
   819 begin
   820 begin
   820 if SuddenDeathDmg then
   821 if SuddenDeathDmg then
   821     sprite:= sprSDWater
   822     sprite:= sprSDWater
   822 else
   823 else
   823     sprite:= sprWater;
   824     sprite:= sprWater;
   824 
   825 
   825 cWaveWidth:= SpritesData[sprite].Width;
   826 cWaveWidth:= SpritesData[sprite].Width;
   826 
   827 
   827 lw:= cScreenWidth / cScaleFactor;
   828 lw:= cScreenWidth / cScaleFactor;
   828 waves:= lw * 2 / cWaveWidth;
       
   829 
   829 
   830 if SuddenDeathDmg then
   830 if SuddenDeathDmg then
   831     Tint(LongInt(tnt) * SDWaterColorArray[2].r div 255 + 255 - tnt,
   831     Tint(LongInt(tnt) * SDWaterColorArray[2].r div 255 + 255 - tnt,
   832          LongInt(tnt) * SDWaterColorArray[2].g div 255 + 255 - tnt,
   832          LongInt(tnt) * SDWaterColorArray[2].g div 255 + 255 - tnt,
   833          LongInt(tnt) * SDWaterColorArray[2].b div 255 + 255 - tnt,
   833          LongInt(tnt) * SDWaterColorArray[2].b div 255 + 255 - tnt,
   838          LongInt(tnt) * WaterColorArray[2].g div 255 + 255 - tnt,
   838          LongInt(tnt) * WaterColorArray[2].g div 255 + 255 - tnt,
   839          LongInt(tnt) * WaterColorArray[2].b div 255 + 255 - tnt,
   839          LongInt(tnt) * WaterColorArray[2].b div 255 + 255 - tnt,
   840          255
   840          255
   841     );
   841     );
   842 
   842 
   843 glBindTexture(GL_TEXTURE_2D, SpritesData[sprite].Texture^.id);
   843 glBindTexture(GL_TEXTURE_2D, SpritesData[sprite].Texture^.atlas^.id);
   844 
   844 
   845 VertexBuffer[0].X:= -lw;
   845 VertexBuffer[0].X:= -lw;
   846 VertexBuffer[0].Y:= cWaterLine + WorldDy + dY;
   846 VertexBuffer[0].Y:= cWaterLine + WorldDy + dY;
   847 VertexBuffer[1].X:= lw;
   847 VertexBuffer[1].X:= lw;
   848 VertexBuffer[1].Y:= VertexBuffer[0].Y;
   848 VertexBuffer[1].Y:= VertexBuffer[0].Y;
   849 VertexBuffer[2].X:= lw;
   849 VertexBuffer[2].X:= lw;
   850 VertexBuffer[2].Y:= VertexBuffer[0].Y + SpritesData[sprite].Height;
   850 VertexBuffer[2].Y:= VertexBuffer[0].Y + SpritesData[sprite].Height;
   851 VertexBuffer[3].X:= -lw;
   851 VertexBuffer[3].X:= -lw;
   852 VertexBuffer[3].Y:= VertexBuffer[2].Y;
   852 VertexBuffer[3].Y:= VertexBuffer[2].Y;
   853 
   853 
   854 shift:= - lw / cWaveWidth;
   854 // this uses texture repeat mode, when using an atlas rect we need to split to several quads here!
   855 TextureBuffer[0].X:= shift + (( - WorldDx + LongInt(RealTicks shr 6) * Dir + dX) mod cWaveWidth) / (cWaveWidth - 1);
   855 r.x := -Trunc(lw) + (( - WorldDx + LongInt(RealTicks shr 6) * Dir + dX) mod cWaveWidth);
   856 TextureBuffer[0].Y:= 0;
   856 r.y:= 0;
   857 TextureBuffer[1].X:= TextureBuffer[0].X + waves;
   857 r.w:= Trunc(lw + lw);
   858 TextureBuffer[1].Y:= TextureBuffer[0].Y;
   858 r.h:= SpritesData[sprite].Texture^.h;
   859 TextureBuffer[2].X:= TextureBuffer[1].X;
   859 ComputeTexcoords(SpritesData[sprite].Texture, @r, @TextureBuffer);
   860 TextureBuffer[2].Y:= SpritesData[sprite].Texture^.ry;
       
   861 TextureBuffer[3].X:= TextureBuffer[0].X;
       
   862 TextureBuffer[3].Y:= TextureBuffer[2].Y;
       
   863 
   860 
   864 
   861 
   865 glVertexPointer(2, GL_FLOAT, 0, @VertexBuffer[0]);
   862 glVertexPointer(2, GL_FLOAT, 0, @VertexBuffer[0]);
   866 glTexCoordPointer(2, GL_FLOAT, 0, @TextureBuffer[0]);
   863 glTexCoordPointer(2, GL_FLOAT, 0, @TextureBuffer[0]);
   867 glDrawArrays(GL_TRIANGLE_FAN, 0, Length(VertexBuffer));
   864 glDrawArrays(GL_TRIANGLE_FAN, 0, Length(VertexBuffer));