home *** CD-ROM | disk | FTP | other *** search
/ Fujiology Archive / fujiology_archive_v1_0.iso / !FALCON / LINEOUT / DELTA.ZIP / DELTASRC.ZIP / DELTA.SRC / CONCH.SO < prev    next >
Text File  |  2002-12-21  |  33KB  |  1,664 lines

  1. ; A nautilus seashell disturbs the society of clambs.
  2. ; A screen for the delta demo using ufly.
  3.  
  4. ;======= OBJECT EQUATES ====================================================
  5.  
  6. Conch.BACKCOL:    =    $01EF01EF            ; $00$3C$78
  7.  
  8. ; clamb
  9. Conch.CL_RINGS:    =    4 5                ; #points in spiral
  10. Conch.CL_SPIRS:    =    6 8                ; #spirals
  11. Conch.CL_RADIUS:=    700                ; final length of spiral
  12. Conch.CL_ANGLE:    =    sintbllen/2            ; final angle of spiral
  13.  
  14. ; conch
  15. Conch.CO_RINGS:    =    24 24
  16. Conch.CO_SPIRS:    =    8 10
  17. Conch.CO_RADIUS:=    400                ; final length of spiral
  18. Conch.CO_ANGLE:    =    sintbllen*2            ; final angle of spiral
  19.  
  20. ; horn
  21. Conch.RINGS:    =    12                ; #points in spiral
  22. Conch.SPIRALS:    =    12                ; #spirals
  23. Conch.POINTS:    =    Conch.RINGS*Conch.SPIRALS
  24. Conch.POLYS:    =    (Conch.RINGS-1)*Conch.SPIRALS
  25. Conch.RADIUS:    =    400                ; final length of spiral
  26. Conch.ANGLE:    =    sintbllen*2            ; final angle of spiral
  27. Conch.ALPHA:    =    $2000                ; variance in spiral amp
  28.  
  29.             RSRESET
  30. Conch.conch:        RS.W    10000
  31. Conch.clamb:        RS.W    10000
  32. Conch.BLOCK_SIZE:    RS.B    0
  33.  
  34. ;======= OBJECT TABLE ======================================================
  35.  
  36. ; Must be first in object!!
  37. Conch.table:
  38.     DC.L    Conch.mainLoop
  39.     DC.L    Conch.init
  40.     DC.L    rts
  41.     DC.L    Conch.stopClambs
  42.     DC.L    Conch.startClambs
  43.     DC.L    Conch.setCloseUp
  44.     DC.L    Conch.endCloseUp
  45.     DC.L    Conch.setFadeIn
  46.     DC.L    0
  47.  
  48.     IFND    DEMO_SYSTEM
  49.     INCLUDE    SFLY_DSP.S                ; Include the CPU-DSP engine.
  50.     TEXT
  51.     ENDC
  52.  
  53. ;======= INIT SUBROUTINE ===================================================
  54.  
  55. ; OUTPUT:
  56. ; d0.l: 0   = All clear, neg = Error! Not initialized!
  57. Conch.init:
  58.     move.l    #Conch.BLOCK_SIZE,d0
  59.     bsr.l    Mem.register
  60.  
  61.     lea    sine_tbl,a1
  62.     bsr.l    Matrix.init
  63.  
  64. .success:
  65.     moveq    #0,d0
  66.     rts
  67. .error:    moveq    #-1,d0
  68.     rts
  69.  
  70. ;======= REALTIME INIT SUBROUTINE ==========================================
  71.  
  72. Conch.realtimeInit:
  73.     move.l    #rts,vbl_gfx
  74.  
  75.     bsr.l    Mem.getBlock
  76.  
  77.     move.l    d0,d1
  78.     addi.l    #Conch.conch,d1
  79.     move.l    d1,Conch.conchAdr
  80.     move.l    d0,d1
  81.     addi.l    #Conch.clamb,d1
  82.     move.l    d1,Conch.clambAdr
  83.  
  84.     bsr.l    HumanFly.init
  85.  
  86.     lea    Viewport.settingsTable,a0
  87.     move.w    #320,Viewport.XSCREEN(a0)
  88.     move.w    #200,Viewport.YSCREEN(a0)
  89.     move.w    #0,Viewport.XSTART(a0)
  90.     move.w    #0,Viewport.YSTART(a0)
  91.     move.w    #320,Viewport.XEND(a0)
  92.     move.w    #200,Viewport.YEND(a0)
  93.     move.w    #160,Viewport.XCENTER(a0)
  94.     move.w    #100,Viewport.YCENTER(a0)
  95.     move.w    #256+32,Viewport.ASPECT(a0)
  96.     move.w    #$100,Viewport.FOCAL(a0)
  97.     bsr.l    Viewport.update
  98.  
  99.     lea    Conch.textureTable,a0
  100.     lea    Conch.colorTable,a1
  101.     bsr.l    Polygon.init
  102.  
  103.     bsr.l    ObjectRegistry.clear
  104.  
  105.     move.w    #Conch.CL_RADIUS,d0
  106.     move.w    #Conch.CL_ANGLE,d1
  107.     move.w    #Conch.CL_SPIRS,d2
  108.     move.w    #Conch.CL_RINGS,d3
  109.     moveq    #1,d4
  110.     movea.l    Conch.clambAdr,a0
  111.     bsr.w    Conch.initTriClambObject
  112. ; d0.l=size of generated object
  113.     movea.l    Conch.clambAdr,a0
  114.     bsr.l    ObjectRegistry.set
  115.  
  116.     move.w    #Conch.CO_RADIUS,d0
  117.     move.w    #Conch.CO_ANGLE,d1
  118.     move.w    #Conch.CO_SPIRS,d2
  119.     move.w    #Conch.CO_RINGS,d3
  120.     moveq    #0,d4
  121.     movea.l    Conch.conchAdr,a0
  122.     bsr.w    Conch.initClambObject
  123. ; d0.l=size of generated object
  124.     movea.l    Conch.conchAdr,a0
  125.     bsr.l    ObjectRegistry.set
  126.  
  127.     lea    Conch.gradTable,a1
  128.     lea    Conch.backPal,a0
  129.     bsr.l    Pal.makeGradientHc
  130.  
  131.     bsr    Conch.setFadeIn
  132.  
  133.     move.w    monitormode,d0
  134.     cmpi.w    #vga60,d0
  135.     beq.s    .vga60
  136.     cmpi.w    #vga100,d0
  137.     beq.s    .vga100
  138.     cmpi.w    #rgb50,d0
  139.     beq.s    .rgb50
  140. ; Unknown monitormode..
  141.     rts
  142. .vga60:    move.l    #vga60_16bit_320_200,Conch.resRout
  143.     rts
  144. .vga100:move.l    #vga100_16bit_320_200,Conch.resRout
  145.     rts
  146. .rgb50:    move.l    #rgb50_16bit_320_200,Conch.resRout
  147.     rts
  148.  
  149. ;======= SCREENINIT SUBROUTINE =============================================
  150.  
  151. Conch.initScreen:
  152.     rts
  153.  
  154. ;======= MAINLOOP SUBROUTINE ===============================================
  155.  
  156. Conch.mainLoop:
  157.     movea.l    scr,a0
  158.     bsr.l    Primitive.setScreenbuffer
  159.  
  160.     move.l    frmcnt,d0
  161.     sub.l    lastframecount,d0
  162.     bne.s    .end_realtime_init
  163.     move.l    d0,-(sp)
  164.     bsr    Conch.realtimeInit
  165.     move.l    (sp)+,d0
  166. .end_realtime_init:
  167.     cmpi.l    #3,d0
  168.     bhs.s    .end_screeninit
  169.     bsr    Conch.initScreen
  170. .end_screeninit:
  171.  
  172.     move.w    $04BC.w,d0
  173.     sub.w    Conch.clambsStartTime,d0
  174.     move.w    d0,Conch.time
  175.     tst.w    Conch.clambsMoving
  176.     bne.s    .end_time_shit
  177.     clr.w    Conch.time
  178. .end_time_shit:
  179.  
  180.     movea.l    Conch.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    Conch.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    Conch.resRout
  197.     rts
  198.  
  199. ;======= OBJECT SUBROUTINES ================================================
  200.  
  201. Conch.stopClambs:
  202.     move.l    #Conch.paintScene,Conch.paintRout
  203.     move.w    $04BC.w,Conch.stillStartTime
  204.     clr.w    Conch.clambsMoving
  205.     rts
  206.  
  207. Conch.startClambs:
  208.     move.l    #Conch.paintScene,Conch.paintRout
  209.     move.w    #1,Conch.clambsMoving
  210.     move.w    $04BC.w,Conch.clambsStartTime
  211.     rts
  212.  
  213. Conch.setCloseUp:
  214.     move.l    #Conch.paint,Conch.paintRout
  215.     move.w    $04BC.w,Conch.closeStartTime
  216.     clr.w    Conch.closeMode
  217.     rts
  218.  
  219. Conch.endCloseUp:
  220.     move.l    #Conch.paint,Conch.paintRout
  221.     move.w    $04BC.w,Conch.closeStartTime
  222.     st    Conch.closeMode
  223.     rts
  224.  
  225. Conch.setFadeIn:
  226.     move.w    $04BC.w,Conch.startTime
  227.     move.l    #Conch.paintFade,Conch.paintRout
  228.     rts
  229.  
  230. Conch.paintScene:
  231.     tst.w    Conch.clambsMoving
  232.     bne.s    .swim_little_dolpin
  233.     bsr    Conch.paintStillClamb
  234.     bra.s    .end_paint
  235. .swim_little_dolpin:
  236.     bsr    Conch.paintSwimmingClamb
  237. .end_paint:
  238.     rts
  239.  
  240. ; Generates conch-like shell. This uses spirals with various slopes and
  241. ; heights. This one looks more like a horn sadly..
  242. ;
  243. ; parametrisation:
  244. ;
  245. ; parameters: 0<=t<angle, 0<=tau<2pi
  246. ; tau controls 'rings', t controls 'spirals'
  247. ;
  248. ; x=r*sin(t), y=r*cos(t), z=R*alpha*cos(tau)*t
  249. ; r=R[1+alpha*sin(tau)]*t
  250. ; R=final radius of spiral, alpha=variance in spiral (makes the cone)
  251. ;
  252. ; OUTPUT:
  253. ; d0.l=size of object
  254. Conch.init3dHornObject:
  255.     movea.l    Conch.conchAdr,a0
  256.     lea    sine_tbl,a1
  257.     move.w    #Conch.POINTS,(a0)+        ; Store #points+#normals.
  258.     clr.w    (a0)+
  259.     clr.w    d7
  260.  
  261. .spiral_loop:
  262.     moveq    #Conch.SPIRALS-1,d6
  263.  
  264. .ring_loop:
  265.     move.w    d6,d0
  266.     move.w    d7,d2
  267.  
  268. ; Calc sin(t), cos(t).
  269.     mulu.w    #Conch.ANGLE/Conch.RINGS,d2    ; d2.w=t
  270.     Do_SinModulo    d2
  271.     Get_SinCos    a1,d2,d2,d3
  272.  
  273. ; Calc sin(tau), cos(tau).
  274.     mulu.w    #sintbllen/Conch.SPIRALS,d0    ; d0.w=tau
  275.     Get_SinCos    a1,d0,d0,d1
  276.  
  277. ; Calc r.
  278.     muls.w    #Conch.ALPHA,d0
  279.     add.l    d0,d0
  280.     swap    d0                ; d0.w=alpha*sin(tau)
  281.     muls.w    #Conch.RADIUS,d0
  282.     add.l    d0,d0
  283.     swap    d0                ; d0.w=R*alpha*sin(tau)
  284.     addi.w    #Conch.RADIUS,d0        ; d0.w=R[1+alpha*sin(tau)]
  285.     mulu.w    d7,d0
  286.     divu.w    #Conch.RINGS,d0            ; d0.w=R[1+alpha*sin(tau)]*t
  287.  
  288. ; Calc (x,y) and store.
  289.     muls.w    d0,d2
  290.     muls.w    d0,d3
  291.     add.l    d2,d2
  292.     add.l    d3,d3
  293.     swap    d2
  294.     swap    d3
  295.     move.w    d2,(a0)+
  296.     move.w    d3,(a0)+
  297.  
  298. ; Calc z and store.
  299.     muls.w    d7,d1
  300.     divs.w    #Conch.RINGS,d1
  301.     muls.w    #Conch.ALPHA,d1
  302.     add.l    d1,d1
  303.     swap    d1
  304.     muls.w    #Conch.RADIUS,d1
  305.     add.l    d1,d1
  306.     swap    d1
  307.     move.w    d1,(a0)+
  308.  
  309.     dbf    d6,.ring_loop
  310.  
  311.     addq.w    #1,d7
  312.     cmpi.w    #Conch.RINGS,d7
  313.     blt.s    .spiral_loop
  314.  
  315. ; 2d
  316.     clr.w    (a0)+
  317.  
  318. ; polys
  319.     move.w    #Conch.POLYS,(a0)+
  320.     moveq    #Conch.RINGS-2,d7
  321.     
  322. ; Make a spiral..
  323. .poly_spiral_loop:
  324.     moveq    #Conch.SPIRALS-1,d6
  325.  
  326. ; Make a ring..
  327. .poly_ring_loop:
  328. ; Output polyhead.
  329.     move.w    #Polygon.QUAD|Polygon.FLATSHADED,d1
  330.     move.w    d7,d0
  331.     eor.w    d6,d0
  332.     andi.w    #1,d0
  333.     or.w    d0,d1
  334.     move.w    d1,(a0)+
  335.  
  336.     move.w    d7,d0
  337.     mulu.w    #Conch.SPIRALS,d0
  338. ; row*n + i
  339.     move.w    d0,d1
  340.     add.w    d6,d1
  341.     move.w    d1,(a0)+
  342. ; row*n + [(i+1) mod n]
  343.     clr.l    d1
  344.     move.w    d6,d1
  345.     addq.w    #1,d1
  346.     divu.w    #Conch.SPIRALS,d1
  347.     swap    d1
  348.     add.w    d0,d1
  349.     move.w    d1,(a0)+
  350. ; row*(n+1) + [(i+1) mod n]
  351.     addi.w    #Conch.SPIRALS,d1
  352.     move.w    d1,(a0)+
  353. ; row*(n+1) + i
  354.     move.w    d0,d1
  355.     add.w    d6,d1
  356.     addi.w    #Conch.SPIRALS,d1
  357.     move.w    d1,(a0)+
  358.  
  359.     dbf    d6,.poly_ring_loop
  360.  
  361.     dbf    d7,.poly_spiral_loop
  362.  
  363. ; Calc size..
  364.     suba.l    Conch.conchAdr,a0
  365.     move.l    a0,d0
  366.     rts
  367.  
  368. ; Generates conch-like shell. This is a gapless one.
  369. ; Can be used to make both conch and clambs depending on angle.
  370. ;
  371. ; parametrisation:
  372. ;
  373. ; parameters: 0<=t<angle, 0<=tau<2pi
  374. ; tau controls position in 'ring', t controls position in 'spiral'
  375. ;
  376. ; if t<2pi:
  377. ;
  378. ; r(t,tau) = r1(t,tau)
  379. ;
  380. ; else
  381. ;
  382. ; r(t,tau) = r2(t,tau)
  383. ; x = r(t,tau)*sin(t), n.x=sin(tau)*sin(t)
  384. ; y = r(t,tau)*cos(t), n.y=sin(tau)*cos(t)
  385. ; z = R*cos(tau)/2,    n.z=cos(tau)
  386. ;
  387. ;              1+sin(tau)     R*t
  388. ; r1(t,tau) = ------------ * -----
  389. ;                  2          2pi
  390. ;
  391. ; r2(t,tau)=R[t/2pi-1+(1+sin(tau))/2]
  392. ;
  393. ; R=radius of spiral when t=2pi
  394. ;
  395. ; INPUT:
  396. ; d0.w=radius
  397. ; d1.w=angle
  398. ; d2.w=spirals
  399. ; d3.w=rings
  400. ; d4.w=inside generation (=0:no, >0:yes)
  401. ; a0: dst u-fly obj
  402. ; OUTPUT:
  403. ; d0.l=size of object
  404. Conch.initClambObject:
  405.     movea.l    a0,a6
  406.     move.w    d0,.radius
  407.     move.w    d1,.angle
  408.     move.w    d2,.spirals
  409.     move.w    d3,.rings
  410.     move.w    d4,.inside
  411.  
  412.     lea    sine_tbl,a1
  413.     move.w    .rings(pc),d0
  414.     mulu.w    .spirals(pc),d0
  415.     move.w    d0,.points
  416.     move.w    d0,(a0)
  417.     add.w    d0,(a0)+            ; Store #points+#normals.
  418.     move.w    d0,(a0)+            ; Store #normals
  419.     mulu.w    #Vertex.SIZE,d0
  420.     lea    (a0,d0.l),a2            ; a2: normals
  421.     clr.w    d7
  422.  
  423. .spiral_loop:
  424.     move.w    .spirals(pc),d6
  425.     subq.w    #1,d6
  426.  
  427. .ring_loop:
  428.     move.w    d6,d0
  429.     move.w    d7,d2
  430.  
  431. ; Calc sin(t), cos(t).
  432.     mulu.w    .angle(pc),d2
  433.     move.w    .rings(pc),d3
  434.     subq.w    #1,d3
  435.     divu.w    d3,d2                ; d2.w=t
  436.     move.w    d2,d4                ; d4.w=t
  437.     Do_SinModulo    d2            ; d2.w=t mod 2pi
  438.     Get_SinCos    a1,d2,d2,d3
  439. ; d2.w=sin(t), d3.w=cos(t)
  440.  
  441. ; Calc sin(tau), cos(tau).
  442.     mulu.w    #sintbllen,d0
  443.     divu.w    .spirals(pc),d0            ; d0.w=tau
  444.     Get_SinCos    a1,d0,d0,d1
  445. ; d0.w=sin(tau), d1.w=cos(tau)
  446.  
  447. ; Store normal.
  448.     move.w    d2,d5
  449.     muls.w    d0,d5
  450.     add.l    d5,d5
  451.     swap    d5
  452.     ext.l    d5
  453.     divs.w    #257,d5
  454.     move.w    d5,(a2)+            ; Store n.x.
  455.     move.w    d3,d5
  456.     muls.w    d0,d5
  457.     add.l    d5,d5
  458.     swap    d5
  459.     ext.l    d5
  460.     divs.w    #257,d5
  461.     move.w    d5,(a2)+            ; Store n.y.
  462.     move.w    d1,d5
  463.     ext.l    d5
  464.     divs.w    #257,d5
  465.     move.w    d5,(a2)+            ; Store n.z.
  466.  
  467. ; Calculate r(t,tau) function.. all shit is positive!
  468.     addi.l    #$8000,d0            ; d0.w=[sin(tau)+1]/2 (frac)
  469. ; t<2pi ??
  470.     cmpi.w    #sintbllen,d4
  471.     bhs.s    .t_is_high
  472.     mulu.w    d4,d0                ; d0.l=t*[sin(tau)+1]/2 (16:16)
  473.     divu.w    #sintbllen,d0            ; d0.w=t*[sin(tau)+1]/2*2pi (frac)
  474.     mulu.w    .radius(pc),d0            ; d0.l=R*t*[sin(tau)+1]/2*2pi (16:16)
  475.     swap    d0                ; d0.w=r1(t,tau) (int)
  476.     bra.s    .end_calc_r
  477. ; t is hi. calc r2..
  478. .t_is_high:
  479.     move.w    d4,d5
  480.     subi.w    #sintbllen,d5
  481.     mulu.w    #$10000/sintbllen,d5        ; d5.l=t/2pi-1 (16:16)
  482.     add.l    d5,d0                ; d0.l=t/2pi-1+[sin(tau)+1]/2 (16:16)
  483.     lsr.l    #8,d0
  484.     mulu.w    .radius(pc),d0
  485.     lsr.l    #8,d0                ; d0.w=r2(t,tau) (int)
  486.  
  487. ; Make sure spiral joins. No gaps!
  488.     mulu.w    #$00E8,d0
  489.     lsr.l    #8,d0
  490.  
  491. .end_calc_r:
  492. ; d0.w=r(t,tau) (int)
  493.  
  494. ; Calc (x,y) and store.
  495.     muls.w    d0,d2
  496.     muls.w    d0,d3
  497.     add.l    d2,d2
  498.     add.l    d3,d3
  499.     swap    d2                ; d2.w=r(t,tau)*sin(t)
  500.     swap    d3                ; d3.w=r(t,tau)*cos(t)
  501.     move.w    d2,(a0)+
  502.     move.w    d3,(a0)+
  503.  
  504. ; Calc z and store.
  505.     muls.w    d4,d1
  506.     divs.w    .angle(pc),d1
  507.     muls.w    .radius(pc),d1            ; d1.l=R*cos(tau)/2 (16:16)
  508.     swap    d1                ; d1.w=R*cos(tau)/2 (int)
  509.     move.w    d1,(a0)+
  510.  
  511.     dbf    d6,.ring_loop
  512.  
  513.     addq.w    #1,d7
  514.     cmp.w    .rings(pc),d7
  515.     blt    .spiral_loop
  516.  
  517.     movea.l    a2,a0                ; a0: texels
  518.  
  519. ; texels
  520.     clr.w    (a0)+
  521.  
  522. ; polys
  523.     move.w    .rings(pc),d0
  524.     subq.w    #1,d0
  525.     mulu.w    .spirals(pc),d0
  526.     tst.w    .inside(pc)
  527.     beq.s    .no_inside
  528.     add.w    d0,d0                ; d0.w=#frontpolys+#backpolys
  529. .no_inside:
  530.     move.w    d0,(a0)+            ; Store #polys.
  531.     move.w    .rings(pc),d7
  532.     subq.w    #2,d7
  533.     
  534. ; Make a spiral..
  535. .poly_spiral_loop:
  536.     move.w    .spirals(pc),d6
  537.     subq.w    #1,d6
  538.  
  539. ; Make a ring..
  540. .poly_ring_loop:
  541. ; Output polyhead.
  542.     move.w    #Polygon.QUAD|Polygon.GOURAUDSHADED|3,(a0)+
  543.  
  544. ; Vertex refs.
  545.     move.w    d7,d0
  546.     mulu.w    .spirals(pc),d0
  547. ; row*n + i
  548.     move.w    d0,d1
  549.     add.w    d6,d1
  550.     move.w    d1,(a0)+
  551. ; row*n + [(i+1) mod n]
  552.     clr.l    d1
  553.     move.w    d6,d1
  554.     addq.w    #1,d1
  555.     divu.w    .spirals(pc),d1
  556.     swap    d1
  557.     add.w    d0,d1
  558.     move.w    d1,(a0)+
  559. ; row*(n+1) + [(i+1) mod n]
  560.     add.w    .spirals(pc),d1
  561.     move.w    d1,(a0)+
  562. ; row*(n+1) + i
  563.     move.w    d0,d1
  564.     add.w    d6,d1
  565.     add.w    .spirals(pc),d1
  566.     move.w    d1,(a0)+
  567.  
  568. ; Gouraud indices.
  569.     move.l    #$00100010,(a0)+
  570.     move.l    #$00300030,(a0)+
  571.  
  572.     dbf    d6,.poly_ring_loop
  573.  
  574.     dbf    d7,.poly_spiral_loop
  575.  
  576.     tst.w    .inside(pc)
  577.     beq    .end
  578.  
  579. ; Output backface polys (parelmoer).
  580.     move.w    .rings(pc),d7
  581.     subq.w    #2,d7
  582.     
  583. ; Make a spiral..
  584. .bpoly_spiral_loop:
  585.     move.w    .spirals(pc),d6
  586.     subq.w    #1,d6
  587.  
  588. ; Make a ring..
  589. .bpoly_ring_loop:
  590. ; Output polyhead.
  591.     move.w    #Polygon.QUAD|Polygon.ENVMAPPED|0,(a0)+
  592.  
  593. ; Vertex refs.
  594.     move.w    d7,d0
  595.     mulu.w    .spirals(pc),d0            ; d0.w=row*n
  596. ; row*n + [(i+1) mod n]
  597.     clr.l    d1
  598.     move.w    d6,d1
  599.     addq.w    #1,d1
  600.     divu.w    .spirals(pc),d1
  601.     swap    d1
  602.     move.w    d1,d2                ; d2.w=(i+1) mod n
  603.     add.w    d0,d1
  604.     move.w    d1,(a0)+
  605. ; row*n + i
  606.     move.w    d6,d1
  607.     add.w    d0,d1
  608.     move.w    d1,(a0)+
  609. ; row*(n+1) + i
  610.     add.w    .spirals(pc),d1
  611.     move.w    d1,(a0)+
  612. ; row*(n+1) + [(i+1) mod n]
  613.     move.w    d0,d1
  614.     add.w    .spirals(pc),d1
  615.     add.w    d2,d1
  616.     move.w    d1,(a0)+
  617.  
  618. ; Store normal refs.
  619.     REPT    4
  620.     move.w    -8(a0),d0
  621.     add.w    .points(pc),d0
  622.     move.w    d0,(a0)+
  623.     ENDR
  624.  
  625.     dbf    d6,.bpoly_ring_loop
  626.  
  627.     dbf    d7,.bpoly_spiral_loop
  628.  
  629. ; Calc size..
  630. .end:    suba.l    a6,a0
  631.     move.l    a0,d0
  632.     rts
  633.  
  634. .radius:DC.W    0
  635. .angle:    DC.W    0
  636. .spirals:
  637.     DC.W    0
  638. .rings:    DC.W    0
  639. .inside:DC.W    0
  640. .points:DC.W    0
  641.  
  642. ; Generates conch-like shell. This is a gapless one.
  643. ; Can be used to make both conch and clambs depending on angle.
  644. ;
  645. ; parametrisation:
  646. ;
  647. ; parameters: 0<=t<angle, 0<=tau<2pi
  648. ; tau controls position in 'ring', t controls position in 'spiral'
  649. ;
  650. ; if t<2pi:
  651. ;
  652. ; r(t,tau) = r1(t,tau)
  653. ;
  654. ; else
  655. ;
  656. ; r(t,tau) = r2(t,tau)
  657. ; x = r(t,tau)*sin(t), n.x=sin(tau)*sin(t)
  658. ; y = r(t,tau)*cos(t), n.y=sin(tau)*cos(t)
  659. ; z = R*cos(tau)/2,    n.z=cos(tau)
  660. ;
  661. ;              1+sin(tau)     R*t
  662. ; r1(t,tau) = ------------ * -----
  663. ;                  2          2pi
  664. ;
  665. ; r2(t,tau)=R[t/2pi-1+(1+sin(tau))/2]
  666. ;
  667. ; R=radius of spiral when t=2pi
  668. ;
  669. ; INPUT:
  670. ; d0.w=radius
  671. ; d1.w=angle
  672. ; d2.w=spirals
  673. ; d3.w=rings
  674. ; d4.w=inside generation (=0:no, >0:yes)
  675. ; a0: dst u-fly obj
  676. ; OUTPUT:
  677. ; d0.l=size of object
  678. Conch.initTriClambObject:
  679.     movea.l    a0,a6
  680.     move.w    d0,.radius
  681.     move.w    d1,.angle
  682.     move.w    d2,.spirals
  683.     move.w    d3,.rings
  684.     move.w    d4,.inside
  685.  
  686.     lea    sine_tbl,a1
  687.     move.w    .rings(pc),d0
  688.     mulu.w    .spirals(pc),d0
  689.     move.w    d0,.points
  690.     move.w    d0,(a0)
  691.     add.w    d0,(a0)+            ; Store #points+#normals.
  692.     move.w    d0,(a0)+            ; Store #normals
  693.     mulu.w    #Vertex.SIZE,d0
  694.     lea    (a0,d0.l),a2            ; a2: normals
  695.     clr.w    d7
  696.  
  697. .spiral_loop:
  698.     move.w    .spirals(pc),d6
  699.     subq.w    #1,d6
  700.  
  701. .ring_loop:
  702.     move.w    d6,d0
  703.     move.w    d7,d2
  704.  
  705. ; Calc sin(t), cos(t).
  706.     mulu.w    .angle(pc),d2
  707.     move.w    .rings(pc),d3
  708.     subq.w    #1,d3
  709.     divu.w    d3,d2                ; d2.w=t
  710.     move.w    d2,d4                ; d4.w=t
  711.     Do_SinModulo    d2            ; d2.w=t mod 2pi
  712.     Get_SinCos    a1,d2,d2,d3
  713. ; d2.w=sin(t), d3.w=cos(t)
  714.  
  715. ; Calc sin(tau), cos(tau).
  716.     mulu.w    #sintbllen,d0
  717.     divu.w    .spirals(pc),d0            ; d0.w=tau
  718.     Get_SinCos    a1,d0,d0,d1
  719. ; d0.w=sin(tau), d1.w=cos(tau)
  720.  
  721. ; Store normal.
  722.     move.w    d2,d5
  723.     muls.w    d0,d5
  724.     add.l    d5,d5
  725.     swap    d5
  726.     ext.l    d5
  727.     divs.w    #257,d5
  728.     move.w    d5,(a2)+            ; Store n.x.
  729.     move.w    d3,d5
  730.     muls.w    d0,d5
  731.     add.l    d5,d5
  732.     swap    d5
  733.     ext.l    d5
  734.     divs.w    #257,d5
  735.     move.w    d5,(a2)+            ; Store n.y.
  736.     move.w    d1,d5
  737.     ext.l    d5
  738.     divs.w    #257,d5
  739.     move.w    d5,(a2)+            ; Store n.z.
  740.  
  741. ; Calculate r(t,tau) function.. all shit is positive!
  742.     addi.l    #$8000,d0            ; d0.w=[sin(tau)+1]/2 (frac)
  743. ; t<2pi ??
  744.     cmpi.w    #sintbllen,d4
  745.     bhs.s    .t_is_high
  746.     mulu.w    d4,d0                ; d0.l=t*[sin(tau)+1]/2 (16:16)
  747.     divu.w    #sintbllen,d0            ; d0.w=t*[sin(tau)+1]/2*2pi (frac)
  748.     mulu.w    .radius(pc),d0            ; d0.l=R*t*[sin(tau)+1]/2*2pi (16:16)
  749.     swap    d0                ; d0.w=r1(t,tau) (int)
  750.     bra.s    .end_calc_r
  751. ; t is hi. calc r2..
  752. .t_is_high:
  753.     move.w    d4,d5
  754.     subi.w    #sintbllen,d5
  755.     mulu.w    #$10000/sintbllen,d5        ; d5.l=t/2pi-1 (16:16)
  756.     add.l    d5,d0                ; d0.l=t/2pi-1+[sin(tau)+1]/2 (16:16)
  757.     lsr.l    #8,d0
  758.     mulu.w    .radius(pc),d0
  759.     lsr.l    #8,d0                ; d0.w=r2(t,tau) (int)
  760.  
  761. ; Make sure spiral joins. No gaps!
  762.     mulu.w    #$00E8,d0
  763.     lsr.l    #8,d0
  764.  
  765. .end_calc_r:
  766. ; d0.w=r(t,tau) (int)
  767.  
  768. ; Calc (x,y) and store.
  769.     muls.w    d0,d2
  770.     muls.w    d0,d3
  771.     add.l    d2,d2
  772.     add.l    d3,d3
  773.     swap    d2                ; d2.w=r(t,tau)*sin(t)
  774.     swap    d3                ; d3.w=r(t,tau)*cos(t)
  775.     move.w    d2,(a0)+
  776.     move.w    d3,(a0)+
  777.  
  778. ; Calc z and store.
  779.     muls.w    d4,d1
  780.     divs.w    .angle(pc),d1
  781.     muls.w    .radius(pc),d1            ; d1.l=R*cos(tau)/2 (16:16)
  782.     swap    d1                ; d1.w=R*cos(tau)/2 (int)
  783.     move.w    d1,(a0)+
  784.  
  785.     dbf    d6,.ring_loop
  786.  
  787.     addq.w    #1,d7
  788.     cmp.w    .rings(pc),d7
  789.     blt    .spiral_loop
  790.  
  791.     movea.l    a2,a0                ; a0: texels
  792.  
  793. ; texels
  794.     clr.w    (a0)+
  795.  
  796. ; polys
  797.     move.w    .rings(pc),d0
  798.     subq.w    #1,d0
  799.     mulu.w    .spirals(pc),d0
  800.     tst.w    .inside(pc)
  801.     beq.s    .no_inside
  802.     add.w    d0,d0                ; d0.w=#frontpolys+#backpolys
  803. .no_inside:
  804.     add.w    d0,d0                ; d0.w=#tris=#quads*2
  805.     move.w    d0,(a0)+            ; Store #polys.
  806.     move.w    .rings(pc),d7
  807.     subq.w    #2,d7
  808.     movea.l    a0,a2                ; a2: polys
  809.     
  810. ; Make a spiral..
  811. .poly_spiral_loop:
  812.     move.w    .spirals(pc),d6
  813.     subq.w    #1,d6
  814.  
  815. ; Make a ring..
  816. .poly_ring_loop:
  817. ; Output polyhead.
  818.     move.w    #Polygon.TRI|Polygon.GOURAUDSHADED|3,(a0)+
  819. ; Vertex refs.
  820.     move.w    d7,d0
  821.     mulu.w    .spirals(pc),d0
  822. ; row*n + i, 0
  823.     move.w    d0,d1
  824.     add.w    d6,d1
  825.     move.w    d1,(a0)+
  826.     move.w    d1,d2
  827. ; row*n + [(i+1) mod n], 1
  828.     clr.l    d1
  829.     move.w    d6,d1
  830.     addq.w    #1,d1
  831.     divu.w    .spirals(pc),d1
  832.     swap    d1
  833.     add.w    d0,d1
  834.     move.w    d1,(a0)+
  835.     move.w    d1,d3
  836. ; row*(n+1) + [(i+1) mod n], 2
  837.     add.w    .spirals(pc),d1
  838.     move.w    d1,(a0)+
  839.     move.w    d1,d4
  840.  
  841. ; Gouraud indices. 0,1,2
  842.     move.l    #$00100010,(a0)+
  843.     move.w    #$0030,(a0)+
  844.  
  845. ; 0,2,3
  846.     move.w    #Polygon.TRI|Polygon.GOURAUDSHADED|3,(a0)+
  847.     move.w    d2,(a0)+            ; 0
  848.     move.w    d4,(a0)+            ; 2
  849. ; row*(n+1) + i, 3
  850.     move.w    d0,d1
  851.     add.w    d6,d1
  852.     add.w    .spirals(pc),d1
  853.     move.w    d1,(a0)+
  854.  
  855. ; Gouraud indices. 0,2,3
  856.     move.w    #$0010,(a0)+
  857.     move.l    #$00300030,(a0)+
  858.  
  859.     dbf    d6,.poly_ring_loop
  860.  
  861.     dbf    d7,.poly_spiral_loop
  862.  
  863.     tst.w    .inside(pc)
  864.     beq    .end
  865.  
  866. ; Output backface polys (parelmoer).
  867.     move.w    .rings(pc),d7
  868.     subq.w    #1,d7
  869.     mulu.w    .spirals(pc),d7
  870.     add.l    d7,d7
  871.     
  872. .bpoly_loop:
  873.  
  874. ; Output polyhead.
  875.     move.w    #Polygon.TRI|Polygon.ENVMAPPED|0,(a0)+
  876.     addq    #2,a2
  877.  
  878. ; Vertex refs.
  879.     move.w    0(a2),(a0)+
  880.     move.w    4(a2),(a0)+
  881.     move.w    2(a2),(a0)+
  882.  
  883. ; Normal indices.
  884.     REPT    3
  885.     move.w    -6(a0),d1
  886.     add.w    .points(pc),d1
  887.     move.w    d1,(a0)+
  888.     ENDR
  889.  
  890.     adda.w    #Vertex.SIZE*2,a2
  891.     dbf    d7,.bpoly_loop
  892.  
  893. ; Calc size..
  894. .end:    suba.l    a6,a0
  895.     move.l    a0,d0
  896.     rts
  897.  
  898. .radius:DC.W    0
  899. .angle:    DC.W    0
  900. .spirals:
  901.     DC.W    0
  902. .rings:    DC.W    0
  903. .inside:DC.W    0
  904. .points:DC.W    0
  905.  
  906. ; Just fades a backgroundcolor.
  907. Conch.paintFade:
  908.     lea    Viewport.settingsTable,a0
  909.     movem.w    Viewport.XSTART(a0),d0/d6
  910.     movem.w    Viewport.YSTART(a0),d1/d7
  911.     move.w    $04BC.w,d4
  912.     sub.w    Conch.startTime,d4
  913.     lsr.w    #2,d4
  914.     cmpi.w    #63,d4
  915.     blt.s    .ok
  916.     moveq    #63,d4
  917. .ok:    move.w    (Conch.backPal,d4.w*2),d4
  918.     move.w    d4,d2
  919.     swap    d4
  920.     move.w    d2,d4
  921.     bsr.l    Viewport.paintRectangle
  922.     rts
  923.  
  924. ; Paint seashell.
  925. Conch.paint:
  926.     bsr.l    PrimitiveMesh.new
  927.  
  928. ; world rot
  929.     move.w    $04BC.w,d0
  930.     move.w    d0,d1
  931.     move.w    d0,d2
  932.     mulu.w    #3,d0
  933.     lsr.l    d0
  934.     mulu.w    #13,d1
  935.     lsr.l    #3,d1
  936.     mulu.w    #7,d2
  937.     lsr.l    #2,d2
  938.     bsr.l    Matrix.generate
  939.     clr.w    d0
  940.  
  941.     move.w    $04BC.w,d1
  942.     sub.w    Conch.closeStartTime,d1
  943.     tst.w    Conch.closeMode
  944.     bne.s    .second_mode
  945.     subi.w    #300,d1
  946.     bmi.s    .y_ok
  947.     clr.w    d1
  948. .y_ok:    muls.w    d1,d1
  949.     lsr.l    #6,d1
  950.     bra.s    .y_calced
  951. .second_mode:
  952.     muls.w    d1,d1
  953.     lsr.l    #6,d1
  954.     neg.w    d1
  955. .y_calced:
  956.  
  957.     move.w    #2000,d2
  958.     bsr.l    Matrix.translate
  959.     bsr.l    Matrix.push
  960.  
  961. ; top clamb
  962.     clr.w    d0
  963.     clr.w    d1
  964.     move.w    #sintbllen/10,d2
  965.     bsr.l    Matrix.generate
  966.     bsr.l    Matrix.push
  967.     moveq    #TransformObject.BACKFACE_CULLING|TransformObject.PERSPECTIVATE,d0
  968.     moveq    #0,d1
  969.     bsr.l    TransformObject.transform
  970.     bsr.l    Matrix.pop
  971.  
  972. ; bottom clamb
  973.     clr.w    d0
  974.     move.w    #sintbllen/2,d1
  975.     move.w    #sintbllen/10,d2
  976.     bsr.l    Matrix.generate
  977.     bsr.l    Matrix.push
  978.     moveq    #TransformObject.BACKFACE_CULLING|TransformObject.PERSPECTIVATE,d0
  979.     moveq    #0,d1
  980.     bsr.l    TransformObject.transform
  981.     bsr.l    Matrix.pop
  982.  
  983.     bsr.l    Matrix.pop            ; pop world rot
  984.  
  985.     bsr.l    PrimitiveMesh.sortZ
  986.  
  987.     bsr.l    PrimitiveMesh.complete
  988.  
  989.     IFNE    0
  990.     lea    Viewport.settingsTable,a0
  991.     movem.w    Viewport.XSTART(a0),d0/d6
  992.     movem.w    Viewport.YSTART(a0),d1/d7
  993.     move.l    #Conch.BACKCOL,d4
  994.     bsr.l    Viewport.paintRectangle
  995.     ELSE
  996.     movea.l    Conch.rectAddressTable,a0
  997.     move.w    (a0)+,d7
  998.     beq.s    .end_restore
  999.     subq.w    #1,d7
  1000. .restore_loop:
  1001.     move.w    d7,-(sp)
  1002.     movem.w    (a0)+,d1/d7
  1003.     movem.w    (a0)+,d0/d6
  1004.     move.l    a0,-(sp)
  1005.     move.l    #Conch.BACKCOL,d4
  1006.     bsr.l    Viewport.paintRectangle
  1007.     movea.l    (sp)+,a0
  1008.     move.w    (sp)+,d7
  1009.     dbra    d7,.restore_loop
  1010. .end_restore:
  1011.     ENDC
  1012.  
  1013.     movea.l    Conch.rectAddressTable,a0
  1014.     bsr.l    PrimitiveMesh.paint
  1015.  
  1016.     lea    Conch.rectAddressTable,a0
  1017.      move.l    (a0)+,d0
  1018.     move.l    (a0)+,d1
  1019.     move.l    (a0),-(a0)
  1020.     move.l    d0,4(a0)
  1021.     move.l    d1,-(a0)
  1022. .end:    rts
  1023.  
  1024. ; Clambs just chilling out.
  1025. Conch.paintStillClamb:
  1026.     move.w    $04BC.w,d0
  1027.     sub.w    Conch.stillStartTime,d0
  1028.     subi.w    #700,d0
  1029.     bmi.s    .time_ok
  1030.     clr.w    d0
  1031. .time_ok:
  1032.     muls.w    d0,d0
  1033.     lsr.l    #7,d0
  1034.     neg.w    d0
  1035.     addi.w    #800,d0
  1036.     move.w    d0,.ypos
  1037.  
  1038.     bsr.l    PrimitiveMesh.new
  1039.  
  1040. ; clamb #1
  1041.     move.w    $04BC.w,d1
  1042.     Do_SinModulo    d1
  1043.     Get_Sin    sine_tbl,d1,d1
  1044.     asr.w    #8,d1
  1045.     clr.w    d0
  1046.     addi.w    #sintbllen/10,d1
  1047.     move.w    #sintbllen/4,d2
  1048.     bsr.l    Matrix.generate
  1049.     move.w    #-1400,d0
  1050.     move.w    .ypos(pc),d1
  1051.     move.w    #5000,d2
  1052.     bsr.l    Matrix.translate
  1053.     bsr.l    Matrix.push
  1054.  
  1055. ; Calc clamb pos and rot...
  1056.     lea    sine_tbl,a1
  1057.     move.w    #0,d2
  1058.     move.w    d2,d3
  1059.     Do_SinModulo    d3
  1060.     Get_SinCos    a1,d3,d3,d4
  1061.     exg    d3,d4
  1062.     asr.l    #6,d3
  1063.     asr.l    #5,d4
  1064.     neg.l    d4
  1065.     add.l    d2,d4
  1066.     add.l    d2,d4
  1067.     lsr.l    #1,d4
  1068.     move.w    d4,.clamb1_pos
  1069.     add.w    d3,d2
  1070.     Do_SinModulo    d2
  1071.     Get_Cos    a1,d2,d2
  1072.     addi.w    #$8000,d2
  1073.     lsr.w    #8,d2
  1074.     move.w    d2,.zrot
  1075.  
  1076. ; clamb top
  1077.     clr.w    d0
  1078.     clr.w    d1
  1079.     move.w    .zrot(pc),d2
  1080.     bsr.l    Matrix.generate
  1081.     clr.w    d0
  1082.     move.w    .clamb1_pos(pc),d1
  1083.     clr.w    d2
  1084.     bsr.l    Matrix.translate
  1085.     bsr.l    Matrix.push
  1086.     moveq    #TransformObject.BACKFACE_CULLING|TransformObject.PERSPECTIVATE,d0
  1087.     moveq    #0,d1
  1088.     bsr.l    TransformObject.transform
  1089.     bsr.l    Matrix.pop
  1090.  
  1091. ; clamb bottom
  1092.     clr.w    d0
  1093.     move.w    #sintbllen/2,d1
  1094.     move.w    .zrot(pc),d2
  1095.     bsr.l    Matrix.generate
  1096.     clr.w    d0
  1097.     move.w    .clamb1_pos(pc),d1
  1098.     clr.w    d2
  1099.     bsr.l    Matrix.translate
  1100.     bsr.l    Matrix.push
  1101.     moveq    #TransformObject.BACKFACE_CULLING|TransformObject.PERSPECTIVATE,d0
  1102.     moveq    #0,d1
  1103.     bsr.l    TransformObject.transform
  1104.     bsr.l    Matrix.pop
  1105.  
  1106.     bsr.l    Matrix.pop
  1107.  
  1108. ; clamb #2
  1109.     move.w    $04BC.w,d1
  1110.     mulu.w    #3,d1
  1111.     lsr.l    d1
  1112.     Do_SinModulo    d1
  1113.     Get_Sin    sine_tbl,d1,d1
  1114.     asr.w    #8,d1
  1115.     clr.w    d0
  1116.     addi.w    #sintbllen*3/8,d1
  1117.     move.w    #sintbllen/4,d2
  1118.     bsr.l    Matrix.generate
  1119.     move.w    #1200,d0
  1120.     move.w    .ypos(pc),d1
  1121.     move.w    #5000,d2
  1122.     bsr.l    Matrix.translate
  1123.     bsr.l    Matrix.push
  1124.  
  1125. ; Calc clamb pos and rot...
  1126.     lea    sine_tbl,a1
  1127.     move.w    #0,d2
  1128.     move.w    d2,d3
  1129.     Do_SinModulo    d3
  1130.     Get_SinCos    a1,d3,d3,d4
  1131.     exg    d3,d4
  1132.     asr.l    #6,d3
  1133.     asr.l    #5,d4
  1134.     neg.l    d4
  1135.     add.l    d2,d4
  1136.     add.l    d2,d4
  1137.     lsr.l    #1,d4
  1138.     move.w    d4,.clamb1_pos
  1139.     add.w    d3,d2
  1140.     Do_SinModulo    d2
  1141.     Get_Cos    a1,d2,d2
  1142.     addi.w    #$8000,d2
  1143.     lsr.w    #8,d2
  1144.     move.w    d2,.zrot
  1145.  
  1146. ; clamb top
  1147.     clr.w    d0
  1148.     clr.w    d1
  1149.     move.w    .zrot(pc),d2
  1150.     bsr.l    Matrix.generate
  1151.     clr.w    d0
  1152.     move.w    .clamb1_pos(pc),d1
  1153.     clr.w    d2
  1154.     bsr.l    Matrix.translate
  1155.     bsr.l    Matrix.push
  1156.     moveq    #TransformObject.BACKFACE_CULLING|TransformObject.PERSPECTIVATE,d0
  1157.     moveq    #0,d1
  1158.     bsr.l    TransformObject.transform
  1159.     bsr.l    Matrix.pop
  1160.  
  1161. ; clamb bottom
  1162.     clr.w    d0
  1163.     move.w    #sintbllen/2,d1
  1164.     move.w    .zrot(pc),d2
  1165.     bsr.l    Matrix.generate
  1166.     clr.w    d0
  1167.     move.w    .clamb1_pos(pc),d1
  1168.     clr.w    d2
  1169.     bsr.l    Matrix.translate
  1170.     bsr.l    Matrix.push
  1171.     moveq    #TransformObject.BACKFACE_CULLING|TransformObject.PERSPECTIVATE,d0
  1172.     moveq    #0,d1
  1173.     bsr.l    TransformObject.transform
  1174.     bsr.l    Matrix.pop
  1175.  
  1176.     bsr.l    Matrix.pop
  1177.  
  1178. ; clamb #3
  1179.     move.w    $04BC.w,d1
  1180.     mulu.w    #5,d1
  1181.     lsr.l    #2,d1
  1182.     Do_SinModulo    d1
  1183.     Get_Sin    sine_tbl,d1,d1
  1184.     asr.w    #8,d1
  1185.     move.w    #-sintbllen/10,d0
  1186.     addi.w    #-sintbllen/4+sintbllen/24,d1
  1187.     move.w    #sintbllen/4,d2
  1188.     bsr.l    Matrix.generate
  1189.     move.w    #+100,d0
  1190.     move.w    .ypos(pc),d1
  1191.     move.w    #5500,d2
  1192.     bsr.l    Matrix.translate
  1193.     bsr.l    Matrix.push
  1194.  
  1195. ; Calc clamb pos and rot...
  1196.     lea    sine_tbl,a1
  1197.     move.w    #0,d2
  1198.     move.w    d2,d3
  1199.     Do_SinModulo    d3
  1200.     Get_SinCos    a1,d3,d3,d4
  1201.     exg    d3,d4
  1202.     asr.l    #6,d3
  1203.     asr.l    #5,d4
  1204.     neg.l    d4
  1205.     add.l    d2,d4
  1206.     add.l    d2,d4
  1207.     lsr.l    #2,d4
  1208.     move.w    d4,.clamb1_pos
  1209.     add.w    d3,d2
  1210.     Do_SinModulo    d2
  1211.     Get_Cos    a1,d2,d2
  1212.     addi.w    #$8000,d2
  1213.     lsr.w    #8,d2
  1214.     move.w    d2,.zrot
  1215.  
  1216. ; clamb top
  1217.     clr.w    d0
  1218.     clr.w    d1
  1219.     move.w    .zrot(pc),d2
  1220.     bsr.l    Matrix.generate
  1221.     clr.w    d0
  1222.     move.w    .clamb1_pos(pc),d1
  1223.     clr.w    d2
  1224.     bsr.l    Matrix.translate
  1225.     bsr.l    Matrix.push
  1226.     moveq    #TransformObject.BACKFACE_CULLING|TransformObject.PERSPECTIVATE,d0
  1227.     moveq    #0,d1
  1228.     bsr.l    TransformObject.transform
  1229.     bsr.l    Matrix.pop
  1230.  
  1231. ; clamb bottom
  1232.     clr.w    d0
  1233.     move.w    #sintbllen/2,d1
  1234.     move.w    .zrot(pc),d2
  1235.     bsr.l    Matrix.generate
  1236.     clr.w    d0
  1237.     move.w    .clamb1_pos(pc),d1
  1238.     clr.w    d2
  1239.     bsr.l    Matrix.translate
  1240.     bsr.l    Matrix.push
  1241.     moveq    #TransformObject.BACKFACE_CULLING|TransformObject.PERSPECTIVATE,d0
  1242.     moveq    #0,d1
  1243.     bsr.l    TransformObject.transform
  1244.     bsr.l    Matrix.pop
  1245.  
  1246.     bsr.l    Matrix.pop
  1247. .end_add_clambs:
  1248.  
  1249.     bsr.l    PrimitiveMesh.sortZ
  1250.  
  1251.     bsr.l    PrimitiveMesh.complete
  1252.  
  1253.     IFNE    0
  1254.     lea    Viewport.settingsTable,a0
  1255.     movem.w    Viewport.XSTART(a0),d0/d6
  1256.     movem.w    Viewport.YSTART(a0),d1/d7
  1257.     move.l    #Conch.BACKCOL,d4
  1258.     bsr.l    Viewport.paintRectangle
  1259.     ELSE
  1260.     movea.l    Conch.rectAddressTable,a0
  1261.     move.w    (a0)+,d7
  1262.     beq.s    .end_restore
  1263.     subq.w    #1,d7
  1264. .restore_loop:
  1265.     move.w    d7,-(sp)
  1266.     movem.w    (a0)+,d1/d7
  1267.     movem.w    (a0)+,d0/d6
  1268.     move.l    a0,-(sp)
  1269.     move.l    #Conch.BACKCOL,d4
  1270.     bsr.l    Viewport.paintRectangle
  1271.     movea.l    (sp)+,a0
  1272.     move.w    (sp)+,d7
  1273.     dbra    d7,.restore_loop
  1274. .end_restore:
  1275.     ENDC
  1276.  
  1277.     movea.l    Conch.rectAddressTable,a0
  1278.     bsr.l    PrimitiveMesh.paint
  1279.  
  1280.     lea    Conch.rectAddressTable,a0
  1281.      move.l    (a0)+,d0
  1282.     move.l    (a0)+,d1
  1283.     move.l    (a0),-(a0)
  1284.     move.l    d0,4(a0)
  1285.     move.l    d1,-(a0)
  1286. .end:    rts
  1287.  
  1288. .zrot:    DC.W    0
  1289. .clamb1_pos:
  1290.     DC.W    0
  1291. .ypos:    DC.W    0
  1292.  
  1293. ; Try to paint some clambing clambs.
  1294. ; Open-shut movement of clambs seems hard, still not too realistic.
  1295. Conch.paintSwimmingClamb:
  1296.     bsr.l    PrimitiveMesh.new
  1297.  
  1298.     move.w    Conch.time,d0
  1299.     subi.w    #$0080,d0
  1300.     blt.s    .add_clambs
  1301.  
  1302.     lsl.l    #2,d0
  1303.     subi.l    #2700,d0
  1304.     move.w    d0,-(sp)
  1305.  
  1306.     move.w    Conch.time,d0
  1307.     move.w    d0,d1
  1308.     move.w    d0,d2
  1309.     mulu.w    #7,d0
  1310.     lsr.l    #3,d0
  1311.     mulu.w    #3,d1
  1312.     lsr.l    #1,d1
  1313.     mulu.w    #5,d2
  1314.     lsr.l    #2,d2
  1315.     bsr.l    Matrix.generate
  1316.     move.w    (sp)+,d0
  1317.     clr.w    d1
  1318.     move.w    #3000,d2
  1319.     bsr.l    Matrix.translate
  1320.     bsr.l    Matrix.push
  1321.     moveq    #TransformObject.BACKFACE_CULLING|TransformObject.PERSPECTIVATE,d0
  1322.     moveq    #1,d1
  1323.     bsr.l    TransformObject.transform
  1324.     bsr.l    Matrix.pop
  1325.  
  1326. .add_clambs:
  1327.     cmpi.w    #$0280,Conch.time
  1328.     bhs    .end_add_clambs
  1329.  
  1330. ; clamb #1
  1331.     clr.w    d0
  1332.     move.w    #sintbllen/10,d1
  1333.     move.w    #sintbllen/4,d2
  1334.     bsr.l    Matrix.generate
  1335.     move.w    #-1400,d0
  1336.     move.w    #800,d1
  1337.     move.w    #5000,d2
  1338.     bsr.l    Matrix.translate
  1339.     bsr.l    Matrix.push
  1340.  
  1341. ; Calc clamb pos and rot...
  1342.     lea    sine_tbl,a1
  1343.     move.w    Conch.time,d2
  1344.     mulu.w    #20,d2
  1345.     move.w    d2,d3
  1346.     Do_SinModulo    d3
  1347.     Get_SinCos    a1,d3,d3,d4
  1348.     exg    d3,d4
  1349.     asr.l    #6,d3
  1350.     asr.l    #5,d4
  1351.     neg.l    d4
  1352.     add.l    d2,d4
  1353.     add.l    d2,d4
  1354.     lsr.l    #1,d4
  1355.     move.w    d4,.clamb1_pos
  1356.     add.w    d3,d2
  1357.     Do_SinModulo    d2
  1358.     Get_Cos    a1,d2,d2
  1359.     addi.w    #$8000,d2
  1360.     lsr.w    #8,d2
  1361.     move.w    d2,.zrot
  1362.  
  1363. ; clamb top
  1364.     clr.w    d0
  1365.     clr.w    d1
  1366.     move.w    .zrot(pc),d2
  1367.     bsr.l    Matrix.generate
  1368.     clr.w    d0
  1369.     move.w    .clamb1_pos(pc),d1
  1370.     clr.w    d2
  1371.     bsr.l    Matrix.translate
  1372.     bsr.l    Matrix.push
  1373.     moveq    #TransformObject.BACKFACE_CULLING|TransformObject.PERSPECTIVATE,d0
  1374.     moveq    #0,d1
  1375.     bsr.l    TransformObject.transform
  1376.     bsr.l    Matrix.pop
  1377.  
  1378. ; clamb bottom
  1379.     clr.w    d0
  1380.     move.w    #sintbllen/2,d1
  1381.     move.w    .zrot(pc),d2
  1382.     bsr.l    Matrix.generate
  1383.     clr.w    d0
  1384.     move.w    .clamb1_pos(pc),d1
  1385.     clr.w    d2
  1386.     bsr.l    Matrix.translate
  1387.     bsr.l    Matrix.push
  1388.     moveq    #TransformObject.BACKFACE_CULLING|TransformObject.PERSPECTIVATE,d0
  1389.     moveq    #0,d1
  1390.     bsr.l    TransformObject.transform
  1391.     bsr.l    Matrix.pop
  1392.  
  1393.     bsr.l    Matrix.pop
  1394.  
  1395. ; clamb #2
  1396.     clr.w    d0
  1397.     move.w    #sintbllen*3/8,d1
  1398.     move.w    #sintbllen/4,d2
  1399.     bsr.l    Matrix.generate
  1400.     move.w    #1200,d0
  1401.     move.w    #800,d1
  1402.     move.w    #5000,d2
  1403.     bsr.l    Matrix.translate
  1404.     bsr.l    Matrix.push
  1405.  
  1406. ; Calc clamb pos and rot...
  1407.     lea    sine_tbl,a1
  1408.     move.w    Conch.time,d2
  1409.     mulu.w    #19,d2
  1410.     move.w    d2,d3
  1411.     Do_SinModulo    d3
  1412.     Get_SinCos    a1,d3,d3,d4
  1413.     exg    d3,d4
  1414.     asr.l    #6,d3
  1415.     asr.l    #5,d4
  1416.     neg.l    d4
  1417.     add.l    d2,d4
  1418.     add.l    d2,d4
  1419.     lsr.l    #1,d4
  1420.     move.w    d4,.clamb1_pos
  1421.     add.w    d3,d2
  1422.     Do_SinModulo    d2
  1423.     Get_Cos    a1,d2,d2
  1424.     addi.w    #$8000,d2
  1425.     lsr.w    #8,d2
  1426.     move.w    d2,.zrot
  1427.  
  1428. ; clamb top
  1429.     clr.w    d0
  1430.     clr.w    d1
  1431.     move.w    .zrot(pc),d2
  1432.     bsr.l    Matrix.generate
  1433.     clr.w    d0
  1434.     move.w    .clamb1_pos(pc),d1
  1435.     clr.w    d2
  1436.     bsr.l    Matrix.translate
  1437.     bsr.l    Matrix.push
  1438.     moveq    #TransformObject.BACKFACE_CULLING|TransformObject.PERSPECTIVATE,d0
  1439.     moveq    #0,d1
  1440.     bsr.l    TransformObject.transform
  1441.     bsr.l    Matrix.pop
  1442.  
  1443. ; clamb bottom
  1444.     clr.w    d0
  1445.     move.w    #sintbllen/2,d1
  1446.     move.w    .zrot(pc),d2
  1447.     bsr.l    Matrix.generate
  1448.     clr.w    d0
  1449.     move.w    .clamb1_pos(pc),d1
  1450.     clr.w    d2
  1451.     bsr.l    Matrix.translate
  1452.     bsr.l    Matrix.push
  1453.     moveq    #TransformObject.BACKFACE_CULLING|TransformObject.PERSPECTIVATE,d0
  1454.     moveq    #0,d1
  1455.     bsr.l    TransformObject.transform
  1456.     bsr.l    Matrix.pop
  1457.  
  1458.     bsr.l    Matrix.pop
  1459.  
  1460. ; clamb #3
  1461.     move.w    #-sintbllen/10,d0
  1462.     move.w    #-sintbllen/4+sintbllen/24,d1
  1463.     move.w    #sintbllen/4,d2
  1464.     bsr.l    Matrix.generate
  1465.     move.w    #+100,d0
  1466.     move.w    #800,d1
  1467.     move.w    #5500,d2
  1468.     bsr.l    Matrix.translate
  1469.     bsr.l    Matrix.push
  1470.  
  1471. ; Calc clamb pos and rot...
  1472.     lea    sine_tbl,a1
  1473.     move.w    Conch.time,d2
  1474.     mulu.w    #17,d2
  1475.     move.w    d2,d3
  1476.     Do_SinModulo    d3
  1477.     Get_SinCos    a1,d3,d3,d4
  1478.     exg    d3,d4
  1479.     asr.l    #6,d3
  1480.     asr.l    #5,d4
  1481.     neg.l    d4
  1482.     add.l    d2,d4
  1483.     add.l    d2,d4
  1484.     lsr.l    #2,d4
  1485.     move.w    d4,.clamb1_pos
  1486.     add.w    d3,d2
  1487.     Do_SinModulo    d2
  1488.     Get_Cos    a1,d2,d2
  1489.     addi.w    #$8000,d2
  1490.     lsr.w    #8,d2
  1491.     move.w    d2,.zrot
  1492.  
  1493. ; clamb top
  1494.     clr.w    d0
  1495.     clr.w    d1
  1496.     move.w    .zrot(pc),d2
  1497.     bsr.l    Matrix.generate
  1498.     clr.w    d0
  1499.     move.w    .clamb1_pos(pc),d1
  1500.     clr.w    d2
  1501.     bsr.l    Matrix.translate
  1502.     bsr.l    Matrix.push
  1503.     moveq    #TransformObject.BACKFACE_CULLING|TransformObject.PERSPECTIVATE,d0
  1504.     moveq    #0,d1
  1505.     bsr.l    TransformObject.transform
  1506.     bsr.l    Matrix.pop
  1507.  
  1508. ; clamb bottom
  1509.     clr.w    d0
  1510.     move.w    #sintbllen/2,d1
  1511.     move.w    .zrot(pc),d2
  1512.     bsr.l    Matrix.generate
  1513.     clr.w    d0
  1514.     move.w    .clamb1_pos(pc),d1
  1515.     clr.w    d2
  1516.     bsr.l    Matrix.translate
  1517.     bsr.l    Matrix.push
  1518.     moveq    #TransformObject.BACKFACE_CULLING|TransformObject.PERSPECTIVATE,d0
  1519.     moveq    #0,d1
  1520.     bsr.l    TransformObject.transform
  1521.     bsr.l    Matrix.pop
  1522.  
  1523.     bsr.l    Matrix.pop
  1524. .end_add_clambs:
  1525.  
  1526.     bsr.l    PrimitiveMesh.sortZ
  1527.  
  1528.     bsr.l    PrimitiveMesh.complete
  1529.  
  1530.     IFNE    0
  1531.     lea    Viewport.settingsTable,a0
  1532.     movem.w    Viewport.XSTART(a0),d0/d6
  1533.     movem.w    Viewport.YSTART(a0),d1/d7
  1534.     move.l    #Conch.BACKCOL,d4
  1535.     bsr.l    Viewport.paintRectangle
  1536.     ELSE
  1537.     movea.l    Conch.rectAddressTable,a0
  1538.     move.w    (a0)+,d7
  1539.     beq.s    .end_restore
  1540.     subq.w    #1,d7
  1541. .restore_loop:
  1542.     move.w    d7,-(sp)
  1543.     movem.w    (a0)+,d1/d7
  1544.     movem.w    (a0)+,d0/d6
  1545.     move.l    a0,-(sp)
  1546.     move.l    #Conch.BACKCOL,d4
  1547.     bsr.l    Viewport.paintRectangle
  1548.     movea.l    (sp)+,a0
  1549.     move.w    (sp)+,d7
  1550.     dbra    d7,.restore_loop
  1551. .end_restore:
  1552.     ENDC
  1553.  
  1554.     movea.l    Conch.rectAddressTable,a0
  1555.     bsr.l    PrimitiveMesh.paint
  1556.  
  1557.     lea    Conch.rectAddressTable,a0
  1558.      move.l    (a0)+,d0
  1559.     move.l    (a0)+,d1
  1560.     move.l    (a0),-(a0)
  1561.     move.l    d0,4(a0)
  1562.     move.l    d1,-(a0)
  1563. .end:    rts
  1564.  
  1565. .zrot:    DC.W    0
  1566. .clamb1_pos:
  1567.     DC.W    0
  1568.  
  1569. ;======= OBJECT DATA =======================================================
  1570.  
  1571.     DATA
  1572.  
  1573. Conch.textureTable:
  1574.     DC.L    FlareGen.parelMoerBuffer
  1575.     DC.L    0
  1576.  
  1577. Conch.rectAddressTable:
  1578.     DC.L    Conch.rectangleTable
  1579.     DC.L    Conch.rectangleTable2
  1580.     DC.L    Conch.rectangleTable3
  1581.  
  1582. Conch.colorTable:
  1583.     REPT    128
  1584.     DC.W    $FFFF
  1585.     ENDR
  1586.     REPT    128
  1587.     DC.W    %1111100000000000
  1588.     ENDR
  1589.     REPT    16
  1590.     DC.W    %1111111111111111
  1591.     DC.W    %1111110111101111
  1592.     DC.W    %1111101111100111
  1593.     DC.W    %1111100111100011
  1594.     DC.W    %1111100111100011
  1595.     DC.W    %1111101111100111
  1596.     DC.W    %1111110111101111
  1597.     DC.W    %1111111111111111
  1598.     ENDR
  1599.     REPT    8
  1600.     DC.W    %1111111111111111
  1601.     DC.W    %1111111111111111
  1602.     DC.W    %1111111011110111
  1603.     DC.W    %1111110111101111
  1604.     DC.W    %1111110100001100
  1605.     DC.W    %1111101111100111
  1606.     DC.W    %1111101100000101
  1607.     DC.W    %1111100111100011
  1608.     DC.W    %1111100111100011
  1609.     DC.W    %1111101100000101
  1610.     DC.W    %1111101111100111
  1611.     DC.W    %1111110100001100
  1612.     DC.W    %1111110111101111
  1613.     DC.W    %1111111011110111
  1614.     DC.W    %1111111111111111
  1615.     DC.W    %1111111111111111
  1616.     ENDR
  1617.  
  1618. Conch.gradTable:
  1619.     DC.W    1
  1620.     DC.W    6
  1621.     DC.L    $FFFF00FF
  1622.     DC.L    $003C0078
  1623.  
  1624. ;======= OBJECT RESERVES ===================================================
  1625.  
  1626.     BSS
  1627.  
  1628. Conch.backPal:
  1629.     DS.W    64
  1630.  
  1631. Conch.conchAdr:
  1632.     DS.L    1
  1633. Conch.clambAdr:
  1634.     DS.L    1
  1635.  
  1636. Conch.rectangleTable:
  1637.     DS.W    4*10
  1638. Conch.rectangleTable2:
  1639.     DS.W    4*10
  1640. Conch.rectangleTable3:
  1641.     DS.W    4*10
  1642.  
  1643. Conch.startTime:
  1644.     DS.W    1
  1645. Conch.time:
  1646.     DS.W    1
  1647. Conch.clambsMoving:
  1648.     DS.W    1
  1649. Conch.clambsStartTime:
  1650.     DS.W    1
  1651. Conch.closeStartTime:
  1652.     DS.W    1
  1653. Conch.stillStartTime:
  1654.     DS.W    1
  1655. Conch.closeMode:
  1656.     DS.W    1
  1657.  
  1658. Conch.paintRout:
  1659.     DS.L    1
  1660. Conch.resRout:
  1661.     DS.L    1
  1662.