Информационный сервер для программистов: Исходники со всего света. Паскальные исходники со всего света
  Powered by Поисковый сервер Яndex: Найдется ВСЁ!
На Главную Исходники Форум Информер Страны мира
   Demo Making    >>    3dwave
   
 
 3D Wave Effect by Jare/Iguana  Jare/Iguana 16.02.1995

Эффект волн на воде [320x200x256].
Very cool 3d-waves (like water).



1k 
 

(* ---------------------------- WAV3D.PAS ------------------------- *) (* Coded bye Jare/Iguana in 1993. Want more comment's? Write'em! *) (* Use this as you like; you're going to anyway, so who cares. *) (* But remember: proper crediting and greeting rules. *) USES Dos; VAR reg : Registers; FUNCTION GetKey: WORD; BEGIN reg.AH := 0; Intr($16, reg); GetKey := reg.AX END; FUNCTION TestKey: BOOLEAN; BEGIN reg.AH := 1; Intr($16, reg); TestKey := (reg.Flags AND FZero) = 0 END; PROCEDURE VSync; BEGIN WHILE (Port[$3DA] AND 8) = 8 DO; WHILE (Port[$3DA] AND 8) <> 8 DO; END; (* -------------------- *) TYPE tScrBuf = ARRAY [0..200-1,0..320-1] OF BYTE; tScrWBuf = ARRAY [0..200-1,0..160-1] OF WORD; VAR VGABuf : TScrBuf ABSOLUTE $A000:0000; VGAWBuf : TScrWBuf ABSOLUTE $A000:0000; VAR i,j,k,n : INTEGER; { Shitty global vars. This is just a prototype!} r, d, v, a : REAL; c, lasth, limit : WORD; highest : ARRAY [0..159] OF BYTE; TYPE TWavBuf = ARRAY [0..63, 0..127] OF BYTE; TLandBuf = ARRAY [0..31, 0..159] OF BYTE; VAR Wb : TWavBuf; fw : FILE OF TWavBuf; lb : TLandBuf; fl : FILE OF TLandBuf; CONST MaxRadius = 159.0*159.0 + 31.0*31.0; s159 = 159.0*159.0; s31 = 31.0*31.0; PROCEDURE GenerateLand; BEGIN FOR i := 0 TO 31 DO FOR j := 0 TO 159 DO BEGIN lb[i,j] := ROUND(SQRT((i+0.0)*i/s31 + (j+0.0)*j/s159)*127{/SQRT(2)}); IF lb[i,j] > 127 THEN lb[i,j] := 127 END; Assign(fl, 'land.dat'); { Escritura de la tabla. } ReWrite(fl); Write(fl, lb); Close(fl) END; PROCEDURE GenerateWav; BEGIN FOR j := 0 TO 63 DO { Generacion de la tabla. } FOR i := 0 TO 127{319} DO BEGIN r := (i+1) * 5.0 * PI / 320.0; d := j * PI / 32.0; v := ((Sin(r - d)-Sin(-d)) / r ) - (Cos(r-d)/2); a := Cos(i*PI/2/128); k := 100 + ROUND(100.0 * a * a * v); Wb[j, i] := BYTE(k); VGABuf[k,i] := 150 + j END; Assign(fw, 'waves.dat'); { Grabaciвn de la tabla. } ReWrite(fw); Write(fw, wb); Close(fw) END; VAR par, pcod : INTEGER; BEGIN VAL(ParamStr(1), par, pcod); IF pcod = 0 THEN BEGIN ASM MOV AX,13h INT 10h END; IF (par AND 1) = 1 THEN GenerateLand; IF (par AND 2) = 2 THEN GenerateWav; END ELSE BEGIN WriteLn('3D Wave bye Jare/Iguana (Pascal prototype & .DAT', ' generator).'#13#10, ' Type "WAV3D 3" to generate files. From then on just', ' type "WAV3D 0",'#13#10, ' which will use the created files.'); HALT END; Assign(fl, 'land.dat'); { Lectura de la tabla. } ReSet(fl); Read(fl, lb); Close(fl); Assign(fw, 'waves.dat'); { Lectura de la tabla. } ReSet(fw); Read(fw, wb); Close(fw); FillChar(VGABuf, 64000, 0); FillChar(highest, 160, 199); WHILE TestKey DO GetKey; ASM MOV CX,64 MOV DX,03C8h MOV AL,64 OUT DX,AL INC DX XOR AL,AL @@l: OUT DX,AL OUT DX,AL OUT DX,AL INC AL LOOP @@l END; k := 0; REPEAT n := (k + 1) MOD 64; FOR j := 0 TO 159 DO BEGIN c := 63+64; lasth := 199; FOR i := 31 DOWNTO 0 DO BEGIN limit := 56+i+Wb[n,Lb[i,j]]; WHILE lasth > limit DO BEGIN VGABuf[lasth,j+160] := c; VGABuf[lasth,159-j] := c; DEC(lasth) END; DEC(c) END; FOR i := 0 TO 31 DO BEGIN limit := 55-i+Wb[n,Lb[i,j]]; WHILE lasth > limit DO BEGIN VGABuf[lasth,j+160] := c; VGABuf[lasth,159-j] := c; DEC(lasth) END; DEC(c) END; FOR i := lasth DOWNTO highest[j] DO BEGIN VGABuf[i, j+160] := 0; VGABuf[i, 159-j] := 0 END; highest[j] := lasth END; VSync; k := n UNTIL TestKey; GetKey; ASM MOV AX,3h INT 10h END END.