home *** CD-ROM | disk | FTP | other *** search
/ Fujiology Archive / fujiology_archive_v1_0.iso / !FALCON / LINEOUT / DELTA.ZIP / DELTASRC.ZIP / DELTA.SRC / BALLOID.SO < prev    next >
Text File  |  2003-01-02  |  17KB  |  921 lines

  1. ; Envmapped ball-oid. Demonstration of polar parametrisation.
  2. ; A screen for delta. Requires ufly.
  3.  
  4. ;======= OBJECT EQUATES ========
  5.  
  6. Balloid.R:        =    200
  7. Balloid.STEPS:        =    20            ; even, u-fly dsp requires this <=20 !
  8. Balloid.WIBBLESPEED:    =    5
  9. Balloid.NORMAL_DIV:    =    $100
  10.  
  11. Balloid.NUM_V:        =    Balloid.STEPS*Balloid.STEPS+2
  12.  
  13.             RSRESET
  14. Balloid.object:        RS.W    8192
  15. Balloid.BLOCK_SIZE:    RS.B    0
  16.  
  17. ;======= OBJECT TABLE ========
  18.  
  19. ; Must be first in object!!
  20. Balloid.table:
  21.     DC.L    Balloid.mainLoop
  22.     DC.L    Balloid.init
  23.     DC.L    Balloid.setRes
  24.     DC.L    Balloid.setStutter
  25.     DC.L    Balloid.setStill
  26.     DC.L    Balloid.setZoom
  27.     DC.L    Balloid.setLeftTurn
  28.     DC.L    Balloid.setrightTurn
  29.     DC.L    0
  30.  
  31.     IFND    DEMO_SYSTEM
  32.     INCLUDE    SFLY_DSP.S                ; Include the CPU-DSP engine.
  33.     TEXT
  34.     ENDC
  35.  
  36. ;======= RESOLUTION SETTING ROUTINE ========
  37.  
  38. Balloid.setRes:
  39.     IFEQ    testmode
  40.     move.w    monitormode,d0
  41.     cmpi.w    #vga60,d0
  42.     beq.s    .vga60
  43.     cmpi.w    #vga100,d0
  44.     beq.s    .vga100
  45.     cmpi.w    #rgb50,d0
  46.     beq.s    .rgb50
  47. ; Unknown monitormode..
  48.     rts
  49. .vga60:    bra.l    vga60_16bit_320_200
  50. .vga100:bra.l    vga100_16bit_320_200
  51. .rgb50:    bra.l    rgb50_16bit_320_200
  52.     ENDC
  53.     rts
  54.  
  55. ;======= INIT SUBROUTINE ========
  56.  
  57. ; OUTPUT:
  58. ; d0.l: =0 all clear, <0 error
  59. Balloid.init:
  60.     move.l    #Balloid.BLOCK_SIZE,d0
  61.     bsr.l    Mem.register
  62.  
  63.     bsr.l    HumanFly.init
  64.  
  65.     lea    sine_tbl,a1
  66.     bsr.l    Matrix.init
  67.  
  68. .success:
  69.     moveq    #0,d0
  70.     rts
  71. .error:    moveq    #-1,d0
  72.     rts
  73.  
  74. ;======= REALTIME INIT SUBROUTINE ========
  75.  
  76. Balloid.realtimeInit:
  77.     move.l    #rts,vbl_gfx
  78.  
  79.     bsr.l    Mem.getBlock
  80.     move.l    d0,Balloid.baseAdr
  81.  
  82.     move.w    $04BC.w,Balloid.startTime
  83.  
  84.     lea    Viewport.settingsTable,a0
  85.     move.w    #320,Viewport.XSCREEN(a0)
  86.     move.w    #200,Viewport.YSCREEN(a0)
  87.     move.w    #0,Viewport.XSTART(a0)
  88.     move.w    #0,Viewport.YSTART(a0)
  89.     move.w    #320,Viewport.XEND(a0)
  90.     move.w    #200,Viewport.YEND(a0)
  91.     move.w    #160,Viewport.XCENTER(a0)
  92.     move.w    #100,Viewport.YCENTER(a0)
  93.     move.w    #256+32,Viewport.ASPECT(a0)
  94.     move.w    #$100,Viewport.FOCAL(a0)
  95.     bsr.l    Viewport.update
  96.  
  97.     lea    Balloid.textureTable,a0
  98.     bsr.l    Polygon.init
  99.  
  100.     bsr.l    ObjectRegistry.clear
  101.     movea.l    Balloid.baseAdr,a0
  102.     adda.l    #Balloid.object,a0
  103.     bsr    Balloid.generate
  104. ; d0.l=size of generated object
  105.     movea.l    Balloid.baseAdr,a0
  106.     adda.l    #Balloid.object,a0
  107.     bsr.l    ObjectRegistry.set
  108.     tst.w    d0
  109.     bmi    .end
  110.  
  111.     clr.w    Balloid.rotDir
  112.     clr.w    Balloid.worldRot
  113.     clr.w    Balloid.oldWorldRot
  114.     bsr    Balloid.setZoom
  115.  
  116. ;    move.w    #Primitive.WORD|Primitive.MOVE,d0
  117. ;    moveq    #0,d1
  118. ;    bsr.l    Primitive.setPaintMode
  119. ;;    tst.w    d0
  120. ;;    bmi.s    .error
  121.  
  122. .end:    rts
  123.  
  124. ;======= SCREENINIT SUBROUTINE ========
  125.  
  126. Balloid.initScreen:
  127.     lea    Viewport.settingsTable,a0
  128.     movem.w    Viewport.XSTART(a0),d0/d6
  129.     movem.w    Viewport.YSTART(a0),d1/d7
  130.     move.l    #$00000000,d4
  131.     bsr.l    Viewport.paintRectangle
  132.     rts
  133.  
  134. ;======= MAINLOOP SUBROUTINE ========
  135.  
  136. Balloid.mainLoop:
  137.     move.w    $0468.w,.old468
  138.  
  139.     movea.l    scr,a0
  140.     bsr.l    Primitive.setScreenbuffer
  141.  
  142.     move.l    frmcnt,d0
  143.     sub.l    lastframecount,d0
  144.     bne.s    .end_realtime_init
  145.     move.l    d0,-(sp)
  146.     bsr    Balloid.realtimeInit
  147.     tst.w    d0
  148.     bmi    .end
  149.     move.l    (sp)+,d0
  150. .end_realtime_init:
  151.     cmpi.l    #3,d0
  152.     bhs.s    .end_screeninit
  153.     bsr    Balloid.initScreen
  154. .end_screeninit:
  155.  
  156.     move.w    $04BC.w,d0
  157.     sub.w    Balloid.startTime,d0
  158.     move.w    d0,Balloid.time
  159.  
  160.     movea.l    Balloid.moveRout,a0
  161.     jsr    (a0)
  162.  
  163.     bsr    Balloid.paint
  164.  
  165.     IFEQ    testmode
  166.     lea    scr,a0
  167.     move.l    (a0)+,d0
  168.     move.l    (a0)+,d1
  169.     move.l    (a0),-4(a0)
  170.     move.l    d0,(a0)
  171.     move.l    d1,-8(a0)
  172.     move.l    d0,d1
  173.     lsr.w    #8,d0
  174.     move.l    d0,$ffff8200.w
  175.     move.b    d1,$ffff820d.w
  176.     ENDC
  177.  
  178.     move.w    .old468(pc),d0
  179. .wait:    cmp.w    $0468.w,d0
  180.     beq.s    .wait
  181.  
  182.     move.l    frmcnt,d0
  183.     sub.l    lastframecount,d0
  184.     bne.s    .res_done
  185.     bsr    Balloid.setRes
  186. .res_done:
  187.  
  188. .end:    rts
  189.  
  190. .old468:DC.W    0
  191.  
  192. ;======= OBJECT SUBROUTINES ========
  193.  
  194. Balloid.setStutter:
  195.     move.w    $04BC.w,Balloid.moveStart
  196.     move.l    #Balloid.stutter,Balloid.moveRout
  197.     rts
  198.  
  199. Balloid.setStill:
  200.     move.w    $04BC.w,Balloid.moveStart
  201.     move.l    #Balloid.dummy,Balloid.moveRout
  202.     rts
  203.  
  204. Balloid.setZoom:
  205.     move.w    $04BC.w,Balloid.moveStart
  206.     move.l    #Balloid.zoom,Balloid.moveRout
  207.     st    Balloid.zoomOn
  208.     rts
  209.  
  210. Balloid.zoom:
  211.     tst.w    Balloid.zoomOn
  212.     beq.s    .end
  213.     move.w    $04BC.w,d0
  214.     sub.w    Balloid.moveStart,d0
  215.     neg.w    d0
  216.     add.w    d0,d0
  217.     addi.w    #1500,d0
  218.     cmpi.w    #700,d0
  219.     bgt.s    .ok
  220.     move.w    #700,Balloid.z
  221.     clr.w    Balloid.zoomOn
  222.     rts
  223. .ok:    move.w    d0,Balloid.z
  224. .end:    rts
  225.  
  226. Balloid.setLeftTurn:
  227.     move.w    $04BC.w,Balloid.moveStart
  228.     move.w    #-1,Balloid.rotDir
  229.     move.l    #Balloid.turn,Balloid.moveRout
  230.     move.w    Balloid.worldRot,Balloid.oldWorldRot
  231.     rts
  232.  
  233. Balloid.setrightTurn:
  234.     move.w    $04BC.w,Balloid.moveStart
  235.     move.w    #+1,Balloid.rotDir
  236.     move.l    #Balloid.turn,Balloid.moveRout
  237.     move.w    Balloid.worldRot,Balloid.oldWorldRot
  238.     rts
  239.  
  240. Balloid.turn:
  241.     tst.w    Balloid.rotDir
  242.     beq.s    .end
  243.     move.w    $04BC.w,d0
  244.     sub.w    Balloid.moveStart,d0
  245.     lsl.w    #2,d0
  246.     cmpi.w    #sintbllen/4,d0
  247.     blt.s    .ok
  248.     move.w    #sintbllen/4,d0
  249.     muls.w    Balloid.rotDir,d0
  250.     add.w    Balloid.oldWorldRot,d0
  251.     move.w    d0,Balloid.worldRot
  252.     clr.w    Balloid.rotDir
  253.     rts
  254. .ok:    muls.w    Balloid.rotDir,d0
  255.     add.w    Balloid.oldWorldRot,d0
  256.     move.w    d0,Balloid.worldRot
  257. .end:    rts
  258.  
  259. Balloid.stutter:
  260.     move.w    Balloid.time,d0
  261.     andi.w    #$001F,d0
  262.     subi.w    #$10,d0
  263.     move.w    d0,Balloid.x
  264.     move.w    $04BC.w,d0
  265.     sub.w    Balloid.moveStart,d0
  266.     mulu.w    d0,d0
  267.     lsr.l    #8,d0
  268.     addi.w    #700,d0
  269.     move.w    d0,Balloid.z
  270.     rts
  271.  
  272. Balloid.dummy:
  273.     clr.w    Balloid.x
  274.     move.w    #1500,Balloid.z
  275.     rts
  276.  
  277. Balloid.paint:
  278.     bsr.l    PrimitiveMesh.new
  279.  
  280. ; world rotation.
  281.     move.w    Balloid.worldRot,d0
  282.     clr.w    d1
  283.     clr.w    d2
  284.     bsr.l    Matrix.generate
  285.  
  286.     move.w    Balloid.x,d0
  287.     clr.w    d1
  288.     move.w    Balloid.z,d2
  289.     bsr.l    Matrix.translate
  290.     bsr.l    Matrix.push
  291.  
  292.     clr.w    d0
  293.     move.w    Balloid.time,d1
  294.     lsl.w    #3,d1
  295.     clr.w    d2
  296.     bsr.l    Matrix.generate
  297.  
  298.     clr.w    d0
  299.     clr.w    d1
  300.     clr.w    d2
  301.     bsr.l    Matrix.translate
  302.     bsr.l    Matrix.push
  303.     moveq    #TransformObject.BACKFACE_CULLING|TransformObject.PERSPECTIVATE,d0
  304.     moveq    #0,d1
  305.     bsr.l    TransformObject.transform
  306.     bsr.l    Matrix.pop
  307.  
  308.     bsr.l    Matrix.pop            ; pop world rotation
  309.  
  310.     bsr.l    PrimitiveMesh.sortZ
  311.  
  312.     bsr.l    PrimitiveMesh.complete
  313.  
  314.     IFNE    0
  315.     lea    Viewport.settingsTable,a0
  316.     movem.w    Viewport.XSTART(a0),d0/d6
  317.     movem.w    Viewport.YSTART(a0),d1/d7
  318.     move.l    #$000F000F,d4
  319.     bsr    Viewport.paintRectangle
  320.     ELSE
  321.     movea.l    Balloid.rectAddressTable,a0
  322.     move.w    (a0)+,d7
  323.     beq.s    .end_restore
  324.     subq.w    #1,d7
  325. .restore_loop:
  326.     move.w    d7,-(sp)
  327.     movem.w    (a0)+,d1/d7
  328.     movem.w    (a0)+,d0/d6
  329.     move.l    a0,-(sp)
  330.     move.l    #$00000000,d4
  331.     bsr.l    Viewport.paintRectangle
  332.     movea.l    (sp)+,a0
  333.     move.w    (sp)+,d7
  334.     dbra    d7,.restore_loop
  335. .end_restore:
  336.     ENDC
  337.  
  338.     movea.l    Balloid.rectAddressTable,a0
  339.     bsr.l    PrimitiveMesh.paint
  340.  
  341.     lea    Balloid.rectAddressTable,a0
  342.      move.l    (a0)+,d0
  343.     move.l    (a0)+,d1
  344.     move.l    (a0),-(a0)
  345.     move.l    d0,4(a0)
  346.     move.l    d1,-(a0)
  347. .end:    rts
  348.  
  349. ; 1 + 8 + 1, 10 points on curve, 9 lines on curve
  350. ; INPUT:
  351. ; a0: destination object
  352. ; OUTPUT:
  353. ; d0.l=size
  354. Balloid.generate:
  355.     movea.l    a0,a6
  356.  
  357.     move.w    #2*(Balloid.STEPS*Balloid.STEPS+2),(a0)+    ;#vertices+#normals
  358.     move.w    #Balloid.STEPS*Balloid.STEPS+2,(a0)+        ;#normals
  359.     movea.l    a0,a4
  360.  
  361.     move.w    $0468.w,.time
  362.     lea    sine_tbl,a1
  363.  
  364.     move.w    $04BC.w,d5
  365.     clr.w    d5
  366.     lsl.w    #Balloid.WIBBLESPEED,d5
  367.     Do_SinModulo    d5
  368.     Get_Sin    a1,d5,d5
  369.     asr.w    #8,d5
  370.     asr.w    #1,d5
  371.     addi.w    #$100,d5
  372.     muls.w    #Balloid.R,d5
  373.     asr.l    #8,d5
  374.  
  375. ; Output top vertex..
  376.     clr.w    (a0)+
  377.     clr.w    (a0)+
  378.     clr.w    (a0)+
  379.  
  380.     moveq    #1,d7
  381.  
  382. ; 0.1/9.2/9.3/9.4/9.5/9.6/9.7/9.8/9.1, 10 points, 9 lines
  383. ; 1 top, 1 bottom, 8 inbetween points.. 
  384.  
  385. ; Outer loop (180 degrees)
  386.  
  387. .r1_loop:
  388.     move.w    d7,d0
  389.     mulu.w    #(sintbllen/(Balloid.STEPS+1))/2,d0
  390.     Get_SinCos    a1,d0,d0,d3
  391.     muls.w    #Balloid.R,d0
  392.     muls.w    d5,d3
  393.     add.l    d0,d0
  394.     add.l    d3,d3
  395.     swap    d0                    ; d0.w=r2
  396.     swap    d3                    ; d3.w=r*cos(t1)
  397.  
  398.     clr.w    d6
  399.  
  400. ; Inner loop (360 degrees)
  401. .r2_loop:
  402.  
  403. ; Vibrate r.
  404.     move.w    d6,d4
  405.     mulu.w    #sintbllen*3/Balloid.STEPS,d4
  406.     move.w    d7,d1
  407.     mulu.w    #sintbllen/Balloid.STEPS,d1
  408.     add.w    d1,d4
  409.     Do_SinModulo    d4
  410.     Get_Cos    a1,d4,d4
  411.     asr.w    #2,d4
  412.     muls.w    d0,d4
  413.     add.l    d4,d4
  414.     swap    d4
  415.  
  416.     add.w    d0,d4
  417.  
  418.     move.w    d6,d1
  419.     mulu.w    #sintbllen/Balloid.STEPS,d1
  420.     Get_SinCos    a1,d1,d1,d2
  421.  
  422.     muls.w    d4,d1
  423.     muls.w    d4,d2
  424.     add.l    d1,d1
  425.     add.l    d2,d2
  426.     swap    d1
  427.     swap    d2
  428.     move.w    d1,(a0)+                ; Output r2*cos(t2).
  429.     muls.w    d3,d4
  430.     divs.w    #Balloid.R,d4
  431.     move.w    d4,(a0)+                ; Output r*cos(t1).
  432.     move.w    d2,(a0)+                ; Output r2*sin(t2).
  433.     addq.w    #1,d6
  434.     cmpi.w    #Balloid.STEPS,d6
  435.     blt.s    .r2_loop
  436.  
  437.     addq.w    #1,d7
  438.     cmpi.w    #Balloid.STEPS+1,d7
  439.     blt    .r1_loop
  440.  
  441. ; Output bottom vertex..
  442.     clr.w    (a0)+
  443.     clr.w    (a0)+
  444.     clr.w    (a0)+
  445.  
  446. ;----------------
  447. ; Normal vectors.
  448.  
  449.     move.w    $04BC.w,d5
  450.     lsl.w    #Balloid.WIBBLESPEED,d5
  451.     Do_SinModulo    d5
  452.     Get_Sin    a1,d5,d5
  453.     asr.w    #8,d5
  454.     asr.w    #3,d5
  455.     addi.w    #$60,d5
  456.     move.w    #127,d5
  457.     move.w    d5,-(sp)
  458.  
  459. ; Output top vertex..
  460.     clr.w    (a0)+
  461.     move.w    d5,(a0)+
  462.     clr.w    (a0)+
  463.  
  464. ; Calculate normals! Uses the output vertices for this.
  465. ;
  466. ; n = o/|o|, normal is outward vector normalized to unit-length.
  467. ; -   -  -
  468. ;
  469. ; o = (u[i-1, j] + u[i, j]) X (v[i, j-1] + v[i, j])
  470. ; -    -           -           -           -
  471. ;
  472. ; u[i, j] = a[i+1, j]-a[i, j], v[i, j] = a[i, j+1]-a[i, j]
  473. ; -         -         -                  -         -
  474. ;
  475. ; o = (a[i+1, j]-a[i-1, j]) X (a[i, j+1]-a[i, j-1])
  476. ; -    -         -             -         -
  477. ;
  478. ;             [l.z*r.y-l.y*r.z]
  479. ; o = l X r = [l.x*r.z-l.z*r.x]
  480. ; -   -   -   [l.y*r.x-l.x*r.y]
  481. ;
  482. ; i, j are discrete versions of phi, theta.
  483. ;
  484. ; a[I+i, j]=a[i, j], a[i, 0]=N, a[i, J]=S, where I is #steps of i.
  485. ; -         -        -       -          -
  486. ;
  487. ; I.e. 'i' wraps, 'j' has special polar cases.
  488. ;
  489.     moveq    #1,d7
  490.  
  491. .normal_rloop:
  492.     clr.w    d6
  493.  
  494. .normal_ploop:
  495. ; First, we calc l..
  496. ;                -
  497.     move.w    d7,d3
  498.     subq.w    #1,d3
  499.     mulu.w    #Balloid.STEPS,d3
  500.     clr.l    d4
  501.     move.w    d6,d4
  502.     addq.w    #1,d4                    ; i+1 !
  503.     divu.w    #Balloid.STEPS,d4
  504.     swap    d4                    ; d4.w=wrapped i+1
  505.     add.w    d4,d3                    ; d3.l=offset [i+1, j]
  506.     addq.w    #1,d3
  507.     mulu.w    #Vertex.SIZE,d3
  508.     movem.w    (a4,d3.l),d0-d2
  509. ; d0-d2=a[i+1,j]
  510. ;       -
  511.     move.w    d7,d3
  512.     subq.w    #1,d3
  513.     mulu.w    #Balloid.STEPS,d3
  514.     clr.l    d4
  515.     move.w    d6,d4
  516.     subq.w    #1,d4                    ; i-1 !
  517.     bpl.s    .i_pos
  518.     moveq    #Balloid.STEPS-1,d4
  519. .i_pos:    add.w    d4,d3                    ; d3.l=offset [i-1, j]
  520.     addq.w    #1,d3
  521.     mulu.w    #Vertex.SIZE,d3
  522.     sub.w    Vertex.X(a4,d3.l),d0
  523.     sub.w    Vertex.Y(a4,d3.l),d1
  524.     sub.w    Vertex.Z(a4,d3.l),d2
  525. ; d0-d2=a[i+1,j]-a[i-1,j]=l
  526. ;       -        -        -
  527.  
  528. ; Store l on stack.
  529. ;       -
  530.     movem.w    d0-d2,-(sp)
  531.  
  532. ; Now, we calc r..
  533. ;              -
  534.     move.w    d7,d3
  535.     cmpi.w    #Balloid.STEPS,d3
  536.     bne.s    .offset_ok3
  537.     move.w    #1+Balloid.STEPS*Balloid.STEPS,d3
  538.     bra.s    .offset_calced3
  539. .offset_ok3:
  540.     addq.w    #1,d3
  541.     mulu.w    #Balloid.STEPS,d3
  542.     add.w    d6,d3                    ; d3.l=offset [i, j+1]
  543.     addq.w    #1,d3
  544. .offset_calced3:
  545.     mulu.w    #Vertex.SIZE,d3
  546.     movem.w    (a4,d3.l),d0-d2
  547. ; d0-d2=a[i,j+1]
  548. ;       -
  549.     move.w    d7,d3
  550.     subq.w    #1,d3                    ; j-1 !
  551.     beq.s    .offset_calced4
  552.     subq.w    #1,d3
  553.     mulu.w    #Balloid.STEPS,d3
  554.     add.w    d6,d3                    ; d3.l=offset [i, j-1]
  555.     addq.w    #1,d3
  556. .offset_calced4:
  557.     mulu.w    #Vertex.SIZE,d3
  558.     sub.w    Vertex.X(a4,d3.l),d0
  559.     sub.w    Vertex.Y(a4,d3.l),d1
  560.     sub.w    Vertex.Z(a4,d3.l),d2
  561.     
  562. ; d0-d2=a[i,j+1]-a[i,j-1]=r
  563. ;       -        -        -
  564.  
  565. ; Now we calculate the outward vector o.
  566. ;                                     -
  567. ;             [l.z*r.y-l.y*r.z]
  568. ; o = l X r = [l.x*r.z-l.z*r.x]
  569. ; -   -   -   [l.y*r.x-l.x*r.y]
  570. ;
  571.     movem.w    (sp),d3-d5
  572.  
  573. ; d3-d5=l
  574. ;       -
  575.     muls.w    d1,d5                ; d5.l=l.z*r.y
  576.     muls.w    d2,d4                ; d4.l=l.y*r.z
  577.     sub.l    d4,d5
  578.     movea.l    d5,a2                ; a2=l.z*r.y-l.y*r.z
  579.     movem.w    (sp),d3-d5
  580. ; d3-d5=l
  581. ;       -
  582.     muls.w    d2,d3                ; d3.l=l.x*r.z    
  583.     muls.w    d0,d5                ; d5.l=l.z*r.x
  584.     sub.l    d5,d3                ; d3.l=l.x*r.z-l.z*r.x
  585.     movea.l    d3,a3                ; a3=l.x*r.z-l.z*r.x
  586.     movem.w    (sp)+,d3-d5
  587. ; d3-d5=l
  588. ;       -
  589.     muls.w    d0,d4                ; d4.l=l.y*r.x
  590.     muls.w    d1,d3                ; d3.l=l.x*r.y
  591.     sub.l    d3,d4                ; d4.l=l.y*r.x-l.x*r.y
  592. ; a2/a3/d4=o
  593. ;          -
  594.  
  595.     move.l    a2,d0
  596.     move.l    a3,d1
  597.     move.l    d4,d2
  598.     asr.l    #7,d0
  599.     asr.l    #7,d1
  600.     asr.l    #7,d2
  601.     muls.w    d0,d0
  602.     muls.w    d1,d1
  603.     muls.w    d2,d2
  604.     add.l    d0,d1
  605.     add.l    d2,d1
  606.     bsr.l    Math.sqrt
  607. ; d0.l=|o|/128 (16:16)
  608. ;       -
  609.     move.l    a2,d1
  610.     move.l    a3,d2
  611.     move.l    d4,d3
  612.     swap    d0
  613.     mulu.w    #Balloid.NORMAL_DIV,d0
  614.     lsr.l    #8,d0
  615.     divs.w    d0,d1
  616.     divs.w    d0,d2
  617.     divs.w    d0,d3
  618. ; d1-d3=n, store it..
  619. ;       -
  620.     move.w    d1,(a0)+
  621.     move.w    d2,(a0)+
  622.     move.w    d3,(a0)+
  623.     addq.w    #1,d6
  624.     cmpi.w    #Balloid.STEPS,d6
  625.     blt    .normal_ploop
  626.  
  627.     addq.w    #1,d7
  628.     cmpi.w    #Balloid.STEPS+1,d7
  629.     blt    .normal_rloop
  630.  
  631. ; Output bottom vertex..
  632.     move.w    (sp)+,d5
  633.     clr.w    (a0)+
  634.     neg.w    d5
  635.     move.w    d5,(a0)+
  636.     clr.w    (a0)+
  637.  
  638.     clr.w    (a0)+                    ; Output #texels (0).
  639.  
  640. ;------------
  641. ; Primitives
  642.  
  643. ; 1 top line, 1 bottom line, 7 inbetween lines
  644. ; Filled version. Head=n tris, tail=n tris, body=n*(n-1) quads
  645. ; total=2n+2n*(n-1)=2n(1+n-1)=2n(n)=2n*n primitives.
  646.  
  647. ; Output primitives..
  648.     move.w    #2*Balloid.STEPS*Balloid.STEPS,(a0)+
  649.  
  650. ; Output head.
  651. ; 0-1-2, 0-2-3, 0-3-4,... 0, (i+1), (i+1) mod n +1
  652.     moveq    #Balloid.STEPS-1,d7
  653. .head_loop:
  654.     move.w    #Polygon.TRI|Polygon.ENVMAPPED|0,(a0)+
  655.     clr.w    (a0)+
  656.     moveq    #1,d0
  657.     add.w    d7,d0
  658.     move.w    d0,(a0)+
  659.     move.w    d7,d0
  660.     addq.w    #1,d0
  661.     divu.w    #Balloid.STEPS,d0
  662.     swap    d0
  663.     addq.w    #1,d0
  664.     move.w    d0,(a0)+
  665.  
  666. ; Normal refs..
  667.     move.w    #Balloid.STEPS*Balloid.STEPS+2,(a0)+
  668.     move.w    #Balloid.STEPS*Balloid.STEPS+3,d0
  669.     add.w    d7,d0
  670.     move.w    d0,(a0)+
  671.     clr.l    d0
  672.     move.w    d7,d0
  673.     addq.w    #1,d0
  674.     divu.w    #Balloid.STEPS,d0
  675.     swap    d0
  676.     addi.w    #Balloid.STEPS*Balloid.STEPS+3,d0
  677.     move.w    d0,(a0)+
  678.     
  679.     dbra    d7,.head_loop
  680.  
  681. ; Output body.
  682.     moveq    #Balloid.STEPS-1-1,d7
  683.  
  684. .segment_loop:
  685.     moveq    #Balloid.STEPS-1,d6
  686.  
  687. ; i, i+1, i+1+n, i+n -> i+n, i+1+n, i+1, i
  688. ; 0, 1, 2, 3 -> 3, 2, 1, 0
  689. .quad_loop:
  690.  
  691. ; First triangle (4,3,1).
  692.     move.w    #Polygon.TRI|Polygon.ENVMAPPED|0,(a0)+
  693.  
  694.     move.w    d7,d1
  695.     addq.w    #1,d1
  696.     mulu.w    #Balloid.STEPS,d1
  697.  
  698. ; v4
  699.     move.w    d6,d0
  700.     add.w    d1,d0    
  701.     addq.w    #1,d0
  702.     move.w    d0,(a0)+
  703.  
  704. ; v3
  705.     clr.l    d0
  706.     move.w    d6,d0
  707.     addq.w    #1,d0
  708.     divu.w    #Balloid.STEPS,d0
  709.     swap    d0
  710.     add.w    d1,d0    
  711.     addq.w    #1,d0
  712.     move.w    d0,(a0)+
  713.  
  714.     move.w    d7,d1
  715.     mulu.w    #Balloid.STEPS,d1
  716.  
  717. ; v1
  718.     move.w    d6,d0
  719.     add.w    d1,d0
  720.     addq.w    #1,d0
  721.     move.w    d0,(a0)+
  722.  
  723. ; Normal refs..
  724.     move.w    d7,d1
  725.     addq.w    #1,d1
  726.     mulu.w    #Balloid.STEPS,d1
  727.  
  728. ; v4
  729.     move.w    d6,d0
  730.     add.w    d1,d0    
  731.     addi.w    #Balloid.NUM_V+1,d0
  732.     move.w    d0,(a0)+
  733.  
  734. ; v3
  735.     clr.l    d0
  736.     move.w    d6,d0
  737.     addq.w    #1,d0
  738.     divu.w    #Balloid.STEPS,d0
  739.     swap    d0
  740.     add.w    d1,d0    
  741.     addi.w    #Balloid.NUM_V+1,d0
  742.     move.w    d0,(a0)+
  743.  
  744.     move.w    d7,d1
  745.     mulu.w    #Balloid.STEPS,d1
  746.  
  747. ; v1
  748.     move.w    d6,d0
  749.     add.w    d1,d0
  750.     addi.w    #Balloid.NUM_V+1,d0
  751.     move.w    d0,(a0)+
  752.  
  753. ; Second triangle.. (3,2,1).
  754.     IFNE    1
  755.  
  756.     move.w    #Polygon.TRI|Polygon.ENVMAPPED|0,(a0)+
  757.  
  758.     move.w    d7,d1
  759.     addq.w    #1,d1
  760.     mulu.w    #Balloid.STEPS,d1
  761.  
  762. ; v3
  763.     clr.l    d0
  764.     move.w    d6,d0
  765.     addq.w    #1,d0
  766.     divu.w    #Balloid.STEPS,d0
  767.     swap    d0
  768.     add.w    d1,d0
  769.     addq.w    #1,d0
  770.     move.w    d0,(a0)+
  771.  
  772.     move.w    d7,d1
  773.     mulu.w    #Balloid.STEPS,d1
  774.  
  775. ; v2
  776.     clr.l    d0
  777.     move.w    d6,d0
  778.     addq.w    #1,d0
  779.     divu.w    #Balloid.STEPS,d0
  780.     swap    d0
  781.     add.w    d1,d0    
  782.     addq.w    #1,d0
  783.     move.w    d0,(a0)+
  784.  
  785. ; v1
  786.     move.w    d6,d0
  787.     add.w    d1,d0
  788.     addq.w    #1,d0
  789.     move.w    d0,(a0)+
  790.  
  791. ; Normal refs..
  792.  
  793.     move.w    d7,d1
  794.     addq.w    #1,d1
  795.     mulu.w    #Balloid.STEPS,d1
  796.  
  797. ; v3
  798.     clr.l    d0
  799.     move.w    d6,d0
  800.     addq.w    #1,d0
  801.     divu.w    #Balloid.STEPS,d0
  802.     swap    d0
  803.     add.w    d1,d0    
  804.     addi.w    #Balloid.NUM_V+1,d0
  805.     move.w    d0,(a0)+
  806.  
  807.     move.w    d7,d1
  808.     mulu.w    #Balloid.STEPS,d1
  809.  
  810. ; v2
  811.     clr.l    d0
  812.     move.w    d6,d0
  813.     addq.w    #1,d0
  814.     divu.w    #Balloid.STEPS,d0
  815.     swap    d0
  816.     add.w    d1,d0    
  817.     addi.w    #Balloid.NUM_V+1,d0
  818.     move.w    d0,(a0)+
  819.  
  820. ; v1
  821.     move.w    d6,d0
  822.     add.w    d1,d0
  823.     addi.w    #Balloid.NUM_V+1,d0
  824.     move.w    d0,(a0)+
  825.  
  826.     ENDC
  827.  
  828.     dbra    d6,.quad_loop
  829.  
  830.     dbra    d7,.segment_loop
  831.  
  832. ; Output tail.
  833. ; t, t-n+[(i+1) mod n], t-n+i
  834. ; t=n*n+1
  835.     moveq    #Balloid.STEPS-1,d7
  836.  
  837. .tail_loop:
  838.     move.w    #Polygon.TRI|Polygon.ENVMAPPED|0,(a0)+
  839.     move.w    #Balloid.STEPS*Balloid.STEPS+1,(a0)+
  840.     clr.l    d0
  841.     move.w    d7,d0
  842.     addq.w    #1,d0
  843.     divu.w    #Balloid.STEPS,d0
  844.     swap    d0
  845.     addi.w    #1+Balloid.STEPS*(Balloid.STEPS-1),d0
  846.     move.w    d0,(a0)+
  847.     move.w    #1+Balloid.STEPS*(Balloid.STEPS-1),d0
  848.     add.w    d7,d0
  849.     move.w    d0,(a0)+
  850.  
  851. ; Normal refs.
  852.     move.w    #Balloid.NUM_V+Balloid.STEPS*Balloid.STEPS+1,(a0)+
  853.     clr.l    d0
  854.     move.w    d7,d0
  855.     addq.w    #1,d0
  856.     divu.w    #Balloid.STEPS,d0
  857.     swap    d0
  858.     addi.w    #Balloid.NUM_V+1+Balloid.STEPS*(Balloid.STEPS-1),d0
  859.     move.w    d0,(a0)+
  860.     move.w    #Balloid.NUM_V+1+Balloid.STEPS*(Balloid.STEPS-1),d0
  861.     add.w    d7,d0
  862.     move.w    d0,(a0)+
  863.  
  864.     dbra    d7,.tail_loop
  865.  
  866.     move.l    a0,d0
  867.     sub.l    a6,d0
  868.     rts
  869.  
  870. .time:    DC.W    0
  871.  
  872. ;======= OBJECT DATA ========
  873.  
  874.     DATA
  875.  
  876. Balloid.textureTable:
  877.     DC.L    FlareGen.goldBuffer
  878.     DC.L    0
  879.  
  880. Balloid.rectAddressTable:
  881.     DC.L    Balloid.rectangleTable
  882.     DC.L    Balloid.rectangleTable2
  883.     DC.L    Balloid.rectangleTable3
  884.  
  885. ;======= OBJECT RESERVES ========
  886.  
  887.     BSS
  888.  
  889. Balloid.rectangleTable:
  890.     DS.W    4*10
  891. Balloid.rectangleTable2:
  892.     DS.W    4*10
  893. Balloid.rectangleTable3:
  894.     DS.W    4*10
  895.  
  896. Balloid.x:
  897.     DS.W    1
  898. Balloid.z:
  899.     DS.W    1
  900. Balloid.time:
  901.     DS.W    1
  902. Balloid.startTime:
  903.     DS.W    1
  904. Balloid.moveStart:
  905.     DS.W    1
  906. Balloid.rotDir:
  907.     DS.W    1
  908. Balloid.worldRot:
  909.     DS.W    1
  910. Balloid.oldWorldRot:
  911.     DS.W    1
  912. Balloid.zoomOn:
  913.     DS.W    1
  914.  
  915. Balloid.baseAdr:
  916.     DS.L    1
  917.  
  918. Balloid.moveRout:
  919.     DS.L    1
  920.  
  921. ;======= END OF DEMO-EFFECT OBJECT ========