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

  1. ;******* OBJECT EQUATES ********
  2.  
  3. Fern.SCALAR:        =    $8000
  4. Fern.MAXSTEPS:        =    8            ; >0 & <8
  5.  
  6.             RSRESET
  7. Fern.KEY_L:        RS.W    1
  8. Fern.KEY_M:        RS.W    1
  9. Fern.KEY_R:        RS.W    1
  10. Fern.KEY_SKEWAMP:    RS.W    1
  11. Fern.KEY_DIFFAMP:    RS.W    1
  12. Fern.KEY_SIZE:        RS.B    0
  13.  
  14. ; conifeer (leilandi, small)
  15. ; left=12
  16. ; mid=25
  17. ; right=12
  18. ; skewamp=$80
  19. ; diffamp=$80
  20.  
  21. ; oak
  22. ; left=21
  23. ; mid=30
  24. ; right=21
  25. ; skewamp=$80
  26. ; diffamp=$180
  27.  
  28. ; pine
  29. ; left=12
  30. ; mid=30
  31. ; right=12
  32. ; skewamp=0
  33. ; diffamp=$280
  34.  
  35. ; 'sad'
  36. ; left=16
  37. ; mid=28
  38. ; right=12
  39. ; skewamp=$100
  40. ; diffamp=0
  41.  
  42. ; mutant
  43. ; left=30
  44. ; mid=30
  45. ; right=12
  46. ; skewamp=$100
  47. ; diffamp=$280
  48.  
  49. ;******* OBJECT TABLE ********
  50.  
  51. ; Must be first in object!!
  52. Fern.table:
  53.     DC.L    Fern.mainLoop
  54.     DC.L    Fern.init
  55.     DC.L    Fern.setRes
  56.     DC.L    Fern.incLeftLen
  57.     DC.L    Fern.decLeftLen
  58.     DC.L    Fern.incMidLen
  59.     DC.L    Fern.decMidLen
  60.     DC.L    Fern.incRightLen
  61.     DC.L    Fern.decRightLen
  62.     DC.L    Fern.incSkewAmp
  63.     DC.L    Fern.decSkewAmp
  64.     DC.L    Fern.incDiffAmp
  65.     DC.L    Fern.decDiffAmp
  66.     DC.L    0
  67.  
  68.     IFND    DEMO_SYSTEM
  69.     INCLUDE    SFLY_DSP.S
  70.     TEXT
  71.     ENDC
  72.  
  73. ;******* RESOLUTION SETTING ROUTINE ********
  74.  
  75. Fern.setRes:
  76.     IFEQ    testmode
  77.     move.w    monitormode,d0
  78.     cmpi.w    #vga60,d0
  79.     beq.s    .vga60
  80.     cmpi.w    #vga100,d0
  81.     beq.s    .vga100
  82.     cmpi.w    #rgb50,d0
  83.     beq.s    .rgb50
  84. ; Unknown monitormode..
  85.     rts
  86. .vga60:    bra.l    vga60_16bit_320_200
  87. .vga100:bra.l    vga100_16bit_320_200
  88. .rgb50:    bra.l    rgb50_16bit_320_200
  89.     ENDC
  90.     rts
  91.  
  92. ;******* INIT SUBROUTINE ********
  93.  
  94. ; OUTPUT:
  95. ; d0.l: =0 all clear, <0 error
  96. Fern.init:
  97.     lea    sine_tbl,a1
  98.     bsr.l    Matrix.init
  99.  
  100.     tst.w    detail
  101.     beq.s    .lo_crap
  102.     move.w    #Fern.MAXSTEPS,Fern.steps
  103.     bra.s    .success
  104. .lo_crap:
  105.     move.w    #Fern.MAXSTEPS-1,Fern.steps
  106.  
  107. .success:
  108.     moveq    #0,d0
  109.     rts
  110. .error:    moveq    #-1,d0
  111.     rts
  112.  
  113. ;******* REALTIME INIT SUBROUTINE ********
  114.  
  115. Fern.realtimeInit:
  116.     move.l    #rts,vbl_gfx
  117.  
  118.     bsr.l    HumanFly.init
  119.  
  120.     lea    Viewport.settingsTable,a0
  121.     move.w    #320,Viewport.XSCREEN(a0)
  122.     move.w    #200,Viewport.YSCREEN(a0)
  123.     move.w    #0,Viewport.XSTART(a0)
  124.     move.w    #0,Viewport.YSTART(a0)
  125.     move.w    #320,Viewport.XEND(a0)
  126.     move.w    #200,Viewport.YEND(a0)
  127.     move.w    #160,Viewport.XCENTER(a0)
  128.     move.w    #100,Viewport.YCENTER(a0)
  129.     move.w    #256+32,Viewport.ASPECT(a0)
  130.     move.w    #$100,Viewport.FOCAL(a0)
  131.     bsr.l    Viewport.update
  132.  
  133.     lea    Fern.textureTable,a0
  134.     lea    Fern.pal,a1
  135.     bsr.l    Polygon.init
  136.  
  137.     move.l    $04BA.w,Fern.startTime
  138.     rts
  139.  
  140. ;******* SCREENINIT SUBROUTINE ********
  141.  
  142. Fern.initScreen:
  143.     rts
  144.  
  145. ;******* MAINLOOP SUBROUTINE ********
  146.  
  147. Fern.mainLoop:
  148.     move.w    $0468.w,.old468
  149.  
  150.     movea.l    scr,a0
  151.     bsr.l    Primitive.setScreenbuffer
  152.  
  153.     move.l    frmcnt,d0
  154.     sub.l    lastframecount,d0
  155.     bne.s    .end_realtime_init
  156.     move.l    d0,-(sp)
  157.     bsr.w    Fern.realtimeInit
  158.     move.l    (sp)+,d0
  159. .end_realtime_init:
  160.     cmpi.l    #3,d0
  161.     bhs.s    .end_screeninit
  162.     bsr.w    Fern.initScreen
  163. .end_screeninit:
  164.  
  165. ; Calculate current time.
  166.     move.l    $04BA.w,d0
  167.     sub.l    Fern.startTime,d0
  168.     move.l    d0,Fern.time
  169.  
  170. ; Calculate control values..
  171.     bsr.w    Fern.morph
  172.  
  173. ; Control the tree.
  174.     move.w    Fern.time+2,d0
  175.     move.w    d0,d2
  176.     mulu.w    #5,d2
  177.     lsr.l    #2,d2
  178.     move.w    d0,Fern.startAngle
  179.     move.w    d0,d1
  180.     mulu.w    #3,d0
  181.     lsr.l    #3,d0
  182.     mulu.w    #7,d1
  183.     lsr.l    #3,d1
  184.     Do_SinModulo    d0
  185.     Do_SinModulo    d1
  186.     Get_Sin    sine_tbl,d0,d0
  187.     Get_Sin    sine_tbl,d1,d1
  188.  
  189.     muls.w    Fern.skewAmp,d0
  190.     add.l    d0,d0
  191.     swap    d0
  192.     move.w    d0,Fern.skew
  193.  
  194.     muls.w    Fern.diffAmp,d1
  195.     add.l    d1,d1
  196.     swap    d1
  197.     move.w    d1,Fern.angDiff
  198.  
  199. ; Paint the tree.
  200.     lea    Viewport.settingsTable,a0
  201.     movem.w    Viewport.XSTART(a0),d0/d6
  202.     movem.w    Viewport.YSTART(a0),d1/d7
  203.     move.l    #$00080008,d4
  204.     bsr.l    Viewport.paintRectangle
  205.  
  206.     bsr.w    Fern.paint3
  207.  
  208.     IFEQ    testmode
  209.     lea    scr,a0
  210.     move.l    (a0)+,d0
  211.     move.l    (a0)+,d1
  212.     move.l    (a0),-4(a0)
  213.     move.l    d0,(a0)
  214.     move.l    d1,-8(a0)
  215.     move.l    d0,d1
  216.     lsr.w    #8,d0
  217.     move.l    d0,$ffff8200.w
  218.     move.b    d1,$ffff820d.w
  219.     ENDC
  220.  
  221.     move.w    .old468(pc),d0
  222. .wait:    cmp.w    $0468.w,d0
  223.     beq.s    .wait
  224.  
  225.     move.l    frmcnt,d0
  226.     sub.l    lastframecount,d0
  227.     bne.s    .res_done
  228.     bsr.w    Fern.setRes
  229. .res_done:
  230.  
  231.     rts
  232.  
  233. .old468:DC.W    0
  234.  
  235. ;******* OBJECT SUBROUTINES ********
  236.  
  237. Fern.incLeftLen:
  238.     addq.l    #1,Fern.leftLength
  239.     rts
  240.  
  241. Fern.decLeftLen:
  242.     subq.l    #1,Fern.leftLength
  243.     rts
  244.  
  245. Fern.incMidLen:
  246.     addq.l    #1,Fern.midLength
  247.     rts
  248.  
  249. Fern.decMidLen:
  250.     subq.l    #1,Fern.midLength
  251.     rts
  252.  
  253. Fern.incRightLen:
  254.     addq.l    #1,Fern.rightLength
  255.     rts
  256.  
  257. Fern.decRightLen:
  258.     subq.l    #1,Fern.rightLength
  259.     rts
  260.  
  261. Fern.switchCenter:
  262.     move.w    #100,Fern.yCenter
  263.     rts
  264.  
  265. Fern.incSkewAmp:
  266.     addi.w    #$80,Fern.skewAmp
  267.     rts
  268.  
  269. Fern.decSkewAmp:
  270.     subi.w    #$80,Fern.skewAmp
  271.     rts
  272.  
  273. Fern.incDiffAmp:
  274.     addi.w    #$80,Fern.diffAmp
  275.     rts
  276.  
  277. Fern.decDiffAmp:
  278.     subi.w    #$80,Fern.diffAmp
  279.     rts
  280.  
  281. Fern.morph:
  282.     move.l    Fern.time,d0
  283.     move.l    d0,d1
  284.     lsr.l    #8,d1
  285.     lsr.l    #2,d1
  286.     andi.w    #$03FF,d0
  287.     lsl.w    #5,d0
  288.     move.l    d1,d2
  289.     addq.w    #1,d2
  290.     divu.w    Fern.keyTable,d1
  291.     divu.w    Fern.keyTable,d2
  292.     swap    d1
  293.     swap    d2
  294.     mulu.w    #Fern.KEY_SIZE,d1
  295.     mulu.w    #Fern.KEY_SIZE,d2
  296.     lea    (Fern.keyTable+2,d1.l),a1        ; a1: startkey
  297.     lea    (Fern.keyTable+2,d2.l),a2        ; a1: endkey
  298.     lea    Fern.tempCtrlTable,a0
  299.     moveq    #5-1,d7
  300.     bsr.s    Fern.interpolate
  301.  
  302.     lea    Fern.controlTable,a0
  303.     lea    Fern.tempCtrlTable,a1
  304.     addq    #2,a0
  305.     move.w    (a1)+,(a0)+
  306.     addq    #2,a0
  307.     move.w    (a1)+,(a0)+
  308.     addq    #2,a0
  309.     move.w    (a1)+,(a0)+
  310.     move.l    (a1)+,(a0)+
  311.     rts
  312.  
  313. ; Perform a linear morph between vertices.
  314. ; INPUT:
  315. ; d0.w: 0-32767 morph index
  316. ; d7.w=coords-1
  317. ; a0: destination vertices
  318. ; a1: begin vertices
  319. ; a2: end vertices
  320. Fern.interpolate:
  321.     move.w    #32767,d3
  322.     sub.w    d0,d3
  323.  
  324. .loop:    move.w    (a1)+,d1
  325.     move.w    (a2)+,d2
  326.     muls.w    d3,d1
  327.     muls.w    d0,d2
  328.     add.l    d1,d2
  329.     add.l    d2,d2
  330.     swap    d2
  331.     move.w    d2,(a0)+
  332.     dbf    d7,.loop
  333.  
  334.     rts
  335.  
  336. Fern.paint3:
  337.     lea    Fern.stack,a6
  338.     clr.w    .level
  339.  
  340. ; Initialize parent branch..
  341. ;    move.w    Fern.skew,d0
  342.     move.w    Fern.startAngle,d0
  343.  
  344. ;    move.l    Fern.midLength,d1
  345. ;    swap    d1
  346.     move.l    #25<<16,d1
  347.  
  348.     move.w    d0,(a6)+            ; angle
  349.     move.l    d1,(a6)+            ; length=63
  350.     move.w    Fern.xCenter,(a6)+        ; x=0
  351.     clr.w    (a6)+
  352.     move.w    Fern.yCenter,(a6)+        ; y=0
  353.     clr.w    (a6)+
  354.  
  355. ; INPUT:
  356. ; -$E(a6)=parent branch angle
  357. ; -$C(a6)=parent length
  358. ; -$8(a6)=parent branch endpoint x
  359. ; -$4(a6)=parent branch endpoint y
  360. ; d0.w=angle
  361. ; d1.l=length
  362. .paintTree:
  363.     move.w    .level(pc),Line.colorNum
  364.  
  365.     move.w    d0,(a6)+                ; 2
  366.     move.l    d1,(a6)+                ; 6
  367.     Do_SinModulo    d0
  368.     Get_SinCos    sine_tbl,d0,d2,d3
  369.     swap    d1
  370.     muls.w    d1,d2
  371.     muls.w    d1,d3
  372.     add.l    d2,d2
  373.     add.l    d3,d3
  374.     add.l    -8-6(a6),d2
  375.     add.l    -4-6(a6),d3
  376.     move.l    d2,(a6)+                ; 10
  377.     move.l    d3,(a6)+                ; 14
  378.  
  379. ; First, paint the line between current and parent point..
  380.     move.l    a6,-(sp)
  381.     move.w    -8(a6),d0                ; x0
  382.     move.w    -4(a6),d1                ; y0
  383.     move.w    -8-14(a6),d2                ; x1
  384.     move.w    -4-14(a6),d3                ; y1
  385. ; d0.w=x0, d1.w=y0, d2.w=x1, d3.w=y1
  386.     bsr.l    Line.paintFlatshaded
  387.     movea.l    (sp)+,a6
  388.  
  389.     move.w    .level(pc),d0
  390.     addq.w    #1,d0
  391.     move.w    d0,.level
  392.     cmp.w    Fern.steps(pc),d0
  393.     beq.s    .end
  394.  
  395. ; Paint the center first. This is DFS, required to paint the leaves last!
  396.  
  397. ; center branch
  398.     move.w    -14(a6),d0
  399.     add.w    Fern.skew(pc),d0
  400.     move.l    -12(a6),d1
  401.     mulu.l    Fern.midLength(pc),d1
  402.     lsr.l    #8,d1
  403.     bsr.s    .paintTree
  404.  
  405. ; left branch
  406.     move.w    -14(a6),d0
  407.     sub.w    Fern.angDiff(pc),d0
  408.     add.w    Fern.skew(pc),d0
  409.     move.l    -12(a6),d1
  410.     mulu.l    Fern.leftLength(pc),d1
  411.     lsr.l    #8,d1
  412.     bsr    .paintTree
  413.  
  414. ; right branch
  415.     move.w    -14(a6),d0
  416.     add.w    Fern.angDiff(pc),d0
  417.     add.w    Fern.skew(pc),d0
  418.     move.l    -12(a6),d1
  419.     mulu.l    Fern.rightLength(pc),d1
  420.     lsr.l    #8,d1
  421.     bsr    .paintTree
  422.  
  423. .end:    subq.w    #1,.level            ; Decrease level.
  424.     suba.w    #14,a6                ; Pop stuff off the stack.
  425.     rts
  426.  
  427. .level:    DC.W    0
  428.  
  429. Fern.steps:
  430.     DS.W    1
  431. Fern.startAngle:
  432.     DS.W    1
  433. Fern.angDiff:
  434.     DS.W    1
  435. Fern.skew:
  436.     DS.W    1
  437.  
  438. Fern.controlTable:
  439. Fern.midLength:
  440.     DS.L    1
  441. Fern.leftLength:
  442.     DS.L    1
  443. Fern.rightLength:
  444.     DS.L    1
  445. Fern.skewAmp:
  446.     DS.W    1
  447. Fern.diffAmp:
  448.     DS.W    1
  449.  
  450. ;******* OBJECT DATA ********
  451.  
  452.     DATA
  453.  
  454. Fern.textureTable:
  455.     DC.L    0
  456. Fern.pal:
  457.     REPT    128
  458.     DC.W    15<<11+7<<5
  459.     ENDR
  460.     REPT    128
  461.     DC.W    13<<11+15<<5
  462.     ENDR
  463.     REPT    128
  464.     DC.W    11<<11+23<<5
  465.     ENDR
  466.     REPT    128
  467.     DC.W    9<<11+31<<5
  468.     ENDR
  469.     REPT    128
  470.     DC.W    7<<11+39<<5
  471.     ENDR
  472.     REPT    128
  473.     DC.W    5<<11+47<<5
  474.     ENDR
  475.     REPT    128
  476.     DC.W    3<<11+55<<5
  477.     ENDR
  478.     REPT    128
  479.     DC.W    1<<11+63<<5
  480.     ENDR
  481.  
  482. Fern.yCenter:
  483.     DC.W    100
  484. Fern.xCenter:
  485.     DC.W    160
  486.  
  487. Fern.keyTable:
  488.     DC.W    (.end-.start)/Fern.KEY_SIZE
  489. .start:    DC.W    1,1,1,0,0            ; l,m,r,skewamp,diffamp
  490.     DC.W    12*8,25*8,12*8,$80,$80
  491.     DC.W    21*8,30*8,21*8,$80,$180
  492.     DC.W    12*8,30*8,12*8,0,$280
  493.     DC.W    16*8,28*8,12*8,$100,0
  494.     DC.W    30*8,30*8,12*8,$100,$280
  495.     DC.W    27*8,25*8,12*8,-$100,$180
  496.     DC.W    10*8,25*8,10*8,-$180,$100
  497. .end:
  498.  
  499. ;******* OBJECT RESERVES ********
  500.  
  501.     BSS
  502.  
  503. Fern.startTime:
  504.     DS.L    1
  505. Fern.time:
  506.     DS.L    1
  507.  
  508. Fern.tempCtrlTable:
  509.     DS.W    5
  510.  
  511. Fern.stack:
  512.     DS.L    4*(Fern.MAXSTEPS+1)
  513.  
  514. ;******* END OF DEMO-EFFECT OBJECT ********