home *** CD-ROM | disk | FTP | other *** search
/ Fujiology Archive / fujiology_archive_v1_0.iso / !FALCON / LINEOUT / DELTA.ZIP / DELTASRC.ZIP / DELTA.SRC / RAYPLANE.SO < prev    next >
Text File  |  2002-08-10  |  17KB  |  815 lines

  1. ; Raycasted plane. A screen for delta.
  2.  
  3. ;======= OBJECT EQUATES ========
  4.  
  5. RayPlane.SPANLOG:    =    2
  6.  
  7. RayPlane.XBLOCKSIZE:    =    1<<RayPlane.SPANLOG
  8. RayPlane.YBLOCKSIZE:    =    1<<RayPlane.SPANLOG
  9.  
  10. RayPlane.WIDTH:        =    160
  11. RayPlane.HEIGHT:    =    100
  12. RayPlane.XBLOCKS:    =    RayPlane.WIDTH/RayPlane.XBLOCKSIZE
  13. RayPlane.YBLOCKS:    =    RayPlane.HEIGHT/RayPlane.YBLOCKSIZE+1
  14. RayPlane.DISTANCE:    =    $6000
  15.  
  16. RayPlane.VECTORSCALE:    =    100
  17.  
  18. ;======= OBJECT TABLE ========
  19.  
  20. * Must be first in object!!
  21. RayPlane.table:
  22.     DC.L    RayPlane.mainLoop
  23.     DC.L    RayPlane.init
  24.     DC.L    RayPlane.setRes
  25. * Add more addresses here..
  26.     DC.L    0
  27.  
  28. ;======= RESOLUTION SETTING ROUTINE ========
  29.  
  30. RayPlane.setRes:
  31.     IFEQ    testmode
  32.     move.l    #rts,vbl_gfx
  33.  
  34.     move.w    $0468.w,d0
  35. .ck468:    cmp.w    $0468.w,d0
  36.     beq.s    .ck468
  37.     move.w    monitormode,d0
  38.     cmpi.w    #vga60,d0
  39.     beq.s    .vga60
  40.     cmpi.w    #vga100,d0
  41.     beq.s    .vga100
  42.     cmpi.w    #rgb50,d0
  43.     beq.s    .rgb50
  44. * Unknown monitormode..
  45.     rts
  46. .vga60:    bra.l    vga60_16bit_160_200
  47. .vga100:bra.l    vga100_16bit_160_100
  48. .rgb50:    bra.l    rgb50_16bit_320_100
  49.     ENDC
  50.     rts
  51.  
  52. ;======= INIT SUBROUTINE ========
  53.  
  54. * OUTPUT: d0.l: 0   = All clear.
  55. *               neg = Error! Not initialized!
  56. RayPlane.init:
  57.  
  58. .success:
  59.     moveq    #0,d0
  60.     rts
  61. .error:    moveq    #-1,d0
  62.     rts
  63.  
  64. ;======= REALTIME INIT SUBROUTINE ========
  65.  
  66. RayPlane.realtimeInit:
  67.     move.w    $04BC.w,RayPlane.startTime
  68.     rts
  69.  
  70. ;======= SCREENINIT SUBROUTINE ========
  71.  
  72. RayPlane.initScreen:
  73. * Insert screenarea initialising, etc. in here!
  74.     rts
  75.  
  76. ;======= MAINLOOP SUBROUTINE ========
  77.  
  78. RayPlane.mainLoop:
  79.     move.l    frmcnt,d0
  80.     sub.l    lastframecount,d0
  81.     bne.s    .end_realtime_init
  82.     move.l    d0,-(sp)
  83.     bsr    RayPlane.realtimeInit
  84.     move.l    (sp)+,d0
  85. .end_realtime_init:
  86.     cmpi.l    #3,d0
  87.     bhs.s    .end_screeninit
  88.     bsr    RayPlane.initScreen
  89. .end_screeninit:
  90.  
  91.     move.w    $04BC.w,d0
  92.     sub.w    RayPlane.startTime,d0
  93.     addi.w    #2048,d0
  94.     move.w    d0,d3
  95.     move.w    d0,d1
  96.     mulu.w    #3,d1
  97.     lsr.w    #3,d1
  98.     move.w    d0,d2
  99.     lsr.w    #1,d2
  100.     lsr.w    #2,d0
  101.     move.w    d0,RayPlane.xAngle
  102.     move.w    d1,RayPlane.yAngle
  103.     move.w    d2,RayPlane.zAngle
  104.     move.w    #$2000,RayPlane.planePos
  105.     move.w    d3,d0
  106.     lsl.w    #6,d0
  107.     move.w    d0,RayPlane.uOffset
  108.     bsr    RayPlane.calcGrid
  109.  
  110.     lea    Texture.16bTexture2,a2
  111.     IFNE    0
  112.     bsr    RayPlane.calcColumns
  113.     bsr    RayPlane.paintColumns
  114.     ELSE
  115.     bsr    RayPlane.paint
  116.     ENDC
  117.  
  118.     IFEQ    testmode
  119.     lea    scr,a0
  120.     move.l    (a0)+,d0
  121.     move.l    (a0)+,d1
  122.     move.l    (a0),-4(a0)
  123.     move.l    d0,(a0)
  124.     move.l    d1,-8(a0)
  125.     move.l    d0,d1
  126.     lsr.w    #8,d0
  127.     move.l    d0,$ffff8200.w
  128.     move.b    d1,$ffff820d.w
  129.     ENDC
  130.  
  131.     move.l    frmcnt,d0
  132.     sub.l    lastframecount,d0
  133.     bne.s    .res_done
  134.     bsr    RayPlane.setRes
  135. .res_done:
  136.  
  137.     rts
  138.  
  139. ;======= OBJECT SUBROUTINES ========
  140.  
  141. ; Seems to work ok, since there has been some patching on the overflow
  142. ; errors (caused by combination of finite accuracy and use of maximum range).
  143. ; INPUT:
  144. ; d0.w: X rotation (a)
  145. ; d1.w: Y rotation (b)
  146. ; d2.w: Z rotation (c)
  147. RayPlane.generateMatrix:
  148.     lea    RayPlane.matrix,a0
  149. * 1> rotate 3 axis.
  150.     Do_SinModulo    d0
  151.     Do_SinModulo    d1
  152.     Do_SinModulo    d2
  153.     movea.w    d0,a3
  154.     movea.w    d1,a4
  155.     movea.w    d2,a5
  156.     lea    sine_tbl,a2
  157.  
  158. * X := + x*cos(b)*cos(c)
  159. *      - y*cos(b)*sin(c)
  160. *      + z*sin(b)
  161.     Get_SinCos    a2,d1,d3,d4
  162.     Get_SinCos    a2,d2,d5,d6
  163.     muls.w    d4,d6                * / cos(b)*sin(c)
  164.     add.l    d6,d6                * |
  165. ;    bvc.s    .skipxd6
  166. ;    subq.l    #1,d6
  167. ;.skipxd6:
  168.     swap    d6                * \
  169.     muls.w    d4,d5                * / -cos(b)*sin(c)
  170.     add.l    d5,d5                * |
  171. ;    bvc.s    .skipxd5
  172. ;    subq.l    #1,d5
  173. ;.skipxd5:
  174.     swap    d5                * |
  175.     neg.w    d5                * \
  176.     move.w    d6,(a0)+
  177.     move.w    d5,(a0)+
  178.     move.w    d3,(a0)+
  179.     
  180. * Y := + x*(sin(a)*sin(b)*cos(c)+cos(a)*sin(c))
  181. *      + y*(cos(a)*cos(c)-sin(a)*sin(b)*sin(c))
  182. *      - z*sin(a)*cos(b)
  183.     Get_SinCos    a2,a3,d0,d1
  184.     Get_Sin        a2,a4,d2
  185.     Get_SinCos    a2,a5,d4,d5
  186.     muls.w    d0,d2
  187.     add.l    d2,d2
  188. ;    bvc.s    .skipyd2
  189. ;    subq.l    #1,d2
  190. ;.skipyd2:
  191.     swap    d2
  192.     muls.w    d2,d5
  193.     add.l    d5,d5
  194. ;    bvc.s    .skipyd5
  195. ;    subq.l    #1,d5
  196. ;.skipyd5:
  197.     swap    d5
  198.     muls.w    d1,d4
  199.     add.l    d4,d4
  200. ;    bvc.s    .skipyd4
  201. ;    subq.l    #1,d4
  202. ;.skipyd4:
  203.     swap    d4
  204.     add.w    d4,d5
  205.     bvc.s    .skipyvd5
  206.     addq.w    #1,d5
  207.     neg.w    d5
  208. .skipyvd5:
  209.     move.w    d5,d3
  210.     ;Get_SinCos    a2,a3,d0,d1
  211.     Get_Sin        a2,a4,d2
  212.     Get_SinCos    a2,a5,d4,d5
  213.     muls.w    d1,d5
  214.     add.l    d5,d5
  215. ;    bvc.s    .skipy2d5
  216. ;    subq.l    #1,d5
  217. ;.skipy2d5:
  218.     swap    d5
  219.     muls.w    d0,d2
  220.     add.l    d2,d2
  221. ;    bvc.s    .skipy2d2
  222. ;    subq.l    #1,d2
  223. ;.skipy2d2:
  224.     swap    d2
  225.     muls.w    d2,d4
  226.     add.l    d4,d4
  227.     swap    d4
  228.     sub.w    d4,d5
  229.     bvc.s    .skipyv2d5
  230.     addq.w    #1,d5
  231.     neg.w    d5
  232. .skipyv2d5:
  233.     Get_Cos        a2,a4,d4
  234.     muls.w    d0,d4
  235.     add.l    d4,d4
  236. ;    bvc.s    .skipy2d4
  237. ;    subq.l    #1,d4
  238. ;.skipy2d4:
  239.     swap    d4
  240.     neg.w    d4
  241.     move.w    d3,(a0)+
  242.     move.w    d5,(a0)+
  243.     move.w    d4,(a0)+
  244.  
  245. * Z := + x*(sin(a)*sin(c)-cos(a)*sin(b)*cos(c))
  246. *      + y*(cos(a)*sin(b)*sin(c)+sin(a)*cos(c))
  247. *      + z*cos(a)*cos(b)
  248.     Get_SinCos    a2,a3,d0,d1
  249.     Get_Sin        a2,a4,d2
  250.     Get_SinCos    a2,a5,d4,d5
  251.     muls.w    d0,d4
  252.     add.l    d4,d4
  253. ;    bvc.s    .skipzd4
  254. ;    subq.l    #1,d4
  255. ;.skipzd4:
  256.     swap    d4
  257.     muls.w    d1,d2
  258.     add.l    d2,d2
  259. ;    bvc.s    .skipzd2
  260. ;    subq.l    #1,d2
  261. ;.skipzd2:
  262.     swap    d2
  263.     muls.w    d2,d5
  264.     add.l    d5,d5
  265.     swap    d5
  266.     sub.w    d5,d4
  267.     bvc.s    .skipzvd4
  268.     addq.w    #1,d4
  269.     neg.w    d4
  270. .skipzvd4:
  271.     move.w    d4,d3
  272.     ;Get_SinCos    a2,a3,d0,d1
  273.     Get_Sin        a2,a4,d2
  274.     Get_SinCos    a2,a5,d4,d5
  275.     muls.w    d1,d2
  276.     add.l    d2,d2
  277. ;    bvc.s    .skipz2d2
  278. ;    subq.l    #1,d2
  279. ;.skipz2d2:
  280.     swap    d2
  281.     muls.w    d2,d4
  282.     add.l    d4,d4
  283.     swap    d4
  284.     muls.w    d0,d5
  285.     add.l    d5,d5
  286. ;    bvc.s    .skipzd5
  287. ;    subq.l    #1,d5
  288. ;.skipzd5:
  289.     swap    d5
  290.     add.w    d4,d5
  291.     bvc.s    .skipzvd5
  292.     addq.w    #1,d5
  293.     neg.w    d5
  294. .skipzvd5:
  295.     Get_Cos        a2,a4,d4
  296.     muls.w    d1,d4
  297.     add.l    d4,d4
  298. ;    bvc.s    .skipz2d4
  299. ;    subq.l    #1,d4
  300. ;.skipz2d4:
  301.     swap    d4
  302.     move.w    d3,(a0)+
  303.     move.w    d5,(a0)+
  304.     move.w    d4,(a0)+
  305.     rts
  306.  
  307. RayPlane.transformVector:
  308.     lea    RayPlane.matrix,a1
  309. * X
  310.     move.w    d0,d3
  311.     move.w    d1,d4
  312.     move.w    d2,d5
  313.     muls.w    (a1)+,d3
  314.     muls.w    (a1)+,d4
  315.     muls.w    (a1)+,d5
  316.     add.l    d3,d5
  317.     add.l    d4,d5
  318.     add.l    d5,d5
  319.     swap    d5
  320.     move.w    d5,(a0)+            * Store coordinate.
  321. * Y
  322.     move.w    d0,d3
  323.     move.w    d1,d4
  324.     move.w    d2,d5
  325.     muls.w    (a1)+,d3
  326.     muls.w    (a1)+,d4
  327.     muls.w    (a1)+,d5
  328.     add.l    d3,d5
  329.     add.l    d4,d5
  330.     add.l    d5,d5
  331.     swap    d5
  332.     move.w    d5,(a0)+            * Store coordinate.
  333. * Z
  334.     move.w    d0,d3
  335.     move.w    d1,d4
  336.     move.w    d2,d5
  337.     muls.w    (a1)+,d3
  338.     muls.w    (a1)+,d4
  339.     muls.w    (a1)+,d5
  340.     add.l    d3,d5
  341.     add.l    d4,d5
  342.     add.l    d5,d5
  343.     swap    d5
  344.     move.w    d5,(a0)+            * Store coordinate.
  345.     rts
  346.  
  347. RayPlane.calcGrid:
  348.  
  349.         RSRESET
  350. .X0:        RS.W    1
  351. .Y0:        RS.W    1
  352. .Z0:        RS.W    1
  353. .X1:        RS.W    1
  354. .Y1:        RS.W    1
  355. .Z1:        RS.W    1
  356. .X2:        RS.W    1
  357. .Y2:        RS.W    1
  358. .Z2:        RS.W    1
  359. .DX:        RS.W    1
  360. .DY:        RS.W    1
  361. .DZ:        RS.W    1
  362. .CORNERSIZE:    RS.W    1
  363.  
  364. ; Step 1:
  365. ; Set up corners of the viewcone.
  366. ; This is done by rotating the corners according to camera parameters.
  367.  
  368. ; Generate rotation matrix..
  369.     move.w    RayPlane.xAngle,d0
  370.     move.w    RayPlane.yAngle,d1
  371.     move.w    RayPlane.zAngle,d2
  372.     bsr    RayPlane.generateMatrix
  373.  
  374. ; Transform (=rotate) the corner vectors.
  375. ; Top-left corner...
  376.     move.w    #-RayPlane.WIDTH*RayPlane.VECTORSCALE,d0    ; left x
  377.     move.w    #-RayPlane.HEIGHT*RayPlane.VECTORSCALE,d1    ; top y
  378.     move.w    #RayPlane.DISTANCE,d2                ; z
  379.     lea    .cornerTable+.X0(pc),a0
  380.     bsr    RayPlane.transformVector
  381. ; Top-right corner...
  382.     move.w    #+RayPlane.WIDTH*RayPlane.VECTORSCALE,d0    ; right x
  383.     move.w    #-RayPlane.HEIGHT*RayPlane.VECTORSCALE,d1    ; top y
  384.     move.w    #RayPlane.DISTANCE,d2                ; z
  385.     lea    .cornerTable+.X1(pc),a0
  386.     bsr    RayPlane.transformVector
  387. ; Bottom-left corner...
  388.     move.w    #-RayPlane.WIDTH*RayPlane.VECTORSCALE,d0    ; left x
  389.     move.w    #+RayPlane.HEIGHT*RayPlane.VECTORSCALE,d1    ; bottom y
  390.     move.w    #RayPlane.DISTANCE,d2                ; z
  391.     lea    .cornerTable+.X2(pc),a0
  392.     bsr    RayPlane.transformVector
  393.  
  394. ; Step 2:
  395. ; Calculate interpolation steps across the viewcone.
  396.     lea    .cornerTable(pc),a2
  397.     movem.w    .X0(a2),d4-d6
  398.  
  399. ; Initialize xloop-steps.
  400.     movem.w    .X1(a2),d0-d2
  401.     sub.l    d4,d0
  402.     sub.l    d5,d1
  403.     sub.l    d6,d2
  404.     divs.w    #RayPlane.XBLOCKS,d0
  405.     divs.w    #RayPlane.XBLOCKS,d1
  406.     divs.w    #RayPlane.XBLOCKS,d2
  407.     movea.w    d0,a4
  408.     movea.w    d1,a5
  409.     movea.w    d2,a6
  410.  
  411. ; Initialize yloop-steps.
  412.     movem.w    .X2(a2),d0-d2
  413.     sub.l    d4,d0
  414.     sub.l    d5,d1
  415.     sub.l    d6,d2
  416.     divs.w    #RayPlane.YBLOCKS,d0
  417.     divs.w    #RayPlane.YBLOCKS,d1
  418.     divs.w    #RayPlane.YBLOCKS,d2
  419.     movem.w    d0-d2,.DX(a2)
  420.  
  421. ; Now calculate the grid.
  422.     clr.l    d1
  423.     move.w    RayPlane.planePos,d1
  424.     move.w    d1,d2
  425.     lsr.w    #2,d2
  426.     movea.w    d2,a1
  427.     lsl.l    #8,d1
  428.     moveq    #RayPlane.YBLOCKS,d7
  429.     lea    RayPlane.grid,a0
  430.     move.w    RayPlane.uOffset,d0
  431.  
  432. .yloop:    swap    d7
  433.     move.w    #RayPlane.XBLOCKS,d7        ; d7.w = x loopcounter
  434.  
  435. ; a0: grid
  436. ; Calculate intersection points on the plane and store the coordinates (u,v).
  437. ; l*Y=yi <=> l=yi/Y
  438. ; l*X=xi=u
  439. ; l*Z=zi=v
  440.  
  441. .xloop:    move.l    d1,d2                ; d2.l= yi
  442.     move.w    d5,d3
  443.     bpl.s    .pos
  444.     neg.w    d3
  445. .pos:
  446.  
  447. ;    cmp.w    a1,d3
  448. ;    bgt.s    .okay
  449. ;    move.w    a1,d3
  450. ;.okay:
  451.  
  452.     divs.w    d3,d2                ; d2.w= l=yi/Y
  453.     move.w    d4,d3
  454.     muls.w    d2,d3
  455.     asr.l    #8,d3                ; d3.w=u=l*x
  456.     move.w    d3,(a0)+
  457.     move.w    d6,d3
  458.     muls.w    d2,d3
  459.     asr.l    #8,d3
  460. ;    add.w    d0,d3                ; d3.w=v=z*l+v_offset
  461.     move.w    d3,(a0)+
  462. ; Interpolate direction vector on the horizontal axis.
  463.     add.w    a4,d4
  464.     add.w    a5,d5
  465.     add.w    a6,d6
  466.     dbf    d7,.xloop
  467.  
  468. ; Interpolate direction vector on the vertical axis.
  469.     movem.w    (a2),d4-d6
  470.     add.w    .DX(a2),d4
  471.     add.w    .DY(a2),d5
  472.     add.w    .DZ(a2),d6
  473.     movem.w    d4-d6,(a2)
  474.  
  475.     swap    d7
  476.     dbf    d7,.yloop
  477.     rts
  478.  
  479. .cornerTable
  480.     DS.B    .CORNERSIZE
  481.  
  482. RayPlane.calcColumns:
  483.     lea    RayPlane.grid,a1
  484.     lea    RayPlane.columns,a0
  485.     movea.l    #(1-(RayPlane.XBLOCKS+1)*RayPlane.YBLOCKS*RayPlane.YBLOCKSIZE)*4,a6
  486.     moveq    #RayPlane.XBLOCKS,d7
  487.  
  488. .xloop:    moveq    #RayPlane.YBLOCKS-1,d6
  489.  
  490. .yloop:    movem.w    (a1),d0/d1
  491.     lea    (RayPlane.XBLOCKS+1)*4(a1),a1
  492.     movem.w    (a1),d2/d3
  493.     sub.w    d0,d2
  494.     sub.w    d1,d3
  495.     asr.w    #RayPlane.SPANLOG,d2
  496.     asr.w    #RayPlane.SPANLOG,d3
  497.  
  498. ; spanloop
  499.     REPT    RayPlane.YBLOCKSIZE
  500.     movem.w    d0/d1,(a0)
  501.     lea    (RayPlane.XBLOCKS+1)*4(a0),a0
  502.     add.w    d2,d0
  503.     add.w    d3,d1
  504.     ENDR
  505.  
  506.     dbra    d6,.yloop
  507.  
  508.     adda.l    a6,a0
  509.     lea    (1-(RayPlane.XBLOCKS+1)*RayPlane.YBLOCKS)*4(a1),a1
  510.     dbra    d7,.xloop
  511.     rts
  512.  
  513. ; INPUT:
  514. ; a2: address of texture
  515. RayPlane.paintColumns:
  516.     movea.l    scr,a0
  517.     lea    RayPlane.columns,a1
  518.     moveq    #100-1,d7    ; y loop counter
  519.     clr.l    d4
  520.  
  521. .scanline:
  522.     swap    d7
  523.     move.w    #RayPlane.XBLOCKS-1,d7    ; x loop counter
  524.     
  525. .spanloop:
  526.     movem.w    (a1)+,d0/d1
  527.     movem.w    (a1),d2/d3            ; d2.w=ru, d2.w=rv
  528.     sub.w    d0,d2                ; d2.w=ru-lu
  529.     sub.w    d1,d3                ; d3.w=rv-lv
  530.     asr.w    #RayPlane.SPANLOG,d2
  531.     asr.w    #RayPlane.SPANLOG,d3
  532.     movea.w    d2,a3                ; a3.w=du x-increment
  533.     movea.w    d3,a4                ; a4.w=dv x-increment
  534.  
  535.     REPT    RayPlane.XBLOCKSIZE
  536.     move.w    d0,d4
  537.     move.w    d1,d5
  538.     lsr.w    #8,d5
  539.     move.b    d5,d4
  540.     move.w    (a2,d4.l*2),(a0)+
  541.     add.w    a3,d0                ; u:=u+du (x-inc)
  542.     add.w    a4,d1                ; v:=v+dv (x-inc)
  543.     ENDR
  544.  
  545.     dbra    d7,.spanloop
  546.  
  547.     addq    #4,a1
  548.     swap    d7
  549.     dbra    d7,.scanline
  550.     rts
  551.  
  552. ; INPUT:
  553. ; a2: address of texture
  554. RayPlane.paint:
  555.     movea.l    scr,a0
  556.     lea    RayPlane.grid,a1
  557.     moveq    #RayPlane.YBLOCKS-1,d7    ; y loop counter
  558.  
  559.     move.w    monitormode,d0
  560.     cmpi.w    #vga60,d0
  561.     beq    RayPlane.paintVga60
  562.     cmpi.w    #vga100,d0
  563.     beq.s    RayPlane.paintVga100
  564.     cmpi.w    #rgb50,d0
  565.     beq    RayPlane.paintRgb50
  566. ; Unknown monitormode..
  567.     rts
  568.  
  569. RayPlane.paintVga100:
  570. .scanline:
  571.     swap    d7
  572.     move.w    #RayPlane.XBLOCKS-1,d7    ; x loop counter
  573.     
  574. .square:movem.w    (RayPlane.XBLOCKS+1)*4(a1),d2/d3
  575.     movem.w    (a1)+,d0/d1
  576.     movem.w    (a1),d4/d5            ; d4.w=ru, d5.w=rv
  577.     sub.w    d0,d4                ; d4.w=du x-increment
  578.     sub.w    d1,d5                ; d5.w=dv x-increment
  579.     asr.w    #RayPlane.SPANLOG,d4
  580.     asr.w    #RayPlane.SPANLOG,d5
  581.     movea.w    d4,a3                ; a3.w=du x-increment
  582.     movea.w    d5,a4                ; a4.w=dv x-increment
  583.     sub.w    d0,d2
  584.     sub.w    d1,d3
  585.     asr.w    #RayPlane.SPANLOG,d2
  586.     asr.w    #RayPlane.SPANLOG,d3
  587.     movea.w    d2,a5                ; a5.w=du for y-increment
  588.     movea.w    d3,a6                ; a6.w=dv for y-increment
  589.     moveq    #RayPlane.XBLOCKSIZE-1,d6
  590.     clr.l    d4
  591.  
  592. .spanloop:
  593.     move.w    d0,d2                ; d2.w=u=lu
  594.     move.w    d1,d3                ; d3.w=u=lv
  595.  
  596.     REPT    RayPlane.XBLOCKSIZE
  597.     move.w    d2,d4
  598.     move.w    d3,d5
  599.     lsr.w    #8,d5
  600.     move.b    d5,d4
  601.     move.w    (a2,d4.l*2),(a0)+
  602.     add.w    a3,d2                ; u:=u+du (x-inc)
  603.     add.w    a4,d3                ; v:=v+dv (x-inc)
  604.     ENDR
  605.  
  606.     add.w    a5,d0                ; lu:=lu+du (y-inc)
  607.     add.w    a6,d1                ; lv:=lv+dv (y-inc)
  608.     lea    (RayPlane.WIDTH-RayPlane.XBLOCKSIZE)*2(a0),a0
  609.     dbra    d6,.spanloop
  610.  
  611.     lea    (-RayPlane.YBLOCKSIZE*RayPlane.WIDTH+RayPlane.XBLOCKSIZE)*2(a0),a0        ; next nice little square
  612.     dbra    d7,.square
  613.  
  614.     addq    #4,a1
  615.     lea    RayPlane.WIDTH*(RayPlane.YBLOCKSIZE-1)*2(a0),a0
  616.     swap    d7
  617.     dbra    d7,.scanline
  618.  
  619.     rts
  620.  
  621. RayPlane.paintVga60:
  622. .scanline:
  623.     swap    d7
  624.     move.w    #RayPlane.XBLOCKS-1,d7    ; x loop counter
  625.     
  626. .square:movem.w    (RayPlane.XBLOCKS+1)*4(a1),d2/d3
  627.     movem.w    (a1)+,d0/d1
  628.     movem.w    (a1),d4/d5            ; d4.w=ru, d5.w=rv
  629.     sub.w    d0,d4                ; d4.w=du x-increment
  630.     sub.w    d1,d5                ; d5.w=dv x-increment
  631.     asr.w    #RayPlane.SPANLOG,d4
  632.     asr.w    #RayPlane.SPANLOG,d5
  633.     movea.w    d4,a3                ; a3.w=du x-increment
  634.     movea.w    d5,a4                ; a4.w=dv x-increment
  635.     sub.w    d0,d2
  636.     sub.w    d1,d3
  637.     asr.w    #RayPlane.SPANLOG,d2
  638.     asr.w    #RayPlane.SPANLOG,d3
  639.     movea.w    d2,a5                ; a5.w=du for y-increment
  640.     movea.w    d3,a6                ; a6.w=dv for y-increment
  641.     moveq    #RayPlane.XBLOCKSIZE-1,d6
  642.     clr.l    d4
  643.  
  644. .spanloop:
  645.     move.w    d0,d2                ; d2.w=u=lu
  646.     move.w    d1,d3                ; d3.w=u=lv
  647.  
  648.     REPT    RayPlane.XBLOCKSIZE
  649.     move.w    d2,d4
  650.     move.w    d3,d5
  651.     lsr.w    #8,d5
  652.     move.b    d5,d4
  653.     move.w    (a2,d4.l*2),160*2(a0)
  654.     move.w    (a2,d4.l*2),(a0)+
  655.     add.w    a3,d2                ; u:=u+du (x-inc)
  656.     add.w    a4,d3                ; v:=v+dv (x-inc)
  657.     ENDR
  658.  
  659.     add.w    a5,d0                ; lu:=lu+du (y-inc)
  660.     add.w    a6,d1                ; lv:=lv+dv (y-inc)
  661.     adda.w    #(RayPlane.WIDTH*2-RayPlane.XBLOCKSIZE)*2,a0
  662.     dbra    d6,.spanloop
  663.  
  664.     adda.w    #(RayPlane.XBLOCKSIZE-RayPlane.YBLOCKSIZE*RayPlane.WIDTH*2)*2,a0        ; next nice little square
  665.     dbra    d7,.square
  666.  
  667.     addq    #4,a1
  668.     adda.w    #RayPlane.WIDTH*(2*RayPlane.YBLOCKSIZE-1)*2,a0
  669.     swap    d7
  670.     dbra    d7,.scanline
  671.  
  672.     rts
  673.  
  674. RayPlane.paintRgb50:
  675. .scanline:
  676.     swap    d7
  677.     move.w    #RayPlane.XBLOCKS-1,d7    ; x loop counter
  678.     
  679. .square:movem.w    (RayPlane.XBLOCKS+1)*4(a1),d2/d3
  680.     movem.w    (a1)+,d0/d1
  681.     movem.w    (a1),d4/d5            ; d4.w=ru, d5.w=rv
  682.     sub.w    d0,d4                ; d4.w=du x-increment
  683.     sub.w    d1,d5                ; d5.w=dv x-increment
  684.     asr.w    #RayPlane.SPANLOG,d4
  685.     asr.w    #RayPlane.SPANLOG,d5
  686.     movea.w    d4,a3                ; a3.w=du x-increment
  687.     movea.w    d5,a4                ; a4.w=dv x-increment
  688.     sub.w    d0,d2
  689.     sub.w    d1,d3
  690.     asr.w    #RayPlane.SPANLOG,d2
  691.     asr.w    #RayPlane.SPANLOG,d3
  692.     movea.w    d2,a5                ; a5.w=du for y-increment
  693.     movea.w    d3,a6                ; a6.w=dv for y-increment
  694.     moveq    #RayPlane.XBLOCKSIZE-1,d6
  695.     clr.l    d4
  696.  
  697. .spanloop:
  698.     move.w    d0,d2                ; d2.w=u=lu
  699.     move.w    d1,d3                ; d3.w=u=lv
  700.  
  701.     REPT    RayPlane.XBLOCKSIZE
  702.     move.w    d2,d4
  703.     move.w    d3,d5
  704.     lsr.w    #8,d5
  705.     move.b    d5,d4
  706.     move.w    (a2,d4.l*2),(a0)+
  707.     move.w    (a2,d4.l*2),(a0)+
  708.     add.w    a3,d2                ; u:=u+du (x-inc)
  709.     add.w    a4,d3                ; v:=v+dv (x-inc)
  710.     ENDR
  711.  
  712.     add.w    a5,d0                ; lu:=lu+du (y-inc)
  713.     add.w    a6,d1                ; lv:=lv+dv (y-inc)
  714.     adda.w    #(RayPlane.WIDTH-RayPlane.XBLOCKSIZE)*4,a0
  715.     dbra    d6,.spanloop
  716.  
  717.     adda.w    #(RayPlane.XBLOCKSIZE-RayPlane.YBLOCKSIZE*RayPlane.WIDTH)*4,a0        ; next nice little square
  718.     dbra    d7,.square
  719.  
  720.     addq    #4,a1
  721.     adda.w    #RayPlane.WIDTH*(RayPlane.YBLOCKSIZE-1)*4,a0
  722.     swap    d7
  723.     dbra    d7,.scanline
  724.  
  725.     rts
  726.  
  727. * INPUT:
  728. * a2: address of texture
  729. RayPlane.paintAcc:
  730.     movea.l    scr,a0
  731.     lea    RayPlane.grid,a1
  732.     lea    (RayPlane.XBLOCKS+1)*4(a1),a5
  733.     moveq    #RayPlane.YBLOCKS-1,d7    ; y loop counter
  734.     clr.l    d0
  735.  
  736. .scanline:
  737.     swap    d7
  738.     move.w    #RayPlane.XBLOCKS-1,d7    ; x loop counter
  739.     
  740. .square:move.l    (a5)+,d1        * (u4,v4)
  741.     move.l    (a1)+,a3        * (u1,v1)
  742.     move.l    (a5),d2            * (u3,v3)
  743.     move.l    (a1),a4            * (u2,v2)
  744.     sub.l    a3,d1            * (u4-u1,v4-v1)
  745.     sub.l    a4,d2            * (u3-u2,v3-v2)
  746.     lsl.w    #RayPlane.SPANLOG,d1
  747.     lsl.w    #RayPlane.SPANLOG,d2
  748.     asr.w    #RayPlane.SPANLOG,d1
  749.     asr.w    #RayPlane.SPANLOG,d2
  750.     adda.l    a3,a3
  751.     adda.l    a4,a4
  752.     adda.l    a3,a3
  753.     adda.l    a4,a4
  754.     adda.l    a3,a3
  755.     adda.l    a4,a4
  756.     moveq    #RayPlane.YBLOCKSIZE-1,d6
  757.  
  758. .Yspan:    move.l    a3,d3            * (uL,vL)
  759.     move.l    a4,d4            * (uR,vR)
  760.     sub.l    a3,d4            * (uR-uL,vR-vL)
  761.     asr.l    #RayPlane.SPANLOG,d4
  762.     lsl.w    #RayPlane.SPANLOG,d4
  763.     asr.w    #RayPlane.SPANLOG,d4
  764.  
  765.     REPT    RayPlane.XBLOCKSIZE
  766.     move.w    d3,d0
  767.     move.l    d3,d5
  768.     rol.l    #8,d5
  769.     move.b    d5,d0
  770.     move.w    (a2,d0.l*2),(a0)+
  771.     add.l    d4,d3            * (u+du,v+dv)
  772.     ENDR
  773.  
  774.     adda.w    #(RayPlane.WIDTH-RayPlane.XBLOCKSIZE)*2,a0    * next span
  775.     adda.l    d1,a3            * (uL+duL,vL+dvL)
  776.     adda.l    d2,a4            * (ur+duR,vR+dvR)
  777.     dbra    d6,.Yspan
  778.  
  779.     adda.w    #(-RayPlane.YBLOCKSIZE*RayPlane.WIDTH+RayPlane.XBLOCKSIZE)*2,a0    * next nice little square
  780.     dbra    d7,.square
  781.  
  782.     addq    #4,a1
  783.     addq    #4,a5
  784.     adda.w    #RayPlane.WIDTH*(RayPlane.YBLOCKSIZE-1)*2,a0
  785.     swap    d7
  786.     dbra    d7,.scanline
  787.     rts
  788.  
  789. ;======= OBJECT RESERVES ========
  790.  
  791.     BSS
  792.  
  793. RayPlane.xAngle:
  794.     DS.W    1
  795. RayPlane.yAngle:
  796.     DS.W    1
  797. RayPlane.zAngle:
  798.     DS.W    1
  799. RayPlane.planePos:
  800.     DS.W    1
  801. RayPlane.uOffset:
  802.     DS.W    1
  803.  
  804. RayPlane.matrix:
  805.     DS.W    3*3
  806.  
  807. RayPlane.grid:
  808.     DS.L    (RayPlane.XBLOCKS+1)*RayPlane.YBLOCKS
  809. RayPlane.columns:
  810.     DS.L    (RayPlane.XBLOCKS+1)*RayPlane.YBLOCKS*RayPlane.YBLOCKSIZE
  811.  
  812. RayPlane.startTime:
  813.     DS.W    1
  814.  
  815. ;======= END OF DEMO-EFFECT OBJECT ========