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

  1. ; Human Flied sparkling. A screen for delta.
  2.  
  3. ;******* OBJECT TABLE ********
  4.  
  5. ; Must be first in object!!
  6. Sparkle.table:
  7.     DC.L    Sparkle.mainLoop
  8.     DC.L    Sparkle.init
  9.     DC.L    Sparkle.setRes
  10.     DC.L    Sparkle.setOneObject
  11.     DC.L    Sparkle.setScene
  12.     DC.L    Sparkle.rotate
  13.     DC.L    Sparkle.kickObjects            ; kick 'n kill
  14.     DC.L    Sparkle.killObjects
  15.     DC.L    0
  16.  
  17.     IFND    DEMO_SYSTEM
  18.     INCLUDE    SFLY_DSP.S                ; Include the CPU-DSP engine.
  19.     TEXT
  20.     INCLUDE    OBJECT3D.I
  21.     TEXT
  22.     ENDC
  23.  
  24. ;******* OBJECT EQUATES ********
  25.  
  26. Sparkle.GRAVITY:    =    0
  27.  
  28.             RSRESET
  29. Particle.ORG:        RS.B    Vertex.SIZE
  30. Particle.DIR:        RS.B    Vertex.SIZE
  31. Particle.BIRTH:        RS.W    1
  32. Particle.TTL:        RS.W    1
  33. Particle.SIZE:        RS.B    0
  34.  
  35. Sparkle.PARTICLES:    =    60            ; 60 for std falcon..
  36. Sparkle.DISTANCE:    =    3000
  37.  
  38. ;******* RESOLUTION SETTING ROUTINE ********
  39.  
  40. Sparkle.setRes:
  41.     IFEQ    testmode
  42.     move.w    monitormode,d0
  43.     cmpi.w    #vga60,d0
  44.     beq.s    .vga60
  45.     cmpi.w    #vga100,d0
  46.     beq.s    .vga100
  47.     cmpi.w    #rgb50,d0
  48.     beq.s    .rgb50
  49. ; Unknown monitormode..
  50.     rts
  51. .vga60:    bra.l    vga60_16bit_320_200
  52. .vga100:bra.l    vga100_16bit_320_200
  53. .rgb50:    bra.l    rgb50_16bit_320_200
  54.     ENDC
  55.     rts
  56.  
  57. ;******* INIT SUBROUTINE ********
  58.  
  59. ; OUTPUT:
  60. ; d0.l: =0 all clear, <0 error
  61. Sparkle.init:
  62.     lea    sine_tbl,a1
  63.     bsr.l    Matrix.init
  64.  
  65. .success:
  66.     moveq    #0,d0
  67.     rts
  68. .error:    moveq    #-1,d0
  69.     rts
  70.  
  71. ;******* REALTIME INIT SUBROUTINE ********
  72.  
  73. Sparkle.realtimeInit:
  74.     move.l    #rts,vbl_gfx
  75.  
  76.     bsr.l    HumanFly.init
  77.  
  78.     lea    Viewport.settingsTable,a0
  79.     move.w    #320,Viewport.XSCREEN(a0)
  80.     move.w    #200,Viewport.YSCREEN(a0)
  81.     move.w    #0,Viewport.XSTART(a0)
  82.     move.w    #0,Viewport.YSTART(a0)
  83.     move.w    #320,Viewport.XEND(a0)
  84.     move.w    #200,Viewport.YEND(a0)
  85.     move.w    #160,Viewport.XCENTER(a0)
  86.     move.w    #100,Viewport.YCENTER(a0)
  87.     move.w    #256+32,Viewport.ASPECT(a0)
  88.     move.w    #$100,Viewport.FOCAL(a0)
  89.     bsr.l    Viewport.update
  90.  
  91.     lea    Sparkle.textureTable,a0
  92.     bsr.l    Polygon.init
  93.  
  94.     move.l    #$3161FD21,random
  95.  
  96.     bsr.l    ObjectRegistry.clear
  97.  
  98.     IFNE    1
  99.  
  100.     lea    Object3d.spikey,a1
  101.     move.l    #Object3d.spikeyEnd-Object3d.spikey,d0
  102.     lea    Sparkle.spikey,a0
  103.     bsr.l    Object3d.copy
  104.  
  105.     lea    Sparkle.spikey,a0
  106.     move.w    #0,d0
  107.     move.w    #8,d1
  108.     move.w    $04BC.w,d2
  109.     Do_SinModulo    d2
  110.     Get_Sin    sine_tbl,d2,d2
  111.     asr.w    #8,d2
  112. ;    move.w    #$200/8,d2
  113.     bsr.l    Object3d.scale
  114.  
  115.     lea    Sparkle.spikey,a0
  116.     move.l    #Object3d.spikeyEnd-Object3d.spikey,d0
  117.     bsr.l    ObjectRegistry.set
  118.     tst.w    d0
  119.     bmi.s    .end
  120.  
  121.     ELSE
  122.  
  123.     lea    Sparkle.cube,a0
  124.     move.l    #Sparkle.cubeEnd-Sparkle.cube,d0
  125.     bsr.l    ObjectRegistry.set
  126.     tst.w    d0
  127.     bmi    .end
  128.  
  129.     ENDC
  130.  
  131.     lea    Sparkle.object,a0
  132.     bsr.w    Sparkle.generate
  133. ; d0.l=size of generated object
  134.     lea    Sparkle.object,a0
  135.     bsr.l    ObjectRegistry.set
  136.     tst.w    d0
  137.     bmi    .end
  138.  
  139.     bsr.l    flushAndDisableICache
  140.     move.w    #Primitive.WORD|Primitive.CEILADD,d0
  141.     moveq    #0,d1
  142.     bsr.l    Primitive.setPaintMode
  143.     bsr.l    restoreCache
  144.  
  145.     bsr.w    Sparkle.setOneObject
  146.     clr.w    Sparkle.rotateMode
  147.     clr.w    Sparkle.objectDead
  148.     clr.w    Sparkle.camMoving
  149.     clr.w    Sparkle.objectMoving
  150.  
  151. .end:    rts
  152.  
  153. ;******* MAINLOOP SUBROUTINE ********
  154.  
  155. Sparkle.mainLoop:
  156.     move.w    $0468.w,.old468
  157.  
  158.     movea.l    scr,a0
  159.     bsr.l    Primitive.setScreenbuffer
  160.  
  161.     move.l    frmcnt,d0
  162.     sub.l    lastframecount,d0
  163.     bne.s    .end_realtime_init
  164.     bsr.w    Sparkle.realtimeInit
  165. .end_realtime_init:
  166.  
  167.     lea    Viewport.settingsTable,a0
  168.     movem.w    Viewport.XSTART(a0),d0/d6
  169.     movem.w    Viewport.YSTART(a0),d1/d7
  170.     moveq    #$00000000,d4
  171.     bsr.l    Viewport.paintRectangle
  172.  
  173.     bsr.w    Sparkle.paint
  174.  
  175.     IFEQ    testmode
  176.     lea    scr,a0
  177.     move.l    (a0)+,d0
  178.     move.l    (a0)+,d1
  179.     move.l    (a0),-4(a0)
  180.     move.l    d0,(a0)
  181.     move.l    d1,-8(a0)
  182.     move.l    d0,d1
  183.     lsr.w    #8,d0
  184.     move.l    d0,$ffff8200.w
  185.     move.b    d1,$ffff820d.w
  186.     ENDC
  187.  
  188.     move.w    .old468(pc),d0
  189. .wait:    cmp.w    $0468.w,d0
  190.     beq.s    .wait
  191.  
  192.     move.l    frmcnt,d0
  193.     sub.l    lastframecount,d0
  194.     bne.s    .res_done
  195.     bsr.w    Sparkle.setRes
  196. .res_done:
  197.  
  198.     rts
  199.  
  200. .old468:DC.W    0
  201.  
  202. ;******* OBJECT SUBROUTINES ********
  203.  
  204. Sparkle.setOneObject:
  205.     move.l    #Sparkle.addOneObject,Sparkle.sceneRout
  206.     clr.w    Sparkle.circleMode
  207.     rts
  208.  
  209. Sparkle.setScene:
  210.     move.l    #Sparkle.addScene,Sparkle.sceneRout
  211.     st    Sparkle.circleMode
  212.     st    Sparkle.camMoving
  213.     move.w    $04BC.w,Sparkle.startTime
  214.     rts
  215.  
  216. Sparkle.rotate:
  217.     st    Sparkle.rotateMode
  218.     clr.w    Sparkle.camMoving
  219.     move.w    $04BC.w,Sparkle.rotStart
  220.     rts
  221.  
  222. Sparkle.kickObjects:
  223.     st    Sparkle.objectMoving
  224.     move.w    $04BC.w,Sparkle.moveStart
  225.     clr.w    Sparkle.camMoving
  226.     rts
  227.  
  228. Sparkle.killObjects:
  229.     move.w    $04BC.w,Sparkle.killStart
  230.     st    Sparkle.objectDead
  231.     rts
  232.  
  233. Sparkle.paint:
  234.  
  235.     IFNE    1
  236.  
  237.     bsr.l    ObjectRegistry.clear
  238.  
  239.     IFNE    1
  240.  
  241.     lea    Object3d.spikey,a1
  242.     move.l    #Object3d.spikeyEnd-Object3d.spikey,d0
  243.     lea    Sparkle.spikey,a0
  244.     bsr.l    Object3d.copy
  245.  
  246.     lea    Sparkle.spikey,a0
  247.     move.w    #0,d0
  248.     move.w    #8,d1
  249.     move.w    $04BC.w,d2
  250.     Do_SinModulo    d2
  251.     Get_Sin    sine_tbl,d2,d2
  252.     addi.w    #$8000,d2
  253.     lsr.w    #8,d2
  254.     lsr.w    d2
  255.     addi.w    #$0020,d2
  256.     bsr.l    Object3d.scale
  257.  
  258.     lea    Sparkle.spikey,a0
  259.     move.l    #Object3d.spikeyEnd-Object3d.spikey,d0
  260.     bsr.l    ObjectRegistry.set
  261.     tst.w    d0
  262.     bmi    .end
  263.  
  264.     ELSE
  265.  
  266.     lea    Sparkle.cube,a0
  267.     move.l    #Sparkle.cubeEnd-Sparkle.cube,d0
  268.     bsr.l    ObjectRegistry.set
  269.     tst.w    d0
  270.     bmi    .end
  271.  
  272.     ENDC
  273.  
  274.     lea    Sparkle.object,a0
  275.     bsr.w    Sparkle.generate
  276. ; d0.l=size of generated object
  277.     lea    Sparkle.object,a0
  278.     bsr.l    ObjectRegistry.set
  279.     tst.w    d0
  280.     bmi    .end
  281.  
  282.     ELSE
  283.  
  284.     lea    Sparkle.object,a0
  285.     bsr.w    Sparkle.generate
  286. ; d0.l=size of generated object
  287.     lea    Sparkle.object,a0
  288.     move.l    d0,d2
  289.     moveq    #1,d0                ; d0.w=handle
  290.     moveq    #%1001,d1            ; Replace vertices+prims only.
  291.     bsr.l    ObjectRegistry.replace
  292.     tst.w    d0
  293.     bmi    .end
  294.  
  295.     ENDC
  296.  
  297.     movea.l    Sparkle.sceneRout,a0
  298.     jmp    (a0)
  299.  
  300. .end:    rts
  301.  
  302. Sparkle.addOneObject:
  303.     bsr.l    PrimitiveMesh.new
  304.  
  305. ; Do cube.
  306.     move.w    $04BC.w,d0
  307.     move.w    d0,d1
  308.     move.w    d0,d2
  309.     mulu.w    #7,d0
  310.     lsr.l    #2,d0
  311.     mulu.w    #3,d1
  312.     mulu.w    #5,d2
  313.     bsr.l    Matrix.generate
  314.     clr.w    d0
  315.     clr.w    d1
  316.     move.w    #+Sparkle.DISTANCE,d2
  317.     bsr.l    Matrix.translate
  318.     bsr.l    Matrix.push
  319.     moveq    #TransformObject.BACKFACE_CULLING|TransformObject.PERSPECTIVATE,d0
  320.     moveq    #0,d1
  321.     bsr.l    TransformObject.transform
  322.     bsr.l    Matrix.pop
  323.  
  324. ; Do sparkles.
  325.     clr.w    d0
  326.     clr.w    d1
  327.     clr.w    d2
  328.     bsr.l    Matrix.generate
  329.     bsr.l    Matrix.push
  330.     moveq    #TransformObject.BACKFACE_CULLING|TransformObject.PERSPECTIVATE,d0
  331.     moveq    #1,d1
  332.     bsr.l    TransformObject.transform
  333.     bsr.l    Matrix.pop
  334.  
  335.     bsr.l    PrimitiveMesh.sortZ
  336.     bsr.l    PrimitiveMesh.complete
  337.  
  338.     movea.l    Sparkle.rectAddressTable,a0
  339.     bsr.l    PrimitiveMesh.paint
  340.  
  341.     lea    Sparkle.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. Sparkle.addScene:
  350.     bsr.l    PrimitiveMesh.new
  351.  
  352.     move.w    #Sparkle.DISTANCE,d0
  353.     tst.w    Sparkle.objectMoving
  354.     beq.s    .store
  355.     move.w    $04BC.w,d1
  356.     sub.w    Sparkle.moveStart,d1
  357.     lsl.w    #5,d1
  358.     add.w    d1,d0
  359. .store:    move.w    d0,.distance
  360.  
  361. ; alpha = arctan(y/z).
  362.     clr.l    d0
  363.     tst.w    Sparkle.camMoving
  364.     beq.s    .okay
  365.     move.w    $04BC.w,d0
  366.     bra.s    .end_time
  367. .okay:    move.w    Sparkle.rotStart,d0
  368. .end_time:
  369.     sub.w    Sparkle.startTime,d0
  370.     lsl.l    #2,d0
  371.     move.l    d0,d1                ; z
  372.     lsr.l    #2,d0                ; y
  373.     movem.w    d0-d1,-(sp)
  374.     bsr.l    Frac.atan2
  375. ; d1.w=rotation angle (rads)
  376.     mulu.l    #sintbllen/2,d1
  377.     divu.l    #31415,d1
  378.     mulu.l    #10000,d1            ; 3.1415 -> sinttblen/2
  379.     swap    d1
  380.     move.w    d1,d0
  381.  
  382. ; World rotation..
  383.     clr.w    d1
  384.     clr.w    d2
  385.     bsr.l    Matrix.generate
  386.     bsr.l    Matrix.push
  387.  
  388. ; World y-rotation and translation..
  389.     clr.w    d0
  390.     clr.w    d1
  391.     tst.w    Sparkle.rotateMode
  392.     beq.s    .no_rot
  393.     move.w    $04BC.w,d1
  394.     sub.w    Sparkle.rotStart,d1
  395.     mulu.w    #3,d1
  396.     lsr.l    d1
  397.     cmpi.w    #2*sintbllen,d1
  398.     blt.s    .rot_done
  399.     clr.w    Sparkle.rotateMode
  400.     clr.w    d1
  401. .rot_done:
  402.     neg.w    d1
  403. .no_rot:clr.w    d2
  404.     bsr.l    Matrix.generate
  405.     clr.w    d0
  406.     movem.w    (sp)+,d1-d2
  407.     bsr.l    Matrix.translate
  408.     bsr.l    Matrix.push
  409.  
  410.     tst.w    Sparkle.objectDead
  411.     bne    .end_objects
  412.  
  413. ; Do cube1.
  414.     move.w    $04BC.w,d0
  415.     move.w    d0,d1
  416.     move.w    d0,d2
  417.     mulu.w    #7,d0
  418.     lsr.l    #2,d0
  419.     mulu.w    #3,d1
  420.     neg.w    d1
  421.     mulu.w    #5,d2
  422.     bsr.l    Matrix.generate
  423.     clr.w    d0
  424.     clr.w    d1
  425.     move.w    .distance(pc),d2
  426.     bsr.l    Matrix.translate
  427.     bsr.l    Matrix.push
  428.     moveq    #TransformObject.BACKFACE_CULLING|TransformObject.PERSPECTIVATE,d0
  429.     moveq    #0,d1
  430.     bsr.l    TransformObject.transform
  431.     bsr.l    Matrix.pop
  432.  
  433. ; Do cube2.
  434.     move.w    $04BC.w,d0
  435.     move.w    d0,d1
  436.     move.w    d0,d2
  437.     mulu.w    #11,d0
  438.     lsr.l    d0
  439.     neg.w    d0
  440.     mulu.w    #7,d1
  441.     lsr.l    d1
  442.     mulu.w    #5,d2
  443.     bsr.l    Matrix.generate
  444.     clr.w    d2
  445.     clr.w    d1
  446.     move.w    .distance(pc),d0
  447.     bsr.l    Matrix.translate
  448.     bsr.l    Matrix.push
  449.     moveq    #TransformObject.BACKFACE_CULLING|TransformObject.PERSPECTIVATE,d0
  450.     moveq    #0,d1
  451.     bsr.l    TransformObject.transform
  452.     bsr.l    Matrix.pop
  453.  
  454. ; Do cube3.
  455.     move.w    $04BC.w,d0
  456.     move.w    d0,d1
  457.     move.w    d0,d2
  458.     mulu.w    #7,d0
  459.     mulu.w    #3,d1
  460.     mulu.w    #11,d2
  461.     lsr.l    d2
  462.     bsr.l    Matrix.generate
  463.     clr.w    d0
  464.     clr.w    d1
  465.     move.w    .distance(pc),d2
  466.     neg.w    d2
  467.     bsr.l    Matrix.translate
  468.     bsr.l    Matrix.push
  469.     moveq    #TransformObject.BACKFACE_CULLING|TransformObject.PERSPECTIVATE,d0
  470.     moveq    #0,d1
  471.     bsr.l    TransformObject.transform
  472.     bsr.l    Matrix.pop
  473.  
  474. ; Do cube4.
  475.     move.w    $04BC.w,d0
  476.     move.w    d0,d1
  477.     move.w    d0,d2
  478.     mulu.w    #11,d0
  479.     lsr.l    #2,d0
  480.     mulu.w    #3,d1
  481.     mulu.w    #13,d2
  482.     lsr.l    #2,d2
  483.     bsr.l    Matrix.generate
  484.     clr.w    d2
  485.     clr.w    d1
  486.     move.w    .distance(pc),d0
  487.     neg.w    d0
  488.     bsr.l    Matrix.translate
  489.     bsr.l    Matrix.push
  490.     moveq    #TransformObject.BACKFACE_CULLING|TransformObject.PERSPECTIVATE,d0
  491.     moveq    #0,d1
  492.     bsr.l    TransformObject.transform
  493.     bsr.l    Matrix.pop
  494. .end_objects:
  495.  
  496. ; Do sparkles.
  497.     clr.w    d0
  498.     clr.w    d1
  499.     clr.w    d2
  500.     bsr.l    Matrix.generate
  501.     bsr.l    Matrix.push
  502.     moveq    #TransformObject.BACKFACE_CULLING|TransformObject.PERSPECTIVATE,d0
  503.     moveq    #1,d1
  504.     bsr.l    TransformObject.transform
  505.     bsr.l    Matrix.pop
  506.  
  507.     bsr.l    Matrix.pop            ; Pop off world rotation.
  508.     bsr.l    Matrix.pop            ; Pop off world translation.
  509.  
  510.     bsr.l    PrimitiveMesh.sortZ
  511.     bsr.l    PrimitiveMesh.complete
  512.  
  513.     movea.l    Sparkle.rectAddressTable,a0
  514.     bsr.l    PrimitiveMesh.paint
  515.  
  516.     lea    Sparkle.rectAddressTable,a0
  517.      move.l    (a0)+,d0
  518.     move.l    (a0)+,d1
  519.     move.l    (a0),-(a0)
  520.     move.l    d0,4(a0)
  521.     move.l    d1,-(a0)
  522. .end:    rts
  523.  
  524. .distance:
  525.     DC.W    0
  526.  
  527. ; INPUT:
  528. ; a0: destination object
  529. ; OUTPUT:
  530. ; d0.l=size
  531. Sparkle.generate:
  532.     movea.l    a0,a6
  533.  
  534.     move.w    #Sparkle.PARTICLES,(a0)+        ; #vertices+#normals
  535.     clr.w    (a0)+                    ; #normals
  536.  
  537. ; 1) if actual particle is out of range (time-starttime >= ttl)
  538. ;   a) gen some random dirvector and store (hopefully not with 3d rots ajjj!)
  539. ;   b) calc scalar to unity, make this the ttl and store
  540. ;   c) store starttime
  541. ;   d) calc and store origin
  542. ; 2) calc actual position
  543.  
  544.     lea    Sparkle.particleTable,a1
  545.     move.w    #Sparkle.PARTICLES-1,d7
  546.     move.w    $04BC.w,.time
  547.  
  548. ; polar spiral! c(u,v) = r(u,v)*[sin(v)cos(u), cos(v), sin(v)sin(u)]
  549.     lea    sine_tbl,a2
  550.     tst.w    Sparkle.objectDead
  551.     beq.s    .normal_spiral
  552.  
  553. ; simple 2d traject here!
  554.     move.w    .time(pc),d5
  555.     move.w    d5,d4
  556.     mulu.w    #3,d4
  557.     lsr.l    #2,d4
  558.     Do_SinModulo    d4
  559.     Do_SinModulo    d5
  560.     Get_Sin    a2,d5,d1
  561.     Get_Sin    a2,d4,d2
  562.     asr.w    #4,d1
  563.     asr.w    #5,d2
  564.     clr.w    d3
  565.     movem.w    d1-d2,.simple
  566. ; Now calc the old traject and mix it.
  567.     bsr.w    .calc_spiral
  568.     move.w    $04BC.w,d0
  569.     sub.w    Sparkle.killStart,d0
  570.     cmpi.w    #$200,d0
  571.     blt.s    .killtime_ok
  572.     move.w    #$200,d0
  573. .killtime_ok:
  574.     movem.w    .simple(pc),d4-d5
  575.     muls.w    d0,d4
  576.     muls.w    d0,d5
  577.     subi.w    #$200,d0
  578.     neg.w    d0
  579.     muls.w    d0,d1
  580.     muls.w    d0,d2
  581.     muls.w    d0,d3
  582.     add.l    d4,d1
  583.     add.l    d5,d2
  584.     moveq    #9,d4
  585.     asr.l    d4,d1
  586.     asr.l    d4,d2
  587.     asr.l    d4,d3
  588.     bra.s    .center_calced
  589.  
  590. .normal_spiral:
  591.     bsr.w    .calc_spiral
  592.  
  593. .center_calced:
  594.     movem.w    d1-d3,.polar
  595.  
  596. .loop:    move.w    .time(pc),d0
  597.     move.w    d0,d1
  598.     sub.w    Particle.BIRTH(a1),d0
  599.     cmp.w    Particle.TTL(a1),d0
  600.     bls.w    .particle_alive
  601. ; Generate direction vector.
  602. ; Just ugly hardcode now.
  603. ; d1.w=time
  604.     move.w    d1,Particle.BIRTH(a1)
  605.  
  606. ; Calc origin.. todo: make this crossfade with dest traject.
  607.     movem.w    .polar(pc),d1-d3
  608.     movem.w    d1-d3,Particle.ORG(a1)
  609.  
  610.     bsr.l    getNextRandom
  611.     andi.w    #$01FF,d0
  612.     subi.w    #$0100,d0
  613.     move.w    d0,Particle.DIR+Vertex.X(a1)
  614.  
  615. ;    bsr.l    getNextRandom
  616.     swap    d0
  617.  
  618.     andi.w    #$01FF,d0
  619.     subi.w    #$0100,d0
  620.     move.w    d0,Particle.DIR+Vertex.Y(a1)
  621.     bsr.l    getNextRandom
  622.     andi.w    #$01FF,d0
  623.     subi.w    #$0100,d0
  624.     move.w    d0,Particle.DIR+Vertex.Z(a1)
  625.  
  626. ;    bsr.l    getNextRandom
  627.     swap    d0
  628.  
  629.     andi.w    #$003F,d0
  630.     addi.w    #$0060,d0
  631.     move.w    d0,Particle.TTL(a1)
  632.     clr.w    d0
  633. .particle_alive:
  634. ; d0.w=particle age
  635.     movem.w    Particle.DIR(a1),d1-d3
  636.     muls.w    d0,d1
  637.     muls.w    d0,d2
  638.     muls.w    d0,d3
  639.     asr.l    #6,d1
  640.     asr.l    #6,d2
  641.     asr.l    #6,d3
  642.  
  643. ; Now force it down with some gravity.
  644.     IFNE    Sparkle.GRAVITY
  645.     mulu.w    d0,d0
  646.     lsr.l    #5,d0
  647.     add.w    d0,d2
  648.     ENDC
  649.  
  650.     add.w    Particle.ORG+Vertex.X(a1),d1
  651.     add.w    Particle.ORG+Vertex.Y(a1),d2
  652.     add.w    Particle.ORG+Vertex.Z(a1),d3
  653.     move.w    d1,(a0)+
  654.     move.w    d2,(a0)+
  655.     move.w    d3,(a0)+
  656.     adda.w    #Particle.SIZE,a1
  657.     dbra    d7,.loop
  658.  
  659.     clr.w    (a0)+                    ; #texels
  660.  
  661.     move.w    #Sparkle.PARTICLES,(a0)+        ; #primitives
  662.     move.w    #Sparkle.PARTICLES-1,d7
  663.     lea    Sparkle.particleTable,a1
  664.     move.w    .time(pc),d1
  665.     clr.w    d2
  666.  
  667. .primloop:
  668.     clr.l    d0
  669.     move.w    d1,d0
  670.     sub.w    Particle.BIRTH(a1),d0
  671.     lsl.l    #3,d0
  672.     move.w    Particle.TTL(a1),d3
  673.     addq.w    #1,d3
  674.     divu.w    d3,d0
  675.     andi.w    #7,d0
  676.     addq.w    #1,d0                    ; Add sprite offset (skip texture).
  677.     move.w    #Primitive.SPRITETYPE,(a0)
  678.     or.w    d0,(a0)+
  679.     move.w    d2,(a0)+
  680.     adda.w    #Particle.SIZE,a1
  681.     addq.w    #1,d2
  682.     dbra    d7,.primloop
  683.     
  684.     move.l    a0,d0
  685.     sub.l    a6,d0
  686.     rts
  687.  
  688. ; OUTPUT:
  689. ; d1.w-d3.w=x,y,z
  690. .calc_spiral:
  691.     move.w    .time(pc),d0
  692.     move.w    d0,d1
  693.     move.w    d0,d2
  694.     mulu.w    #7,d1
  695. ;    lsr.l    d1
  696.     mulu.w    #23,d2
  697.     lsr.l    #4,d2
  698.     Do_SinModulo    d1            ; d1.w=u
  699.     Do_SinModulo    d2            ; d2.w=v
  700.     Get_SinCos    a2,d1,d1,d3        ; d1.w=sin(u), d3.w=cos(u)
  701.     Get_SinCos    a2,d2,d2,d4        ; d2.w=sin(v), d4.w=cos(v)
  702.     move.w    d2,d5
  703.     muls.w    d3,d5
  704.     add.l    d5,d5
  705.     swap    d5                ; d5.w=v.x=sin(v)cos(u)
  706.     move.w    d1,d6
  707.     muls.w    d2,d6
  708.     add.l    d6,d6
  709.     swap    d6                ; d6.w=v.z=sin(u)sin(v)
  710.     move.w    d5,d1                ; d1.w=v.x=sin(v)cos(u)
  711.     move.w    d4,d2                ; d2.w=v.y=cos(v)
  712.     move.w    d6,d3                ; d3.w=v.z=sin(u)sin(v)
  713.     muls.w    #1000*2,d1
  714.     muls.w    #1000*2,d2
  715.     muls.w    #1000*2,d3
  716.     swap    d1                ; d1.w=c.x=sin(v)cos(u)
  717.     swap    d2                ; d2.w=c.y=cos(v)
  718.     swap    d3                ; d3.w=c.z=sin(u)sin(v)
  719.  
  720. ; Shift center...
  721.     sub.w    Sparkle.startTime,d0
  722.     tst.w    Sparkle.circleMode
  723.     bne.s    .add_circle
  724.     clr.w    d0
  725. .add_circle:
  726.     mulu.w    #37,d0
  727.     lsr.l    #5,d0
  728.     neg.l    d0
  729.     Do_SinModulo    d0
  730.     Get_SinCos    a2,d0,d4,d5
  731.     muls.w    #Sparkle.DISTANCE*2,d4
  732.     muls.w    #Sparkle.DISTANCE*2,d5
  733.     swap    d4
  734.     swap    d5
  735.     add.w    d4,d1
  736.     add.w    d5,d3
  737.     rts
  738.  
  739. .time:    DC.W    0
  740. .polar:    DC.W    0,0,0
  741. .simple:DC.W    0,0,0
  742.  
  743. ;******* OBJECT DATA ********
  744.  
  745.     DATA
  746.  
  747. Sparkle.sprite:
  748.     INCBIN    MINIBALL.RLE
  749. Sparkle.sprite2:
  750.     INCBIN    MINIBAL2.RLE
  751. Sparkle.sprite3:
  752.     INCBIN    MINIBAL3.RLE
  753. Sparkle.sprite4:
  754.     INCBIN    MINIBAL4.RLE
  755. Sparkle.sprite5:
  756.     INCBIN    MINIBAL5.RLE
  757. Sparkle.sprite6:
  758.     INCBIN    MINIBAL6.RLE
  759. Sparkle.sprite7:
  760.     INCBIN    MINIBAL7.RLE
  761. Sparkle.sprite8:
  762.     INCBIN    MINIBAL8.RLE
  763.  
  764. Sparkle.textureTable:
  765.     DC.L    FlareGen.redBuffer
  766.     DC.L    Sparkle.sprite
  767.     DC.L    Sparkle.sprite2
  768.     DC.L    Sparkle.sprite3
  769.     DC.L    Sparkle.sprite4
  770.     DC.L    Sparkle.sprite5
  771.     DC.L    Sparkle.sprite6
  772.     DC.L    Sparkle.sprite7
  773.     DC.L    Sparkle.sprite8
  774.     DC.L    0
  775.  
  776. Sparkle.rectAddressTable:
  777.     DC.L    Sparkle.rectangleTable
  778.     DC.L    Sparkle.rectangleTable2
  779.     DC.L    Sparkle.rectangleTable3
  780.  
  781. Sparkle.cube:
  782.     DC.W    (.end-.start)/Vertex.SIZE    * amount of vertices
  783.     DC.W    (.end-.normstart)/Vertex.SIZE    * amount of normals
  784. .start:    DC.W    -400,-400,-400
  785.     DC.W    -400,400,-400
  786.     DC.W    400,-400,-400
  787.     DC.W    400,400,-400
  788.     DC.W    -400,-400,400
  789.     DC.W    -400,400,400
  790.     DC.W    400,-400,400
  791.     DC.W    400,400,400
  792. .normstart:
  793.     DC.W    -73,-73,-73
  794.     DC.W    -73,73,-73
  795.     DC.W    73,-73,-73
  796.     DC.W    73,73,-73
  797.     DC.W    -73,-73,73
  798.     DC.W    -73,73,73
  799.     DC.W    73,-73,73
  800.     DC.W    73,73,73
  801. .end:
  802.  
  803.     DC.W    0
  804.  
  805.     DC.W    6                * amount of primitives
  806.  
  807.     DC.W    Polygon.QUAD|Polygon.GOURAUDSHADED|0,+0,1,3,2,+1,1,127,127
  808.     DC.W    Polygon.QUAD|Polygon.GOURAUDSHADED|0,+6,7,5,4,+1,1,127,127
  809.     DC.W    Polygon.QUAD|Polygon.GOURAUDSHADED|1,+4,5,1,0,+1,1,127,127
  810.     DC.W    Polygon.QUAD|Polygon.GOURAUDSHADED|1,+2,3,7,6,+1,1,127,127
  811.     DC.W    Polygon.QUAD|Polygon.GOURAUDSHADED|2,+5,7,3,1,+1,1,127,127
  812.     DC.W    Polygon.QUAD|Polygon.GOURAUDSHADED|2,+4,0,2,6,+1,1,127,127
  813. Sparkle.cubeEnd:
  814.  
  815. ;******* OBJECT RESERVES ********
  816.  
  817.     BSS
  818.  
  819. Sparkle.rectangleTable:
  820.     DS.W    4*10
  821. Sparkle.rectangleTable2:
  822.     DS.W    4*10
  823. Sparkle.rectangleTable3:
  824.     DS.W    4*10
  825.  
  826. Sparkle.object:
  827.     DS.W    4096
  828. Sparkle.spikey:
  829.     DS.W    4096
  830.  
  831. Sparkle.particleTable:
  832.     DS.B    Particle.SIZE*Sparkle.PARTICLES
  833.  
  834. Sparkle.startTime:
  835.     DS.W    1
  836. Sparkle.moveStart:
  837.     DS.W    1
  838. Sparkle.sceneRout:
  839.     DS.L    1
  840. Sparkle.circleMode:
  841.     DS.W    1
  842. Sparkle.rotStart:
  843.     DS.W    1
  844. Sparkle.rotateMode:
  845.     DS.W    1
  846. Sparkle.objectMoving:
  847.     DS.W    1
  848. Sparkle.camMoving:
  849.     DS.W    1
  850. Sparkle.objectDead:
  851.     DS.W    1
  852. Sparkle.killStart:
  853.     DS.W    1
  854.  
  855. ;******* END OF DEMO-EFFECT OBJECT ********