Subversion Repositories Kolibri OS

Rev

Rev 5175 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. ;
  2. ; We draw a triangle with various interpolations
  3. ;
  4.         t dd ? ;ZBufferPoint*
  5.         pr1 dd ? ;ZBufferPoint*
  6.         pr2 dd ? ;ZBufferPoint*
  7.         l1 dd ? ;ZBufferPoint*
  8.         l2 dd ? ;ZBufferPoint*
  9.         fdx1 dd ?
  10.         fdx2 dd ?
  11.         fdy1 dd ?
  12.         fdy2 dd ?
  13.         fz dd ?
  14.         d1 dd ?
  15.         d2 dd ?
  16.         pz1 dd ? ;unsigned short*
  17.         pp1 dd ? ;PIXEL*
  18.         part dd ?
  19.         update_left dd ?
  20.         update_right dd ?
  21.  
  22.         nb_lines dd ?
  23.         dx1 dd ?
  24.         dy1 dd ?
  25.         tmp dd ?
  26.         dx2 dd ?
  27.         dy2 dd ?
  28.  
  29.         error dd ?
  30.         derror dd ?
  31.         x1 dd ?
  32.         dxdy_min dd ?
  33.         dxdy_max dd ?
  34.         ; warning: x2 is multiplied by 2^16
  35.         x2 dd ?
  36.         dx2dy2 dd ?
  37.  
  38. if INTERP_Z eq 1
  39.         z1 dd ?
  40.         dzdx dd ?
  41.         dzdy dd ?
  42.         dzdl_min dd ?
  43.         dzdl_max dd ?
  44. end if
  45. if INTERP_RGB eq 1
  46.         r1 dd ? ;int
  47.         drdx dd ?
  48.         drdy dd ?
  49.         drdl_min dd ?
  50.         drdl_max dd ?
  51.         g1 dd ?
  52.         dgdx dd ?
  53.         dgdy dd ?
  54.         dgdl_min dd ?
  55.         dgdl_max dd ?
  56.         b1 dd ?
  57.         dbdx dd ?
  58.         dbdy dd ?
  59.         dbdl_min dd ?
  60.         dbdl_max dd ?
  61. end if
  62. if INTERP_ST eq 1
  63.         ;s1 dd ?
  64.         dsdx dd ?
  65.         dsdy dd ?
  66.         dsdl_min dd ?
  67.         dsdl_max dd ?
  68.         t1 dd ?
  69.         dtdx dd ?
  70.         dtdy dd ?
  71.         dtdl_min dd ?
  72.         dtdl_max dd ?
  73. end if
  74. if INTERP_STZ eq 1
  75.         sz1 dd ?
  76.         dszdx dd ?
  77.         dszdy dd ?
  78.         dszdl_min dd ?
  79.         dszdl_max dd ?
  80.         tz1 dd ?
  81.         dtzdx dd ?
  82.         dtzdy dd ?
  83.         dtzdl_min dd ?
  84.         dtzdl_max dd ?
  85. end if
  86.  
  87. endl
  88.  
  89. ;  /* we sort the vertex with increasing y */
  90. ;  if (p1->y < p0->y) {
  91. ;    t = p0;
  92. ;    p0 = p1;
  93. ;    p1 = t;
  94. ;  }
  95. ;  if (p2->y < p0->y) {
  96. ;    t = p2;
  97. ;    p2 = p1;
  98. ;    p1 = p0;
  99. ;    p0 = t;
  100. ;  } else if (p2->y < p1->y) {
  101. ;    t = p1;
  102. ;    p1 = p2;
  103. ;    p2 = t;
  104. ;  }
  105.  
  106.         ; we compute dXdx and dXdy for all interpolated values
  107.  
  108. ;  fdx1 = p1->x - p0->x;
  109. ;  fdy1 = p1->y - p0->y;
  110.  
  111. ;  fdx2 = p2->x - p0->x;
  112. ;  fdy2 = p2->y - p0->y;
  113.  
  114. ;  fz = fdx1 * fdy2 - fdx2 * fdy1;
  115. ;  if (fz == 0)
  116. ;    return;
  117. ;  fz = 1.0 / fz;
  118.  
  119. ;  fdx1 *= fz;
  120. ;  fdy1 *= fz;
  121. ;  fdx2 *= fz;
  122. ;  fdy2 *= fz;
  123.  
  124. if INTERP_Z eq 1
  125. ;  d1 = p1->z - p0->z;
  126. ;  d2 = p2->z - p0->z;
  127. ;  dzdx = (int) (fdy2 * d1 - fdy1 * d2);
  128. ;  dzdy = (int) (fdx1 * d2 - fdx2 * d1);
  129. end if
  130.  
  131. if INTERP_RGB eq 1
  132. ;  d1 = p1->r - p0->r;
  133. ;  d2 = p2->r - p0->r;
  134. ;  drdx = (int) (fdy2 * d1 - fdy1 * d2);
  135. ;  drdy = (int) (fdx1 * d2 - fdx2 * d1);
  136.  
  137. ;  d1 = p1->g - p0->g;
  138. ;  d2 = p2->g - p0->g;
  139. ;  dgdx = (int) (fdy2 * d1 - fdy1 * d2);
  140. ;  dgdy = (int) (fdx1 * d2 - fdx2 * d1);
  141.  
  142. ;  d1 = p1->b - p0->b;
  143. ;  d2 = p2->b - p0->b;
  144. ;  dbdx = (int) (fdy2 * d1 - fdy1 * d2);
  145. ;  dbdy = (int) (fdx1 * d2 - fdx2 * d1);
  146.  
  147. end if
  148.  
  149. if INTERP_ST eq 1
  150. ;  d1 = p1->s - p0->s;
  151. ;  d2 = p2->s - p0->s;
  152. ;  dsdx = (int) (fdy2 * d1 - fdy1 * d2);
  153. ;  dsdy = (int) (fdx1 * d2 - fdx2 * d1);
  154.  
  155. ;  d1 = p1->t - p0->t;
  156. ;  d2 = p2->t - p0->t;
  157. ;  dtdx = (int) (fdy2 * d1 - fdy1 * d2);
  158. ;  dtdy = (int) (fdx1 * d2 - fdx2 * d1);
  159. end if
  160.  
  161. if INTERP_STZ eq 1
  162. ;  {
  163. ;    float zz;
  164. ;    zz=(float) p0->z;
  165. ;    p0->sz= (float) p0->s * zz;
  166. ;    p0->tz= (float) p0->t * zz;
  167. ;    zz=(float) p1->z;
  168. ;    p1->sz= (float) p1->s * zz;
  169. ;    p1->tz= (float) p1->t * zz;
  170. ;    zz=(float) p2->z;
  171. ;    p2->sz= (float) p2->s * zz;
  172. ;    p2->tz= (float) p2->t * zz;
  173.  
  174. ;    d1 = p1->sz - p0->sz;
  175. ;    d2 = p2->sz - p0->sz;
  176. ;    dszdx = (fdy2 * d1 - fdy1 * d2);
  177. ;    dszdy = (fdx1 * d2 - fdx2 * d1);
  178.  
  179. ;    d1 = p1->tz - p0->tz;
  180. ;    d2 = p2->tz - p0->tz;
  181. ;    dtzdx = (fdy2 * d1 - fdy1 * d2);
  182. ;    dtzdy = (fdx1 * d2 - fdx2 * d1);
  183. ;  }
  184. end if
  185.  
  186.         ; screen coordinates
  187.  
  188. ;  pp1 = (PIXEL *) ((char *) zb->pbuf + zb->linesize * p0->y);
  189. ;  pz1 = zb->zbuf + p0->y * zb->xsize;
  190.  
  191.         DRAW_INIT
  192.  
  193. ;  for(part=0;part<2;part++) {
  194. ;    if (part == 0) {
  195. ;      if (fz > 0) {
  196. ;       update_left=1;
  197. ;       update_right=1;
  198. ;       l1=p0;
  199. ;       l2=p2;
  200. ;       pr1=p0;
  201. ;       pr2=p1;
  202. ;      } else {
  203. ;       update_left=1;
  204. ;       update_right=1;
  205. ;       l1=p0;
  206. ;       l2=p1;
  207. ;       pr1=p0;
  208. ;       pr2=p2;
  209. ;      }
  210. ;      nb_lines = p1->y - p0->y;
  211. ;    } else {
  212. ;      /* second part */
  213. ;      if (fz > 0) {
  214. ;       update_left=0;
  215. ;       update_right=1;
  216. ;       pr1=p1;
  217. ;       pr2=p2;
  218. ;      } else {
  219. ;       update_left=1;
  220. ;       update_right=0;
  221. ;       l1=p1;
  222. ;       l2=p2;
  223. ;      }
  224. ;      nb_lines = p2->y - p1->y + 1;
  225. ;    }
  226.  
  227.         ; compute the values for the left edge
  228.  
  229. ;    if (update_left) {
  230. ;      dy1 = l2->y - l1->y;
  231. ;      dx1 = l2->x - l1->x;
  232. ;      if (dy1 > 0)
  233. ;       tmp = (dx1 << 16) / dy1;
  234. ;      else
  235. ;       tmp = 0;
  236. ;      x1 = l1->x;
  237. ;      error = 0;
  238. ;      derror = tmp & 0x0000ffff;
  239. ;      dxdy_min = tmp >> 16;
  240. ;      dxdy_max = dxdy_min + 1;
  241.  
  242. if INTERP_Z eq 1
  243. ;      z1=l1->z;
  244. ;      dzdl_min=(dzdy + dzdx * dxdy_min);
  245. ;      dzdl_max=dzdl_min + dzdx;
  246. end if
  247. if INTERP_RGB eq 1
  248. ;      r1=l1->r;
  249. ;      drdl_min=(drdy + drdx * dxdy_min);
  250. ;      drdl_max=drdl_min + drdx;
  251.  
  252. ;      g1=l1->g;
  253. ;      dgdl_min=(dgdy + dgdx * dxdy_min);
  254. ;      dgdl_max=dgdl_min + dgdx;
  255.  
  256. ;      b1=l1->b;
  257. ;      dbdl_min=(dbdy + dbdx * dxdy_min);
  258. ;      dbdl_max=dbdl_min + dbdx;
  259. end if
  260. if INTERP_ST eq 1
  261. ;      s1=l1->s;
  262. ;      dsdl_min=(dsdy + dsdx * dxdy_min);
  263. ;      dsdl_max=dsdl_min + dsdx;
  264.  
  265. ;      t1=l1->t;
  266. ;      dtdl_min=(dtdy + dtdx * dxdy_min);
  267. ;      dtdl_max=dtdl_min + dtdx;
  268. end if
  269. if INTERP_STZ eq 1
  270. ;      sz1=l1->sz;
  271. ;      dszdl_min=(dszdy + dszdx * dxdy_min);
  272. ;      dszdl_max=dszdl_min + dszdx;
  273.  
  274. ;      tz1=l1->tz;
  275. ;      dtzdl_min=(dtzdy + dtzdx * dxdy_min);
  276. ;      dtzdl_max=dtzdl_min + dtzdx;
  277. end if
  278. ;    }
  279.  
  280. ;    /* compute values for the right edge */
  281.  
  282. ;    if (update_right) {
  283. ;      dx2 = (pr2->x - pr1->x);
  284. ;      dy2 = (pr2->y - pr1->y);
  285. ;      if (dy2>0)
  286. ;       dx2dy2 = ( dx2 << 16) / dy2;
  287. ;      else
  288. ;       dx2dy2 = 0;
  289. ;      x2 = pr1->x << 16;
  290. ;    }
  291.  
  292. ;    /* we draw all the scan line of the part */
  293.  
  294. ;    while (nb_lines>0) {
  295. ;      nb_lines--;
  296. ;#ifndef DRAW_LINE
  297. ;      /* generic draw line */
  298. ;      {
  299. ;          register PIXEL *pp;
  300. ;          register int n;
  301. if INTERP_Z eq 1
  302. ;          register unsigned short *pz;
  303. ;          register unsigned int z,zz;
  304. end if
  305. if INTERP_RGB eq 1
  306. ;          register unsigned int or1,og1,ob1;
  307. end if
  308. if INTERP_ST eq 1
  309. ;          register unsigned int s,t;
  310. end if
  311. if INTERP_STZ eq 1
  312. ;          float sz,tz;
  313. end if
  314. ;          n=(x2 >> 16) - x1;
  315. ;          pp=(PIXEL *)((char *)pp1 + x1 * PSZB);
  316. if INTERP_Z eq 1
  317. ;          pz=pz1+x1;
  318. ;          z=z1;
  319. end if
  320. if INTERP_RGB eq 1
  321. ;          or1 = r1;
  322. ;          og1 = g1;
  323. ;          ob1 = b1;
  324. end if
  325. if INTERP_ST eq 1
  326. ;          s=s1;
  327. ;          t=t1;
  328. end if
  329. if INTERP_STZ eq 1
  330. ;          sz=sz1;
  331. ;          tz=tz1;
  332. end if
  333. ;          while (n>=3) {
  334. ;              PUT_PIXEL(0);
  335. ;              PUT_PIXEL(1);
  336. ;              PUT_PIXEL(2);
  337. ;              PUT_PIXEL(3);
  338. if INTERP_Z eq 1
  339. ;              pz+=4;
  340. end if
  341. ;              pp=(PIXEL *)((char *)pp + 4 * PSZB);
  342. ;              n-=4;
  343. ;          }
  344. ;          while (n>=0) {
  345. ;              PUT_PIXEL(0);
  346. if INTERP_Z eq 1
  347. ;              pz+=1;
  348. end if
  349. ;              pp=(PIXEL *)((char *)pp + PSZB);
  350. ;              n-=1;
  351. ;          }
  352. ;      }
  353. ;#else
  354. ;      DRAW_LINE();
  355. ;#endif
  356. ;      
  357. ;      /* left edge */
  358. ;      error+=derror;
  359. ;      if (error > 0) {
  360. ;       error-=0x10000;
  361. ;       x1+=dxdy_max;
  362. if INTERP_Z eq 1
  363. ;       z1+=dzdl_max;
  364. end if      
  365. if INTERP_RGB eq 1
  366. ;       r1+=drdl_max;
  367. ;       g1+=dgdl_max;
  368. ;       b1+=dbdl_max;
  369. end if
  370. if INTERP_ST eq 1
  371. ;       s1+=dsdl_max;
  372. ;       t1+=dtdl_max;
  373. end if
  374. if INTERP_STZ eq 1
  375. ;       sz1+=dszdl_max;
  376. ;       tz1+=dtzdl_max;
  377. end if
  378. ;      } else {
  379. ;       x1+=dxdy_min;
  380. if INTERP_Z eq 1
  381. ;       z1+=dzdl_min;
  382. end if
  383. if INTERP_RGB eq 1
  384. ;       r1+=drdl_min;
  385. ;       g1+=dgdl_min;
  386. ;       b1+=dbdl_min;
  387. end if
  388. if INTERP_ST eq 1
  389. ;       s1+=dsdl_min;
  390. ;       t1+=dtdl_min;
  391. end if
  392. if INTERP_STZ eq 1
  393. ;       sz1+=dszdl_min;
  394. ;       tz1+=dtzdl_min;
  395. end if
  396. ;      }
  397. ;      
  398. ;      /* right edge */
  399. ;      x2+=dx2dy2;
  400. ;
  401. ;      /* screen coordinates */
  402. ;      pp1=(PIXEL *)((char *)pp1 + zb->linesize);
  403. ;      pz1+=zb->xsize;
  404. ;    }
  405. ;  }
  406. ;}
  407.  
  408. restore INTERP_Z
  409. restore INTERP_RGB
  410. restore INTERP_ST
  411. restore INTERP_STZ
  412.  
  413. purge DRAW_INIT
  414. purge DRAW_LINE  
  415. purge PUT_PIXEL
  416.