BUMP.PAS 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. {$G+}
  2. {Innocenty Enikeew Copyright 2001}
  3. {Программа-демонстрация алгоритма 2d-bump mapping
  4. (имитация неровной поверхности) Алгоритм сперт откуда-то из инета :) }
  5. const
  6. bright = 169; {Сила источника света}
  7. density = 128; {Радиус светового пятна}
  8. procedure SetMode(Mode:word);assembler; {Установка граф. режима. Без проверок}
  9. asm
  10. mov ax, Mode
  11. int 10h
  12. end;{SetMode}
  13. {-------------------}
  14. Procedure CreatePalette;assembler; {Создание нужной палитры
  15. 256-цветного режима}
  16. asm
  17. mov dx, 3c6h {Порт регистра маски палитры}
  18. mov al, 0ffh { FF - 0-256 -вся палитра}
  19. out dx, al {We will change all palette}
  20. mov dx, 3c8h {Порт выбора номера цвета для записи в палитру}
  21. mov al, 0
  22. out dx, al {Beginning from first}
  23. mov cx, 128 {Это будет кол-вом цветов}
  24. mov bx, 0 {Текущий индекс}
  25. inc dx {Write pal port - 3c9h }
  26. @@1:
  27. mov al, bl {R : 0-63}
  28. push bx
  29. push dx
  30. mov bx, 3
  31. div bx
  32. pop dx
  33. pop bx
  34. out dx, al
  35. mov al, bl {G : 0-127}
  36. shr al, 2
  37. out dx, al
  38. (* mov al, bl {B : 0-255}
  39. shr al, 8 *)
  40. mov al, 10
  41. out dx, al
  42. inc bx
  43. loop @@1
  44. shr bx, 1
  45. mov cx, 95
  46. @@2:
  47. mov al, 0ffh {R : 0-63}
  48. shr al, 2
  49. out dx, al
  50. mov al, bl {G : 0-127}
  51. shr al, 1
  52. out dx, al
  53. mov al, bl {B : 0-255}
  54. shr al, 4
  55. out dx, al
  56. inc bx
  57. loop @@2
  58. end;{CreatePalette}
  59. {-------------------------------}
  60. Function KeyPressed:boolean;assembler;
  61. asm
  62. mov ah, 1
  63. int 16h
  64. mov al, 0
  65. jz @@2
  66. mov al, 1
  67. @@2:
  68. end;
  69. type
  70. tEnv = array [0..250,0..250] of byte;
  71. tScr = array [0..199,0..319] of byte;
  72. var
  73. Inp : FILE;
  74. envmap : ^TEnv;
  75. bump,BackBuffer : ^tScr;
  76. i,j,lx,ly : integer;
  77. nx,ny : integer;
  78. dx,dy : integer;
  79. x,y,z : real;
  80. Procedure Draw;
  81. begin
  82. for i:=0 to 199 do
  83. for j := 0 to 319 do
  84. begin
  85. nx := bump^[i,j] - bump^[i,j+1] - (lx-j) + density;
  86. ny := bump^[i,j] - bump^[i+1,j] - (ly-i) + density;
  87. if (nx>=255) or (nx<0) then nx := 255;
  88. if (ny>=255) or (ny<0) then ny := 255;
  89. BackBuffer^[i,j] := envmap^[ny,nx];
  90. end;
  91. end;
  92. {-----------------------}
  93. Procedure DrawBack;assembler; {Прорисовка буфера на экран}
  94. asm
  95. push es
  96. push ds
  97. mov cx, 320*200
  98. shr cx, 1
  99. push 0A000h
  100. pop es
  101. xor di, di
  102. lds si, BackBuffer
  103. repe movsw
  104. pop ds
  105. pop es
  106. end;
  107. {-----------------------}
  108. begin
  109. GetMem(bump,SizeOf(tScr));
  110. GetMem(BackBuffer,SizeOf(tScr));
  111. GetMem(EnvMap,256*256-1);
  112. for i := 0 to 255 do
  113. for j := 0 to 255 do
  114. begin
  115. x := j/density-1;
  116. y := i/density-1;
  117. z := 1 - sqrt(x*x+y*y);
  118. if z < 0 then z:=0;
  119. envmap^[i,j] := round(z*bright);
  120. end;
  121. Assign(Inp,'bump.dat');
  122. Reset(inP,1);
  123. BlockRead(Inp,Bump^,320*200);
  124. Close(inp);
  125. lx := 90;
  126. ly := 100;
  127. dx := 1;
  128. dy := 1;
  129. SetMode($13);
  130. CreatePalette;
  131. while not keypressed do
  132. begin
  133. Draw;
  134. repeat until (Port[$03DA] and 8) <> 8;
  135. repeat until (Port[$03DA] and 8) = 8;
  136. DrawBack;
  137. inc(lx,dx);
  138. inc(ly,dy);
  139. if (lx > 310) or (lx<5) then dx := -dx;
  140. if (ly > 190) or (ly<5) then dy := -dy;
  141. end;
  142. SetMode(3);
  143. FreeMem(bump,SizeOf(tScr));
  144. freeMem(BackBuffer,SizeOf(tScr));
  145. freeMem(EnvMap,256*256-1);
  146. end.