Previous 199869 Revisions Next

r21050 Wednesday 13th February, 2013 at 22:53:43 UTC by Ville Linde
video/jagblit.c: Implemented gouraud shading.
[src/mame/video]jagblit.c

trunk/src/mame/video/jagblit.c
r21049r21050
296296   adest_xmask         = (COMMAND & 0x00000800) ? a2_xmask : a1_xmask;
297297   adest_ymask         = (COMMAND & 0x00000800) ? a2_ymask : a1_ymask;
298298
299   int gouraud_color[4];
300   gouraud_color[0] = (m_blitter_regs[B_PATD_H] >> 16) & 0xff00;
301   gouraud_color[1] = m_blitter_regs[B_PATD_H] & 0xff00;
302   gouraud_color[2] = (m_blitter_regs[B_PATD_L] >> 16) & 0xff00;
303   gouraud_color[3] = m_blitter_regs[B_PATD_L] & 0xff00;
304
305   int gouraud_inten[4];
306   gouraud_inten[3] = m_blitter_regs[B_I0] & 0xffffff;
307   gouraud_inten[2] = m_blitter_regs[B_I1] & 0xffffff;
308   gouraud_inten[1] = m_blitter_regs[B_I2] & 0xffffff;
309   gouraud_inten[0] = m_blitter_regs[B_I3] & 0xffffff;
310
311   int gouraud_iinc = m_blitter_regs[B_IINC] & 0xffffff;
312   if (gouraud_iinc & 0x800000)
313      gouraud_iinc |= 0xff000000;
314
299315   if (LOG_BLITS)
300316   {
301317   logerror("%s:Blit!\n", machine().describe_context());
r21049r21050
347363            /* load src data and Z */
348364            if (COMMAND & 0x00000001)
349365            {
350            srcdata = READ_PIXEL(asrc, asrcflags);
366               srcdata = READ_PIXEL(asrc, asrcflags);
351367               if (COMMAND & 0x00000002)
352               srczdata = READ_ZDATA(asrc, asrcflags);
368                  srczdata = READ_ZDATA(asrc, asrcflags);
353369               else if (COMMAND & 0x001c020)
354               srczdata = READ_RDATA(B_SRCZ1_H, asrc, asrcflags, asrc_phrase_mode);
370                  srczdata = READ_RDATA(B_SRCZ1_H, asrc, asrcflags, asrc_phrase_mode);
355371            }
356372            else
357373            {
358            srcdata = READ_RDATA(B_SRCD_H, asrc, asrcflags, asrc_phrase_mode);
374               srcdata = READ_RDATA(B_SRCD_H, asrc, asrcflags, asrc_phrase_mode);
359375               if (COMMAND & 0x001c020)
360               srczdata = READ_RDATA(B_SRCZ1_H, asrc, asrcflags, asrc_phrase_mode);
376                  srczdata = READ_RDATA(B_SRCZ1_H, asrc, asrcflags, asrc_phrase_mode);
361377            }
362378
363379            /* load dst data and Z */
364380            if (COMMAND & 0x00000008)
365381            {
366            dstdata = READ_PIXEL(adest, adestflags);
382               dstdata = READ_PIXEL(adest, adestflags);
367383               if (COMMAND & 0x00000010)
368               dstzdata = READ_ZDATA(adest, adestflags);
384                  dstzdata = READ_ZDATA(adest, adestflags);
369385               else
370               dstzdata = READ_RDATA(B_DSTZ_H, adest, adestflags, adest_phrase_mode);
386                  dstzdata = READ_RDATA(B_DSTZ_H, adest, adestflags, adest_phrase_mode);
371387            }
372388            else
373389            {
374            dstdata = READ_RDATA(B_DSTD_H, adest, adestflags, adest_phrase_mode);
390               dstdata = READ_RDATA(B_DSTD_H, adest, adestflags, adest_phrase_mode);
375391               if (COMMAND & 0x00000010)
376               dstzdata = READ_RDATA(B_DSTZ_H, adest, adestflags, adest_phrase_mode);
392                  dstzdata = READ_RDATA(B_DSTZ_H, adest, adestflags, adest_phrase_mode);
377393            }
378394
379395            /* handle clipping */
380396            if (COMMAND & 0x00000040)
381397            {
382            if (adest_x < 0 || adest_y < 0 ||
383               (adest_x >> 16) >= (m_blitter_regs[A1_CLIP] & 0x7fff) ||
384               (adest_y >> 16) >= ((m_blitter_regs[A1_CLIP] >> 16) & 0x7fff))
398               if (adest_x < 0 || adest_y < 0 ||
399                  (adest_x >> 16) >= (m_blitter_regs[A1_CLIP] & 0x7fff) ||
400                  (adest_y >> 16) >= ((m_blitter_regs[A1_CLIP] >> 16) & 0x7fff))
385401                  inhibit = 1;
386402            }
387403
r21049r21050
398414            {
399415               if (!(COMMAND & 0x02000000))
400416               {
401               if (srcdata == READ_RDATA(B_PATD_H, asrc, asrcflags, asrc_phrase_mode))
417                  if (srcdata == READ_RDATA(B_PATD_H, asrc, asrcflags, asrc_phrase_mode))
402418                     inhibit = 1;
403419               }
404420               else
405421               {
406               if (dstdata == READ_RDATA(B_PATD_H, adest, adestflags, adest_phrase_mode))
422                  if (dstdata == READ_RDATA(B_PATD_H, adest, adestflags, adest_phrase_mode))
407423                     inhibit = 1;
408424               }
409425            }
r21049r21050
413429            {
414430               /* handle patterns/additive/LFU */
415431               if (COMMAND & 0x00010000)
416               writedata = READ_RDATA(B_PATD_H, adest, adestflags, adest_phrase_mode);
432                  writedata = READ_RDATA(B_PATD_H, adest, adestflags, adest_phrase_mode);
417433               else if (COMMAND & 0x00020000)
418434               {
419435                  writedata = (srcdata & 0xff) + (dstdata & 0xff);
r21049r21050
436452                     writedata |= srcdata & dstdata;
437453               }
438454
439            /* handle source shading */
440            if (COMMAND & 0x40000000)
441            {
442               int intensity = srcdata & 0x00ff;
443               intensity += (INT8) (m_blitter_regs[B_IINC] >> 16);
444               if (intensity < 0)
445                  intensity = 0;
446               else if (intensity > 0xff)
447                  intensity = 0xff;
448               writedata = (srcdata & 0xff00) | intensity;
455               /* handle source shading */
456               if (COMMAND & 0x40000000)
457               {
458                  int intensity = srcdata & 0x00ff;
459                  intensity += (INT8) (m_blitter_regs[B_IINC] >> 16);
460                  if (intensity < 0)
461                     intensity = 0;
462                  else if (intensity > 0xff)
463                     intensity = 0xff;
464                  writedata = (srcdata & 0xff00) | intensity;
465               }
466
467               /* handle gouraud shading */
468               if (COMMAND & 0x1000)
469               {
470                  int p = asrc_phrase_mode ? (asrc_x & 3) : 3;
471                  writedata = ((gouraud_inten[p] >> 16) & 0xff) | gouraud_color[p];
472
473                  int intensity = gouraud_inten[p];
474                  intensity += gouraud_iinc;
475                  if (intensity < 0) intensity = 0;
476                  if (intensity > 0xffffff) intensity = 0xffffff;
477                  gouraud_inten[p] = intensity;
478               }
449479            }
450            }
451480            else
452481               writedata = dstdata;
453482
454         if (adest_phrase_mode || (command & 0x10000000) || !inhibit)
455            {
456               /* write to the destination */
457               WRITE_PIXEL(adestflags, writedata);
458               if (COMMAND & 0x00000020)
483         if ((command & 0x10000000) || !inhibit)
484         {
485            /* write to the destination */
486            WRITE_PIXEL(adestflags, writedata);
487            if (COMMAND & 0x00000020)
459488               WRITE_ZDATA(adestflags, srczdata);
460            }
489         }
461490
462491            /* update X/Y */
463492         asrc_x = (asrc_x + asrc_xadd) & asrc_xmask;

Previous 199869 Revisions Next


© 1997-2024 The MAME Team