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)); |