| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155 |
- {$G+}
- {Innocenty Enikeew Copyright 2001}
- {�à®£à ¬¬ -¤¥¬®áâà æ¨ï «£®à¨â¬ 2d-bump mapping
- (¨¬¨â æ¨ï ¥à®¢®© ¯®¢¥àå®áâ¨) €«£®à¨â¬ ᯥàâ ®âªã¤ -â® ¨§ ¨¥â :) }
- const
- bright = 253; {‘¨« ¨áâ®ç¨ª ᢥâ }
- density = 64; {� ¤¨ãá ᢥ⮢®£® ¯ïâ }
- procedure SetMode(Mode:word);assembler; {“áâ ®¢ª £à ä. ०¨¬ . �¥§ ¯à®¢¥à®ª}
- asm
- mov ax, Mode
- int 10h
- end;{SetMode}
- {-------------------}
- Procedure CreatePalette; {‘®§¤ ¨¥ 㦮© ¯ «¨âàë
- 256-梥⮣® ०¨¬ }
- var
- R,G,B,i : byte;
- begin
- asm
- mov dx, 3c6h {�®àâ ॣ¨áâà ¬ ᪨ ¯ «¨âàë}
- mov al, 0ffh { FF - 0-256 -¢áï ¯ «¨âà }
- out dx, al {We will change all palette}
- mov dx, 3c8h {�®àâ ¢ë¡®à ®¬¥à 梥⠤«ï § ¯¨á¨ ¢ ¯ «¨âàã}
- mov al, 0
- out dx, al {Beginning from first}
- end;
- R:=0;G:=0;B:=0;
- for i := 1 to 192 do
- begin
- R := i shr 2;
- G := (i * 16) div 192;
- asm
- mov dx, 3C9h
- mov al, R
- out dx, al
- mov al, G
- out dx, al
- mov al, B
- out dx, al
- end;
- end;
- for i := 1 to 64 do
- begin
- R := 48 + (i shr 2);
- G := 16 + (i*48) shr 6;
- asm
- mov dx, 3C9h
- mov al, R
- out dx, al
- mov al, G
- out dx, al
- mov al, B
- out dx, al
- end;
- end;
- end;{CreatePalette}
- {-------------------------------}
- Function KeyPressed:boolean;assembler;
- asm
- mov ah, 1
- int 16h
- mov al, 0
- jz @@2
- mov al, 1
- @@2:
- end;
- type
- tEnv = array [0..250,0..250] of byte;
- tScr = array [0..199,0..319] of byte;
- var
- Inp : FILE;
- envmap : ^TEnv;
- bump,BackBuffer : ^tScr;
- i,j,lx,ly : integer;
- nx,ny : integer;
- dx,dy : integer;
- x,y,z : real;
- Procedure Draw;
- begin
- for i:=0 to 199 do
- for j := 0 to 319 do
- begin
- nx := bump^[i,j] - bump^[i,j+1] - (lx-j) + density;
- ny := bump^[i,j] - bump^[i+1,j] - (ly-i) + density;
- if (nx>=255) or (nx<0) then nx := 255;
- if (ny>=255) or (ny<0) then ny := 255;
- BackBuffer^[i,j] := envmap^[ny,nx];
- end;
- end;
- {-----------------------}
- Procedure DrawBack;assembler; {�à®à¨á®¢ª ¡ãä¥à íªà }
- asm
- push es
- push ds
- mov cx, 320*200
- shr cx, 1
- push 0A000h
- pop es
- xor di, di
- lds si, BackBuffer
- repe movsw
- pop ds
- pop es
- end;
- {-----------------------}
- begin
- GetMem(bump,SizeOf(tScr));
- GetMem(BackBuffer,SizeOf(tScr));
- GetMem(EnvMap,256*256-1);
- for i := 0 to 255 do
- for j := 0 to 255 do
- begin
- x := j/density-1;
- y := i/density-1;
- z := 1 - sqrt(x*x+y*y);
- if z < 0 then z:=0;
- envmap^[i,j] := round(z*bright);
- end;
- Assign(Inp,'bump3.tga');
- Reset(inP,1);
- Seek(inP,$312);
- BlockRead(Inp,Bump^,320*200);
- Close(inp);
- lx := 90;
- ly := 100;
- dx := 1;
- dy := 1;
- SetMode($13);
- CreatePalette;
- while not keypressed do
- begin
- Draw;
- repeat until (Port[$03DA] and 8) <> 8;
- repeat until (Port[$03DA] and 8) = 8;
- DrawBack;
- inc(lx,dx);
- inc(ly,dy);
- if (lx > 310) or (lx<5) then dx := -dx;
- if (ly > 190) or (ly<5) then dy := -dy;
- end;
- SetMode(3);
- FreeMem(bump,SizeOf(tScr));
- freeMem(BackBuffer,SizeOf(tScr));
- freeMem(EnvMap,256*256-1);
- end.
|