home *** CD-ROM | disk | FTP | other *** search
/ Fujiology Archive / fujiology_archive_v1_0.iso / !FALCON / LINEOUT / DELTA.ZIP / DELTASRC.ZIP / DELTA.SRC / HEMI.SO < prev    next >
Text File  |  2002-12-31  |  16KB  |  888 lines

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