VGATEST.PAS 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363
  1. Uses CRT;
  2. Const
  3. xSize = 320;
  4. ySize = 200;
  5. dist = 320;
  6. Type Vertex = record
  7. X,Y,Z : longint;
  8. sx,sy : longint;
  9. End;
  10. Type Face = record
  11. V : array [0..2] of Vertex;
  12. color : byte
  13. end;
  14. Var
  15. vmem : array [0..199,0..319] of byte absolute $A000:$0000;
  16. buff : array [0..199,0..319] of byte;
  17. fa : array [0..11] of face;
  18. {------------------------------------------------}
  19. Procedure rHorLine(X1,X2,Y:word;color:byte);
  20. Begin
  21. If X1>X2 then
  22. begin
  23. X2 := X1 xor X2;
  24. X1 := X1 xor X2;
  25. X2 := X1 xor X2;
  26. end;
  27. for X1 := X1 to X2 do buff[Y,X1] := color;
  28. End;{rLine}
  29. {----------------------------------}
  30. Procedure rSetFace;
  31. Begin
  32. fa[0].v[1].x := -25;
  33. fa[0].v[1].y := -25;
  34. fa[0].v[1].z := 25;
  35. fa[0].v[2].x := 25;
  36. fa[0].v[2].y := -25;
  37. fa[0].v[2].z := 25;
  38. fa[0].v[0].x := -25;
  39. fa[0].v[0].y := 25;
  40. fa[0].v[0].z := 25;
  41. fa[0].color := 1;
  42. fa[1].color := 1;
  43. fa[2].color := 2;
  44. fa[3].color := 2;
  45. fa[4].color := 3;
  46. fa[5].color := 3;
  47. fa[6].color := 4;
  48. fa[7].color := 4;
  49. fa[8].color := 5;
  50. fa[9].color := 5;
  51. fa[10].color := 6;
  52. fa[11].color := 6;
  53. fa[1].v[1].x := -25;
  54. fa[1].v[1].y := 25;
  55. fa[1].v[1].z := 25;
  56. fa[1].v[2].x := 25;
  57. fa[1].v[2].y := -25;
  58. fa[1].v[2].z := 25;
  59. fa[1].v[0].x := 25;
  60. fa[1].v[0].y := 25;
  61. fa[1].v[0].z := 25;
  62. fa[2].v[1].x := 25;
  63. fa[2].v[1].y := 25;
  64. fa[2].v[1].z := 25;
  65. fa[2].v[2].x := 25;
  66. fa[2].v[2].y := -25;
  67. fa[2].v[2].z := 25;
  68. fa[2].v[0].x := 25;
  69. fa[2].v[0].y := -25;
  70. fa[2].v[0].z := -25;
  71. fa[3].v[1].x := 25;
  72. fa[3].v[1].y := 25;
  73. fa[3].v[1].z := 25;
  74. fa[3].v[2].x := 25;
  75. fa[3].v[2].y := 25;
  76. fa[3].v[2].z := -25;
  77. fa[3].v[0].x := 25;
  78. fa[3].v[0].y := -25;
  79. fa[3].v[0].z := 25;
  80. fa[4].v[1].x := 25;
  81. fa[4].v[1].y := 25;
  82. fa[4].v[1].z := -25;
  83. fa[4].v[2].x := 25;
  84. fa[4].v[2].y := -25;
  85. fa[4].v[2].z := -25;
  86. fa[4].v[0].x := -25;
  87. fa[4].v[0].y := -25;
  88. fa[4].v[0].z := -25;
  89. fa[5].v[1].x := -25;
  90. fa[5].v[1].y := 25;
  91. fa[5].v[1].z := -25;
  92. fa[5].v[2].x := 25;
  93. fa[5].v[2].y := 25;
  94. fa[5].v[2].z := 25;
  95. fa[5].v[0].x := -25;
  96. fa[5].v[0].y := -25;
  97. fa[5].v[0].z := -25;
  98. fa[6].v[1].x := -25;
  99. fa[6].v[1].y := 25;
  100. fa[6].v[1].z := -25;
  101. fa[6].v[2].x := -25;
  102. fa[6].v[2].y := -25;
  103. fa[6].v[2].z := -25;
  104. fa[6].v[0].x := -25;
  105. fa[6].v[0].y := -25;
  106. fa[6].v[0].z := 25;
  107. fa[7].v[1].x := -25;
  108. fa[7].v[1].y := 25;
  109. fa[7].v[1].z := -25;
  110. fa[7].v[2].x := -25;
  111. fa[7].v[2].y := 25;
  112. fa[7].v[2].z := 25;
  113. fa[7].v[0].x := -25;
  114. fa[7].v[0].y := -25;
  115. fa[7].v[0].z := 25;
  116. fa[8].v[1].x := -25;
  117. fa[8].v[1].y := 25;
  118. fa[8].v[1].z := 25;
  119. fa[8].v[2].x := 25;
  120. fa[8].v[2].y := 25;
  121. fa[8].v[2].z := 25;
  122. fa[8].v[0].x := 25;
  123. fa[8].v[0].y := 25;
  124. fa[8].v[0].z := -25;
  125. fa[9].v[1].x := 25;
  126. fa[9].v[1].y := 25;
  127. fa[9].v[1].z := -25;
  128. fa[9].v[2].x := -25;
  129. fa[9].v[2].y := 25;
  130. fa[9].v[2].z := -25;
  131. fa[9].v[0].x := -25;
  132. fa[9].v[0].y := 25;
  133. fa[9].v[0].z := 25;
  134. fa[10].v[1].x := 25;
  135. fa[10].v[1].y := -25;
  136. fa[10].v[1].z := 25;
  137. fa[10].v[2].x := 25;
  138. fa[10].v[2].y := -25;
  139. fa[10].v[2].z := -25;
  140. fa[10].v[0].x := -25;
  141. fa[10].v[0].y := -25;
  142. fa[10].v[0].z := 25;
  143. fa[11].v[1].x := -25;
  144. fa[11].v[1].y := -25;
  145. fa[11].v[1].z := 25;
  146. fa[11].v[2].x := -25;
  147. fa[11].v[2].y := -25;
  148. fa[11].v[2].z := -25;
  149. fa[11].v[0].x := 25;
  150. fa[11].v[0].y := -25;
  151. fa[11].v[0].z := -25;
  152. End;
  153. {-----------------------------------}
  154. Procedure rRotateX(var f:face;angle : real);
  155. Var
  156. cs,sn,NewX,NewY,NewZ : real;
  157. i : integer;
  158. Begin
  159. cs:=cos(angle*3.14/180);
  160. sn:=sin(angle*3.14/180);
  161. for i:=0 to 2 do
  162. Begin
  163. NewX:=f.v[i].x;
  164. NewY:=f.v[i].y*cs-f.v[i].z*sn;
  165. NewZ:=f.v[i].y*sn+f.v[i].z*cs;
  166. f.v[i].x:=round(NewX);
  167. f.v[i].y:=round(NewY);
  168. f.v[i].z:=round(NewZ);
  169. End;
  170. End;
  171. {----------------------------------}
  172. Procedure rRotateY(var f:face;angle : real);
  173. Var
  174. cs,sn,NewX,NewY,NewZ : real;
  175. i : integer;
  176. Begin
  177. cs:=cos(angle*3.14/180);
  178. sn:=sin(angle*3.14/180);
  179. for i:=0 to 2 do
  180. Begin
  181. NewX:=f.v[i].x*cs-f.v[i].y*sn;
  182. NewY:=f.v[i].x*sn+f.v[i].y*cs;
  183. NewZ:=f.v[i].z;
  184. f.v[i].x:=round(NewX);
  185. f.v[i].y:=round(NewY);
  186. f.v[i].z:=round(NewZ);
  187. End;
  188. End;
  189. {-----------------------------------------}
  190. Procedure rRotateZ(var f:face;angle : real);
  191. Var
  192. cs,sn,NewX,NewY,NewZ : real;
  193. i : integer;
  194. Begin
  195. cs:=cos(angle*3.14/180);
  196. sn:=sin(angle*3.14/180);
  197. for i:=0 to 2 do
  198. Begin
  199. NewX:=f.v[i].x*cs-f.v[i].z*sn;
  200. NewY:=f.v[i].y;
  201. NewZ:=f.v[i].x*sn+f.v[i].z*cs;
  202. f.v[i].x:=round(NewX);
  203. f.v[i].y:=round(NewY);
  204. f.v[i].z:=round(NewZ);
  205. End;
  206. End;
  207. {-------------------------------------}
  208. Procedure rProjectVertex(var v : vertex);
  209. Begin
  210. v.sx := round(xSize/2 + v.x * dist / (v.z + dist));
  211. v.sy := round(ySize/2 - v.y * dist / (v.z + dist));
  212. End;
  213. {--------------------------------}
  214. Procedure rTreug(X1,Y1,X2,Y2,X3,Y3: longint;color:byte);
  215. Var
  216. tmx,tmy,_x1,_x2,sx,sy,tmp : longint;
  217. Begin
  218. if Y1>Y3 then
  219. Begin
  220. tmx := X1;
  221. tmy := Y1;
  222. X1:=X3;
  223. Y1:=Y3;
  224. X3:=tmx;
  225. Y3:=tmy;
  226. End;
  227. if (Y1 > Y2) then
  228. Begin
  229. tmx := X1;
  230. tmy := Y1;
  231. X1:=X2;
  232. Y1:=Y2;
  233. X2:=tmx;
  234. Y2:=tmy;
  235. End;
  236. if (Y2 > Y3) then
  237. Begin
  238. tmx := X2;
  239. tmy := Y2;
  240. X2:=X3;
  241. Y2:=Y3;
  242. X3:=tmx;
  243. Y3:=tmy;
  244. End;
  245. for sy := Y1 to Y3 do
  246. Begin
  247. if (Y3<>Y1) then
  248. _x1 := round(X1 + (sy - Y1) * (X3 - X1) / (Y3 - Y1));
  249. if sy < Y2 then _x2 := round(X1 + (sy - Y1) * (X2 - X1) / (Y2 - Y1))
  250. else
  251. Begin
  252. if (Y3 = Y2) then _x2 := X2
  253. else _x2 := round(X2 + (sy - Y2) * (X3 - X2) / (Y3 - Y2));
  254. End;
  255. rHorLine(_x1,_x2,sy,color);
  256. End;
  257. End;
  258. {--------------------------------}
  259. Procedure rShowFace(var f:face);
  260. Var
  261. a,b,c: vertex;
  262. Begin
  263. a := f.v[0];
  264. b := f.v[1];
  265. c := f.v[2];
  266. rProjectVertex(a);
  267. rProjectVertex(b);
  268. rProjectVertex(c);
  269. rTreug(a.sx,a.sy,b.sx,b.sy,c.sx,c.sy,f.color);
  270. End;
  271. {--------------}
  272. procedure rSetMode(mode:byte);assembler;
  273. asm
  274. pushf
  275. mov ah,00h
  276. mov al,mode
  277. int 10h
  278. popf
  279. end;{rSetMode}
  280. {---------------------------------}
  281. Procedure rShowScr;
  282. Begin
  283. move(buff,vmem,sizeof(buff));
  284. End;{ShowScr}
  285. {---------------------------------}
  286. Var
  287. i,j : byte;
  288. ch : char;
  289. Begin
  290. rSetFace;
  291. rSetMode($13);
  292. for i := 0 to 11 do rShowFace(fa[1]);
  293. rShowScr;
  294. while (ch <> #27) do
  295. begin
  296. if keypressed then
  297. begin
  298. ch:=readkey;
  299. if ch = #0 then ch := readkey;
  300. case ch of
  301. #72: for j:=0 to 11 do rRotateX(fa[j],5);
  302. #80: for j:=0 to 11 do rRotateX(fa[j],-5);
  303. #75: for j:=0 to 11 do rRotateY(fa[j],5);
  304. #77: for j:=0 to 11 do rRotateY(fa[j],-5);
  305. #73: for j:=0 to 11 do rRotateZ(fa[j],5);
  306. #81: for j:=0 to 11 do rRotateZ(fa[j],-5);
  307. end;
  308. fillchar(buff,sizeof(buff),0);
  309. for j:=0 to 11 do rShowFace(fa[j]);
  310. rShowScr;
  311. end;
  312. end;
  313. rSetMode($03);
  314. End.