BUMP2.PAS 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. {$G+}
  2. {Innocenty Enikeew Copyright 2001}
  3. {�ணࠬ¬ -¤¥¬®­áâà æ¨ï  «£®à¨â¬  2d-bump mapping
  4. (¨¬¨â æ¨ï ­¥à®¢­®© ¯®¢¥àå­®áâ¨) €«£®à¨â¬ ᯥàâ ®âªã¤ -â® ¨§ ¨­¥â  :) }
  5. const
  6. bright = 253; {‘¨«  ¨áâ®ç­¨ª  ᢥâ }
  7. density = 64; {� ¤¨ãá ᢥ⮢®£® ¯ïâ­ }
  8. procedure SetMode(Mode:word);assembler; {“áâ ­®¢ª  £à ä. ०¨¬ . �¥§ ¯à®¢¥à®ª}
  9. asm
  10. mov ax, Mode
  11. int 10h
  12. end;{SetMode}
  13. {-------------------}
  14. Procedure CreatePalette; {‘®§¤ ­¨¥ ­ã¦­®© ¯ «¨âàë
  15. 256-梥⭮£® ०¨¬ }
  16. var
  17. R,G,B,i : byte;
  18. begin
  19. asm
  20. mov dx, 3c6h {�®àâ ॣ¨áâà  ¬ áª¨ ¯ «¨âàë}
  21. mov al, 0ffh { FF - 0-256 -¢áï ¯ «¨âà }
  22. out dx, al {We will change all palette}
  23. mov dx, 3c8h {�®àâ ¢ë¡®à  ­®¬¥à  æ¢¥â  ¤«ï § ¯¨á¨ ¢ ¯ «¨âàã}
  24. mov al, 0
  25. out dx, al {Beginning from first}
  26. end;
  27. R:=0;G:=0;B:=0;
  28. for i := 1 to 192 do
  29. begin
  30. R := i shr 2;
  31. G := (i * 16) div 192;
  32. asm
  33. mov dx, 3C9h
  34. mov al, R
  35. out dx, al
  36. mov al, G
  37. out dx, al
  38. mov al, B
  39. out dx, al
  40. end;
  41. end;
  42. for i := 1 to 64 do
  43. begin
  44. R := 48 + (i shr 2);
  45. G := 16 + (i*48) shr 6;
  46. asm
  47. mov dx, 3C9h
  48. mov al, R
  49. out dx, al
  50. mov al, G
  51. out dx, al
  52. mov al, B
  53. out dx, al
  54. end;
  55. end;
  56. end;{CreatePalette}
  57. {-------------------------------}
  58. Function KeyPressed:boolean;assembler;
  59. asm
  60. mov ah, 1
  61. int 16h
  62. mov al, 0
  63. jz @@2
  64. mov al, 1
  65. @@2:
  66. end;
  67. type
  68. tEnv = array [0..250,0..250] of byte;
  69. tScr = array [0..199,0..319] of byte;
  70. var
  71. Inp : FILE;
  72. envmap : ^TEnv;
  73. bump,BackBuffer : ^tScr;
  74. i,j,lx,ly : integer;
  75. nx,ny : integer;
  76. dx,dy : integer;
  77. x,y,z : real;
  78. Procedure Draw;
  79. begin
  80. for i:=0 to 199 do
  81. for j := 0 to 319 do
  82. begin
  83. nx := bump^[i,j] - bump^[i,j+1] - (lx-j) + density;
  84. ny := bump^[i,j] - bump^[i+1,j] - (ly-i) + density;
  85. if (nx>=255) or (nx<0) then nx := 255;
  86. if (ny>=255) or (ny<0) then ny := 255;
  87. BackBuffer^[i,j] := envmap^[ny,nx];
  88. end;
  89. end;
  90. {-----------------------}
  91. Procedure DrawBack;assembler; {�à®à¨á®¢ª  ¡ãä¥à  ­  íªà ­}
  92. asm
  93. push es
  94. push ds
  95. mov cx, 320*200
  96. shr cx, 1
  97. push 0A000h
  98. pop es
  99. xor di, di
  100. lds si, BackBuffer
  101. repe movsw
  102. pop ds
  103. pop es
  104. end;
  105. {-----------------------}
  106. begin
  107. GetMem(bump,SizeOf(tScr));
  108. GetMem(BackBuffer,SizeOf(tScr));
  109. GetMem(EnvMap,256*256-1);
  110. for i := 0 to 255 do
  111. for j := 0 to 255 do
  112. begin
  113. x := j/density-1;
  114. y := i/density-1;
  115. z := 1 - sqrt(x*x+y*y);
  116. if z < 0 then z:=0;
  117. envmap^[i,j] := round(z*bright);
  118. end;
  119. Assign(Inp,'bump3.tga');
  120. Reset(inP,1);
  121. Seek(inP,$312);
  122. BlockRead(Inp,Bump^,320*200);
  123. Close(inp);
  124. lx := 90;
  125. ly := 100;
  126. dx := 1;
  127. dy := 1;
  128. SetMode($13);
  129. CreatePalette;
  130. while not keypressed do
  131. begin
  132. Draw;
  133. repeat until (Port[$03DA] and 8) <> 8;
  134. repeat until (Port[$03DA] and 8) = 8;
  135. DrawBack;
  136. inc(lx,dx);
  137. inc(ly,dy);
  138. if (lx > 310) or (lx<5) then dx := -dx;
  139. if (ly > 190) or (ly<5) then dy := -dy;
  140. end;
  141. SetMode(3);
  142. FreeMem(bump,SizeOf(tScr));
  143. freeMem(BackBuffer,SizeOf(tScr));
  144. freeMem(EnvMap,256*256-1);
  145. end.