home *** CD-ROM | disk | FTP | other *** search
/ Supremacy 1 / Supremacy-1.iso / DEMOS / S-T / TOXIC10.ZIP / SOURCES.TXC / TRUE_MAP.S < prev   
Encoding:
Text File  |  1995-07-11  |  5.3 KB  |  271 lines

  1. *    Mapping routine for convex polygons
  2. *     Lousy but short code: PATAPOM/HMD
  3. *
  4. * This mapping routine allows you to put your coordinates of the
  5. * texture anywhere, you can even cross thousand times the pattern
  6. * if you want to or make the texture rotate as a rotator-zoomer...
  7.  
  8. * IN: A6 = Address of the 256*256 Texture
  9. *     D7 = Number of vertices for polygon
  10. *     The address of the screen is provided by the 'Phyzik' long word
  11.  
  12. * You also have to fill those two arrays down there with the coords of the
  13. * polygon on the screen for the first one and the coords in the texture for
  14. * every vertex for the second, always remember to duplicate the first 2
  15. * entries of the 2 arrays at the end of each of them...
  16.  
  17. * OUT: Well, you'll see by yourself
  18.  
  19. Poly_XY    dc.w    0,0
  20.     dc.w    0,0
  21.     dc.w    0,0
  22.     dc.w    0,0
  23.     dc.w    0,0
  24.  
  25. Texture_XY    dc.w    0,0
  26.     dc.w    0,0
  27.     dc.w    0,0
  28.     dc.w    0,0
  29.     dc.w    0,0
  30.  
  31. Y_Min    dc.w    0
  32. Y_Max    dc.w    0
  33.  
  34. Map_Polygon    move.l    a6,usp    Keep texture address
  35.  
  36.     lea    Poly_XY(pc),a6
  37.     lea    Texture_XY(pc),a5
  38.  
  39.     move    #$7fff,Y_Min
  40.     move    #0,Y_Max
  41.  
  42. *    Start tracing shape of polygon
  43.  
  44.     subq    #1,d7
  45. .Loop_Trace    move    d7,-(sp)
  46.  
  47.     move    (a6)+,d0    X0
  48.     move    (a6)+,d1    Y0
  49.     move    (a6),d2    X1
  50.     move    2(a6),d3    Y1
  51.  
  52.     cmp    Y_Max(pc),d1
  53.     ble.s    .Not_Greater
  54.     move    d1,Y_Max
  55. .Not_Greater
  56.     cmp    Y_Min(pc),d1
  57.     bge.s    .Not_Lower
  58.     move    d1,Y_Min
  59. .Not_Lower
  60.     move    (a5)+,d4    X0 in texture
  61.     move    (a5)+,d5    Y0 in texture
  62.     move    (a5),d6    X1 in texture
  63.     move    2(a5),d7    Y1 in texture
  64.  
  65.     bsr    Shape_Tracing
  66.  
  67.     move    (sp)+,d7
  68.     dbf    d7,.Loop_Trace
  69.  
  70. *    Test if polygon can be displayed
  71.  
  72.     cmpi    #199,Y_Min
  73.     bgt    No_Mapping
  74.     tst    Y_Max
  75.     bmi    No_Mapping
  76.  
  77.     movem    Y_Min(pc),d0/d7
  78.     cmp    d0,d7
  79.     ble    No_Mapping
  80.  
  81. *               Fill polygon
  82.  
  83.     tst    d0
  84.     bpl.s    .Ok0
  85.     moveq    #0,d0
  86. .Ok0
  87.     cmp    #200,d7
  88.     ble.s    .Ok1
  89.     move    #200,d7
  90. .Ok1
  91.     sub    d0,d7    Dy
  92.     move    d7,d1
  93.     lsr    d1    Dy / 2
  94.  
  95.     move.l    usp,a6    Retrieve texture address
  96.     lea    (Txt_Right,pc,d0.w*4),a4
  97.     lea    (Txt_Left,pc,d0.w*4),a3
  98.     lea    (X_Right,pc,d0.w*2),a2
  99.     lea    (X_Left,pc,d0.w*2),a1
  100.  
  101.     move    (a1,d1.w*2),d2
  102.     cmp    (a2,d1.w*2),d2
  103.     ble.s    .No_Problem
  104.     exg    a1,a2
  105.     exg    a3,a4
  106. .No_Problem
  107.  
  108.     move.l    Phyzik+4(pc),a0       Screen address
  109.     mulu    #2*320,d0
  110.     adda.l    d0,a0
  111.  
  112.     moveq    #$19,d6
  113.     movec    d6,CACR    Cache reset
  114.  
  115.     subq    #1,d7
  116. .Loop_Line    move    (a1)+,d0    Left X
  117.     move    (a2)+,d6    Right X
  118.  
  119.     sub    d0,d6    Dx
  120.     bmi    .Skip_Line
  121.  
  122.     lea    (0.b,a0,d0.w*2),a5    Good screen address
  123.  
  124. *    Calculate slopes for mapping
  125.  
  126.     movem    (a3),d0-d1    Start offset in texture
  127.     movem    (a4),d2-d3    End offset in texture
  128.  
  129.     ext.l    d6
  130.  
  131.     sub    d0,d2    Texture Dx
  132.     swap    d2
  133.     clr    d2
  134.     divs.l    d6,d2    Texture Dx / Dx
  135.     swap    d2
  136.     move    d2,d4    Keep X Integer
  137.  
  138.     sub    d1,d3    Texture Dy
  139.     swap    d3
  140.     clr    d3
  141.     divs.l    d6,d3    Texture Dy / Dx
  142.     lsr.l    #8,d3
  143.     move    d3,d2    X Ratio.W + Y Integer.B + Y Ratio.B
  144.  
  145.     andi    #$00ff,d0    0.W + 0.B + X Start.B
  146.     ext.l    d1
  147.     lsl    #8,d1    0.W + Y Start.B + 0.B
  148.  
  149.     move    d4,d3    ?.W + X Integer.W
  150.     moveq    #0,d4
  151.  
  152. *    D0 = 0.W + X Start.W
  153. *    D1 = 0.W + Y Start.B + 0.B
  154. *    D2 = X Ratio.W + Y Integer.B + Y Ratio.B
  155. *    D3 = ?.W + X Integer.W
  156. *    D4 = 0.L
  157.     
  158. .Loop_Fill    move    d1,d4
  159.     move.b    d0,d4
  160.     move    (0.b,a6,d4.l*2),(a5)+
  161.  
  162.     add.l    d2,d1
  163.     addx    d3,d0
  164.     dbf    d6,.Loop_Fill
  165.  
  166. .Skip_Line    lea    2*320(a0),a0    Next line
  167.     addq    #4,a3
  168.     addq    #4,a4
  169.     dbf    d7,.Loop_Line
  170.  
  171. No_Mapping    rts
  172.  
  173. *    IN:    D0-D1 = Vertice0
  174. *           D2-D3 = Vertice1
  175. *
  176. *           D4-D5 = Texture vertice0
  177. *           D6-D7 = Texture vertice1
  178.  
  179. *    Trace shape
  180.  
  181. Shape_Tracing    lea    Txt_Right(pc),a1
  182.     lea    X_Right(pc),a0
  183.  
  184.     cmp    d1,d3
  185.     bge.s    .No_Change
  186.  
  187.     lea    Txt_Left(pc),a1
  188.     lea    X_Left(pc),a0
  189. .No_Change
  190.     cmp    d0,d2    Be sure to always draw on the righthand
  191.     bge.s    .No_Exchange
  192.     exg    d0,d2
  193.     exg    d1,d3
  194.     exg    d4,d6
  195.     exg    d5,d7
  196. .No_Exchange
  197.     sub    d4,d6    Texture Dx
  198.     sub    d5,d7    Texture Dy
  199.  
  200.     sub    d0,d2    Dx
  201.     sub    d1,d3    Dy
  202.     beq.s    .No_Trace
  203.     bpl.s    .Left_Hand
  204.  
  205.     add    d2,d0    Start x is the other vertice
  206.     add    d3,d1    Start y is the other vertice also
  207.     add    d6,d4    Texture start x is the other vertice
  208.     add    d7,d5    Texture start y is the other vertice also
  209.  
  210. .Left_Hand    lea    (a0,d1.w*2),a0    Starting buffer address
  211.     lea    (a1,d1.w*4),a1    Starting texture buffer address
  212.  
  213.     ext.l    d3    Denominator is a .L !!
  214.  
  215.     swap    d2
  216.     clr    d2
  217.     divs.l    d3,d2    Dx / Dy
  218.     swap    d2
  219.     move.l    d2,d1    Ratio.W + Integer.W for X tracing
  220.  
  221.     swap    d6
  222.     clr    d6
  223.     divs.l    d3,d6    Texture Dx / Dy
  224.     swap    d6
  225.     move.l    d6,d2    X Ratio.W + X Integer.W for texture
  226.  
  227.     swap    d7
  228.     clr    d7
  229.     divs.l    d3,d7    Texture Dy / Dy
  230.     swap    d7
  231.     move.l    d7,d6
  232.  
  233.     move    d3,d7    ABS(Dy) is tracing heigth
  234.     bpl.s    .No_Invert
  235.     neg    d7
  236. .No_Invert    subq    #1,d7    DBF ROULZES!!!
  237.  
  238.     move.l    d6,d3    Y Ratio.W + Y Integer.W for texture
  239.  
  240.     ext.l    d0    X Start
  241.     ext.l    d4    X Texture start
  242.     ext.l    d5    Y Texture start
  243.     moveq    #0,d6
  244.  
  245. *    D0 = 0.W + X Start.W
  246. *    D1 = X Ratio.W + X Integer.W for shape drawing
  247. *    D2 = X Ratio.W + X Integer.W for texture
  248. *    D3 = Y Ratio.W + Y Integer.W for texture
  249. *    D4 = 0.W + X Texture Start.W
  250. *    D5 = 0.W + Y Texture Start.W
  251. *    D6 = 0.L
  252. *    D7 = 0.W + Tracing_Heigth.W
  253.  
  254. .Loop_Miracle    move    d0,(a0)+    Stock current X
  255.     move    d4,(a1)+    Stock current X texture
  256.     move    d5,(a1)+    Stock current Y texture
  257.  
  258.     add.l    d1,d0    Add ratio + integer
  259.     addx    d6,d0    Add carry to integer value
  260.  
  261.     add.l    d2,d4    Add X Ratio + X Integer
  262.     addx    d6,d4    Add carry to X integer value
  263.  
  264.     add.l    d3,d5    Add Y Ratio + Y Integer
  265.     addx    d6,d5    Add carry to Y integer value
  266.  
  267.     dbf    d7,.Loop_Miracle
  268.  
  269. .No_Trace    rts
  270.  
  271.