home *** CD-ROM | disk | FTP | other *** search
/ Fujiology Archive / fujiology_archive_v1_0.iso / !FALCON / LINEOUT / OUT.ZIP / SOURCE.ZIP / TEXTURE.I < prev   
Text File  |  2003-01-02  |  31KB  |  1,577 lines

  1. ; Texturegenerators: envmap and texturemap..
  2.  
  3. ;======= equates
  4.  
  5. ; fake gauss bump pars..
  6. FlareGen.BUMP_D:    =    $00C0        ; rel. diam of gauss bump (8:8)
  7.  
  8. ; ring pars..
  9. FlareGen.IN_RING:    =    80<<16        ; inner radius of ring (16:16)
  10. FlareGen.OUT_RING:    =    80<<16        ; outer radius of ring (16:16)
  11. FlareGen.RING_MID:    =    (FlareGen.IN_RING+FlareGen.OUT_RING)/2    ; center of ring (16:16)
  12. FlareGen.RING_W:    =    (FlareGen.OUT_RING-FlareGen.IN_RING)>>9    ; width of ring / 256 (16:16)
  13.  
  14. ; sparkle line pars..
  15. FlareGen.LINES_ON:    =    1        ; (de)activate lines
  16. FlareGen.LINEAMP:    =    $0280        ; line amplitude (frac)
  17. FlareGen.NUMLINES:    =    5        ; #lines (int)
  18. FlareGen.LINETHIN:    =    0        ; inv log of linewidth
  19. FlareGen.LINEFADESPEED:    =    1        ; inv line fade speed (int)
  20. FlareGen.NOISEFREQ:    =    17        ; speed of noise (int)
  21. FlareGen.NOISEAMP:    =    $7FFF        ; amp of noise (sgn frac)
  22.  
  23. ; Flare dimensions..
  24. FlareGen.WIDTH:        =    64
  25. FlareGen.W1:        =    64
  26. FlareGen.W2:        =    12
  27. FlareGen.W3:        =    20
  28.  
  29. Texture.CUB_INT:=    1
  30.  
  31. ; Max size: required for bufferdimensions!
  32. Texture.SIZELOG:=    7
  33. Texture.SIZE:    =    1<<Texture.SIZELOG
  34.  
  35. ;======= subroutines
  36.  
  37. ; Envmap texture generation library!
  38.  
  39. ; OUTPUT:
  40. ; d0.l: 0 = All clear, neg = Error! Not initialized!
  41. FlareGen.init:
  42.     move.l    #$27863E14,random
  43.  
  44. ; Generate palettes..
  45.     lea    FlareGen.greenInstTable,a1
  46.     lea    FlareGen.greenPal,a0
  47.     bsr    Pal.makeGradientHc
  48.  
  49.     lea    FlareGen.copperInstTable,a1
  50.     lea    FlareGen.copperPal,a0
  51.     bsr    Pal.makeGradientHc
  52.  
  53.     lea    FlareGen.goldInstTable,a1
  54.     lea    FlareGen.goldPal,a0
  55.     bsr    Pal.makeGradientHc
  56.  
  57.     lea    FlareGen.iceInstTable,a1
  58.     lea    FlareGen.icePal,a0
  59.     bsr    Pal.makeGradientHc
  60.  
  61.     lea    FlareGen.chromeInstTable,a1
  62.     lea    FlareGen.chromePal,a0
  63.     bsr    Pal.makeGradientHc
  64.  
  65.     lea    FlareGen.blueInstTable,a1
  66.     lea    FlareGen.bluePal,a0
  67.     bsr    Pal.makeGradientHc
  68.  
  69.     lea    FlareGen.blue2InstTable,a1
  70.     lea    FlareGen.blue2Pal,a0
  71.     bsr    Pal.makeGradientHc
  72.  
  73.     lea    FlareGen.fogInstTable,a1
  74.     lea    FlareGen.fogPal,a0
  75.     bsr    Pal.makeGradientHc
  76.  
  77.     lea    FlareGen.grayInstTable,a1
  78.     lea    FlareGen.grayPal,a0
  79.     bsr    Pal.makeGradientHc
  80.  
  81.     lea    FlareGen.grInstTable,a1
  82.     lea    FlareGen.grPal,a0
  83.     bsr    Pal.makeGradientHc
  84.  
  85.     lea    Texture.sandInstTable,a1
  86.     lea    Texture.sandPal,a0
  87.     bsr    Pal.makeGradientHc
  88.  
  89.     lea    Texture.redInstTable,a1
  90.     lea    Texture.redPal,a0
  91.     bsr    Pal.makeGradientHc
  92.  
  93. ; Zero order hold... or chopscale up by factor 2.
  94.     lea    Texture.redPal,a0
  95.     moveq    #128-1,d7
  96. .hold_loop:
  97.     move.w    (a0)+,(a0)+
  98.     dbf    d7,.hold_loop
  99.  
  100. ; Precalc all greyscale flares and bumps..
  101.     lea    FlareGen.flare1,a0
  102.     move.w    #FlareGen.W1,d0
  103.     bsr    FlareGen.calcFlare
  104.  
  105.     lea    FlareGen.flare2,a0
  106.     moveq    #FlareGen.W2,d0
  107.     bsr    FlareGen.calcBump
  108.  
  109.     lea    FlareGen.flare3,a0
  110.     moveq    #FlareGen.W3,d0
  111.     bsr    FlareGen.calcBump
  112.  
  113. ; Now use palettes, flares and bumps to make to envtextures..
  114.     bsr.w    FlareGen.genGoldWithSparks
  115.     bsr.w    FlareGen.genChromeCopper
  116.     bsr.w    FlareGen.genChromeFog
  117.     bsr.w    FlareGen.genRed
  118.     bsr.w    FlareGen.genParelMoer
  119.  
  120. .success:
  121.     moveq    #0,d0
  122.     rts
  123. .error:    moveq    #-1,d0
  124.     rts
  125.  
  126. FlareGen.genParelMoer:
  127.     lea    FlareGen.parelMoerBuffer,a0
  128.     move.l    #"Word",(a0)+
  129.     move.l    #"PerP",(a0)+
  130.     move.l    #"ixel",(a0)+
  131.     move.l    #$00400040,(a0)+
  132.  
  133.     move.w    #%1111101011101011,d0
  134.     move.w    #64*64-1,d7
  135. .loop:    move.w    d0,(a0)+
  136.     dbf    d7,.loop
  137.  
  138.     lea    FlareGen.parelMoerBuffer+20,a0
  139.     lea    FlareGen.flare1,a1
  140.     lea    FlareGen.grayPal,a2
  141.     move.w    #FlareGen.W1,d0
  142.     move.w    #FlareGen.W1,d1
  143.     move.w    #FlareGen.WIDTH/2,d2
  144.     move.w    #FlareGen.WIDTH/2,d3
  145.     bsr.w    FlareGen.addBlock
  146.  
  147.     rts
  148.  
  149. FlareGen.genRed:
  150.     lea    FlareGen.redBuffer,a0
  151.     move.l    #"Word",(a0)+
  152.     move.l    #"PerP",(a0)+
  153.     move.l    #"ixel",(a0)+
  154.     move.l    #$00400040,(a0)+
  155.  
  156.     lea    FlareGen.redBuffer+20,a0
  157.     lea    FlareGen.flare1,a1
  158.     lea    Texture.redPal,a2
  159.     move.w    #FlareGen.W1,d0
  160.     move.w    #FlareGen.W1,d1
  161.     move.w    #FlareGen.WIDTH/2,d2
  162.     move.w    #FlareGen.WIDTH/2,d3
  163.     bsr    FlareGen.addBlock
  164.  
  165.     rts
  166.  
  167. FlareGen.genGoldWithSparks:
  168.     lea    FlareGen.goldBuffer,a0
  169.     move.l    #"Word",(a0)+
  170.     move.l    #"PerP",(a0)+
  171.     move.l    #"ixel",(a0)+
  172.     move.l    #$00400040,(a0)+
  173.  
  174.     lea    FlareGen.goldBuffer+20,a0
  175.     lea    FlareGen.flare1,a1
  176.     lea    FlareGen.goldPal,a2
  177.     move.w    #FlareGen.W1,d0
  178.     move.w    #FlareGen.W1,d1
  179.     move.w    #FlareGen.WIDTH/2,d2
  180.     move.w    #FlareGen.WIDTH/2,d3
  181.     bsr    FlareGen.addBlock
  182.  
  183.     lea    FlareGen.goldBuffer+20,a0
  184.     lea    FlareGen.flare2,a1
  185.     lea    FlareGen.grayPal,a2
  186.     move.w    #FlareGen.W2,d0
  187.     move.w    #FlareGen.W2,d1
  188.     move.w    #3*FlareGen.WIDTH/8,d2
  189.     move.w    #1*FlareGen.WIDTH/4,d3
  190.     bsr    FlareGen.addBlock
  191.  
  192.     lea    FlareGen.goldBuffer+20,a0
  193.     lea    FlareGen.flare3,a1
  194.     lea    FlareGen.grayPal,a2
  195.     move.w    #FlareGen.W3,d0
  196.     move.w    #FlareGen.W3,d1
  197.     move.w    #3*FlareGen.WIDTH/4,d2
  198.     move.w    #3*FlareGen.WIDTH/8,d3
  199.     bsr    FlareGen.addBlock
  200.     rts
  201.  
  202. FlareGen.genChromeCopper:
  203.     lea    FlareGen.chromeBuffer,a0
  204.     move.l    #"Word",(a0)+
  205.     move.l    #"PerP",(a0)+
  206.     move.l    #"ixel",(a0)+
  207.     move.l    #$00400040,(a0)+
  208.  
  209.     lea    FlareGen.chromeBuffer+20,a0
  210.     lea    FlareGen.flare1,a1
  211.     lea    FlareGen.chromePal,a2
  212.     move.w    #FlareGen.W1,d0
  213.     move.w    #FlareGen.W1,d1
  214.     move.w    #FlareGen.WIDTH/2,d2
  215.     move.w    #FlareGen.WIDTH/2,d3
  216.     bsr    FlareGen.addBlock
  217.  
  218.     lea    FlareGen.chromeBuffer+20,a0
  219.     lea    FlareGen.flare2,a1
  220.     lea    FlareGen.copperPal,a2
  221.     move.w    #FlareGen.W2,d0
  222.     move.w    #FlareGen.W2,d1
  223.     move.w    #3*FlareGen.WIDTH/8,d2
  224.     move.w    #3*FlareGen.WIDTH/4,d3
  225.     bsr    FlareGen.addBlock
  226.  
  227.     lea    FlareGen.chromeBuffer+20,a0
  228.     lea    FlareGen.flare3,a1
  229.     lea    FlareGen.copperPal,a2
  230.     move.w    #FlareGen.W3,d0
  231.     move.w    #FlareGen.W3,d1
  232.     move.w    #1*FlareGen.WIDTH/4,d2
  233.     move.w    #3*FlareGen.WIDTH/8,d3
  234.     bsr    FlareGen.addBlock
  235.     rts
  236.  
  237. FlareGen.genChromeFog:
  238.     lea    FlareGen.chromeFogBuffer,a0
  239.     move.l    #"Word",(a0)+
  240.     move.l    #"PerP",(a0)+
  241.     move.l    #"ixel",(a0)+
  242.     move.l    #$00400040,(a0)+
  243.  
  244.     lea    FlareGen.chromeFogBuffer+20,a0
  245.     lea    FlareGen.flare1,a1
  246.     lea    FlareGen.chromePal,a2
  247.     move.w    #FlareGen.W1,d0
  248.     move.w    #FlareGen.W1,d1
  249.     move.w    #FlareGen.WIDTH/2,d2
  250.     move.w    #FlareGen.WIDTH/2,d3
  251.     bsr    FlareGen.addBlock
  252.  
  253.     lea    FlareGen.chromeFogBuffer+20,a0
  254.     lea    FlareGen.flare2,a1
  255.     lea    FlareGen.bluePal,a2
  256.     move.w    #FlareGen.W2,d0
  257.     move.w    #FlareGen.W2,d1
  258.     move.w    #3*FlareGen.WIDTH/4,d2
  259.     move.w    #11*FlareGen.WIDTH/16,d3
  260.     bsr    FlareGen.addBlock
  261.  
  262.     lea    FlareGen.chromeFogBuffer+20,a0
  263.     lea    FlareGen.flare3,a1
  264.     lea    FlareGen.bluePal,a2
  265.     move.w    #FlareGen.W3,d0
  266.     move.w    #FlareGen.W3,d1
  267.     move.w    #3*FlareGen.WIDTH/4,d2
  268.     move.w    #13*FlareGen.WIDTH/16,d3
  269.     bsr    FlareGen.addBlock
  270.     rts
  271.  
  272.  
  273. ; INPUT:
  274. ; d0.l=x (16:16)
  275. ; OUTPUT:
  276. ; d0.w=bandlimited noise of (x) [$8000..$7FFF]
  277. FlareGen.calcNoise1d:
  278.     move.l    #$15F345EF,d2
  279.  
  280.     move.l    d0,d4
  281.     sub.w    d0,d0                ; d0.l=i=floor(x) (16:16)
  282.     sub.l    d0,d4                ; d4.l=f=x-i (16:16)
  283.     asr.w    #1,d4                ; d4.w=f (sgn frac)
  284.     swap    d0                ; d0.w=i (int)
  285.  
  286.     move.w    d0,d1                ; d1.w=i (int)
  287.     mulu.w    d0,d0
  288.     rol.l    d0,d0
  289.     eor.l    d2,d0
  290.     swap    d0
  291.     eor.w    d1,d0
  292.  
  293.     addq.w    #1,d1                ; d1.w=i+1 (int)
  294.     move.w    d1,d3                ; d3.w=i+1 (int)
  295.     mulu.w    d1,d1
  296.     rol.l    d1,d1
  297.     eor.l    d2,d1
  298.     swap    d1
  299.     eor.w    d3,d1
  300. ; d0.w=n0=rand(i), d1.w=n1=rand(i+1)
  301.  
  302.     sub.w    d0,d1                ; d1.w=n1-n0
  303.     muls.w    d1,d4                ; d4.l=f(n1-n0)/2 (16:16)
  304.     add.l    d4,d4                ; d4.l=f(n1-n0) (16:16)
  305.     swap    d4                ; d4.w=f(n1-n0) (sgn frac)
  306.     ext.l    d0
  307.     ext.l    d4
  308.     add.l    d4,d0                ; d0.w=n0+f(n1-n0)=n0(1-f)+n1(f)
  309.     rts
  310.  
  311. ; Fuck this floating shit! I do it fixedpoint and with sqrt(x) instead of
  312. ; exp(-x).
  313. ;
  314. ; INPUT:
  315. ; d0.w=width=height=r, 0<r<256
  316. ; a0: dst heightfield
  317. FlareGen.calcFlare:
  318.     moveq    #1,d7
  319.     move.w    d0,.radius
  320.     sub.w    d0,d7                ; d7.w=1-r
  321.     addq.w    #1,d0
  322.     move.w    d0,.one_plus_r
  323.     move.w    d7,.one_min_r
  324.  
  325. .yloop:    move.w    .one_min_r(pc),d6
  326.  
  327. .xloop:    move.w    d6,d0
  328.     move.w    d7,d1
  329.     muls.w    d0,d0
  330.     muls.w    d1,d1
  331.     add.l    d0,d1                ; d1.l=dx^2+dy^2
  332.     bsr    Math.sqrt
  333. ; d0.l=d=sqrt(dx^2+dy^2) (16:16)
  334.     movea.l    d0,a2                ; a2=d (16:16)
  335.  
  336.     move.w    .radius(pc),d1
  337.     mulu.w    #FlareGen.BUMP_D,d1
  338.     divu.w    d1,d0
  339.     cmpi.w    #256,d0
  340.     bhs.s    .oki
  341.     not.b    d0
  342.     bra.s    .bump_done
  343. .oki:    clr.b    d0
  344. .bump_done:
  345.     andi.l    #$000000FF,d0
  346. ; d0.l=bumph (int)
  347.  
  348. ; if d < rmin or d > rmax, then ringh=0.
  349.     cmpa.l    #FlareGen.IN_RING,a2
  350.     ble.s    .endcalcring 
  351.     cmpa.l    #FlareGen.OUT_RING,a2
  352.     bgt.s    .endcalcring
  353. .calcring:
  354.     move.l    a2,d3
  355.     subi.l    #FlareGen.RING_MID,d3        ; d3.l=d-rmid (16:16)
  356.     bpl.s    .abs_done
  357.     neg.l    d3
  358. .abs_done:
  359. ; d3.l=|d-rmid| (16:16)
  360.     divu.w    #FlareGen.RING_W,d3
  361. ; d3.w=ring=|d-rmid|<<8/rwidth
  362.  
  363.     move.w    d3,d4
  364.     add.w    d4,d4                ; d4.w=2*ring (8:8)
  365.     move.w    #$0300,d5
  366.     sub.w    d4,d5                ; d5.w=3-2*ring (8:8)
  367.     mulu.w    d3,d5
  368.     lsr.l    #8,d5                ; d5.w=ring(3-2*ring) (8:8)
  369.     mulu.w    d3,d5
  370.     lsr.l    #8,d5                ; d5.w=ring^2*(3-2*ring) (8:8)
  371.     move.w    #$0100,d3
  372.     sub.w    d5,d3                ; d3.w=1-ring^2*(3-2*ring) (8:8)
  373.     andi.l    #$0000FFFF,d3
  374.     divu.w    #3,d3
  375.     add.w    d3,d0                ; d0.w=bumph+ringh
  376. .endcalcring:
  377. ; d0.w=bumph+ringh (int)
  378.  
  379.     IFNE    FlareGen.LINES_ON
  380. ; Calculate lines..
  381.     move.w    d6,d1
  382.     ext.l    d1
  383.     lsl.l    #8,d1
  384.     divs.w    d7,d1
  385.     ext.l    d1
  386.     lsl.l    #8,d1
  387.  
  388.     movem.l    d0/d6/d7,-(sp)
  389.  
  390.     move.l    d1,d0
  391.     bsr    Frac.arctan
  392. ; d0.l=arctan(y/x) (16:16)
  393.     addi.l    #$0003243F,d1            ; d1.l=v=arctan(y/x)+pi (16:16)
  394.     move.l    d1,-(sp)
  395.     move.l    d1,d0
  396.     mulu.l    #FlareGen.NOISEFREQ,d0        ; d0.l=fr*v, pump up noise frequency
  397.     bsr    FlareGen.calcNoise1d
  398.     muls.w    #FlareGen.NOISEAMP,d0
  399.     add.l    d0,d0
  400.     swap    d0
  401.     ext.l    d0                ; d0.l=amp*noise1d(fr*v)
  402.     move.l    (sp)+,d1            ; d1.l=v=arctan(y/x)+pi (16:16)
  403. ; d0.l=noise1d (16:16) ???
  404.     addi.l    #$00010000,d0            ; d0.l=amp*noise1d(fr*v)+1 (16:16)
  405.     mulu.l    #$0000517C*FlareGen.NUMLINES,d2:d1
  406.     move.w    d2,d1
  407.     swap    d1
  408. ; d1.l=17v/pi (16:16)
  409.     add.l    d1,d0                ; d0.l=17v/pi+amp*noise1d(10v)+1
  410.     clr.l    d1
  411.     move.w    d0,d1
  412. ; d1.l=fmod(17v/pi+1+Noise1d[10v], 1)
  413.     subi.l    #$00008000,d1            ; d0.l=fmod(17v/pi+1+amp*noise1d[10v], 1)-.5 (16:16)
  414.     add.l    d1,d1                ; d1.l=2[fmod(17v/pi+1+amp*noise1d[10v], 1)-.5] (16:16)
  415.     bpl.s    .done_line_abs
  416.     neg.l    d1
  417. .done_line_abs:
  418. ; d1.l=2|[fmod(17v/pi+1+amp*noise1d[10v], 1)-.5]| (16:16)
  419.     move.l    d1,d3
  420.     REPT    FlareGen.LINETHIN
  421.     mulu.l    d3,d2:d1
  422.     move.w    d2,d1
  423.     swap    d1
  424.     ENDR
  425. ; d1.l=v=|2[fmod(17v/pi+1+amp*noise1d[10v], 1)-.5]|^p (16:16)
  426.     move.l    a2,d2                ; d2.l=d (16:16)
  427.     divu.l    #FlareGen.LINEFADESPEED,d2
  428. ; d2.l=d/5 (16:16)
  429.     addi.l    #$00010000,d2
  430. ; d2.l=1+d/5 (16:16)
  431.     mulu.l    #FlareGen.LINEAMP,d1
  432.     divu.l    d2,d1
  433. ; d1.l=lineh=v/(1+d/5) (int)
  434.  
  435.     movem.l    (sp)+,d0/d6/d7
  436. ; d0.w=bumph+ringh (int)
  437.  
  438.     add.w    d1,d0
  439. ; d0.w=h=bumph+ringh+lineh
  440.  
  441.     ENDC
  442.  
  443. ; if h>1 then h:=1
  444.     cmpi.w    #255,d0
  445.     ble.s    .clip_done
  446.     move.w    #255,d0
  447. .clip_done:
  448.     move.b    d0,(a0)+
  449.     
  450.     addq.w    #2,d6
  451.     cmp.w    .one_plus_r(pc),d6
  452.     bne    .xloop
  453.  
  454.     addq.w    #2,d7
  455.     cmp.w    .one_plus_r(pc),d7
  456.     bne    .yloop
  457.     rts
  458.  
  459. .radius:DC.W    0
  460. .one_min_r:
  461.     DC.W    0
  462. .one_plus_r:
  463.     DC.W    0
  464.  
  465. ; Makes a byte heightfield bump..
  466. ;
  467. ; INPUT:
  468. ; d0.w=width=height
  469. ; a0: dst buffer
  470. FlareGen.calcBump:
  471.     move.w    d0,d5
  472.  
  473.     lea    (a0,d0.w),a1
  474.     move.w    d0,d1
  475.     subq.w    #1,d1
  476.     mulu.w    d0,d1
  477.     lea    (a0,d1.l),a2
  478.     lea    (a2,d0.w),a3
  479.     move.w    d0,d7
  480.     subq.w    #1,d7
  481.  
  482. .yloop:    move.w    d5,d6
  483.     subq.w    #1,d6
  484.  
  485. .xloop:    move.w    d6,d0
  486.     mulu.w    d0,d0
  487.     move.w    d7,d1
  488.     mulu.w    d1,d1
  489.     add.l    d0,d1
  490.     bsr    Math.sqrt
  491.  
  492.     move.w    d5,d1
  493.     lsl.w    #8,d1
  494.     divu.w    d1,d0
  495.     cmpi.w    #256,d0
  496.     bhs.s    .oki
  497.     not.b    d0
  498.     bra.s    .store
  499. .oki:    clr.b    d0
  500. .store:    lsr.b    #1,d0
  501.     move.b    d0,(a0)+
  502.     move.b    d0,-(a1)
  503.     move.b    d0,(a2)+
  504.     move.b    d0,-(a3)
  505.     subq.w    #2,d6
  506.     bpl.s    .xloop
  507.  
  508.     move.w    d5,d1
  509.     lsr.w    #1,d1
  510.     adda.w    d1,a0
  511.     move.w    d1,d2
  512.     mulu.w    #3,d2
  513.     adda.w    d2,a1
  514.     suba.w    d2,a2
  515.     suba.w    d1,a3
  516.     subq.w    #2,d7
  517.     bpl.s    .yloop
  518.  
  519.     rts
  520.  
  521. ; Adds (rgb saturated) a palette-based block to the current hc buffer!
  522. ; No fucking clip (i'm lazy!).
  523. ; INPUT:
  524. ; d0.w=src width (0<w<=FlareGen.WIDTH)
  525. ; d1.w=src height (0<h<=FlareGen.HEIGHT)
  526. ; d2.w=center x in dst (0<=x<FlareGen.WIDTH)
  527. ; d3.w=center y in dst (0<=y<FlareGen.WIDTH)
  528. ; a0: dst texture
  529. ; a1: src heightfield
  530. ; a2: src hc palette
  531. FlareGen.addBlock:
  532.     move.w    d0,d4
  533.     move.w    d1,d5
  534.     lsr.w    d4
  535.     lsr.w    d5
  536.     sub.w    d4,d2                ; d2.w=lx
  537.     sub.w    d5,d3                ; d3.w=uy
  538.     ext.l    d2
  539.     mulu.w    #FlareGen.WIDTH,d3
  540.     add.l    d3,d2
  541.     
  542.     lea    (a0,d2.l*2),a0
  543.     movea.w    #FlareGen.WIDTH,a6
  544.     suba.w    d0,a6                ; a6=WIDTH-w=y_inc
  545.     adda.l    a6,a6
  546.  
  547.     subq.w    #1,d0                ; d0.w=w-1
  548.     subq.w    #1,d1                ; d1.w=h-1
  549.     move.w    d0,d7
  550.  
  551. .yloop:    move.w    d7,d0
  552.  
  553. .xloop:    move.w    (a0),d2                ; d2.w=dst hc pixel
  554.     clr.l    d3
  555.     move.b    (a1)+,d3
  556.     move.w    (a2,d3.l*2),d3            ; d3.w=src hc pixel
  557.     move.w    d2,d4
  558.     andi.w    #$F800,d4
  559.     add.w    d3,d4
  560.     bcc.s    .red_sat_done
  561.     move.w    #$F800,d4
  562. .red_sat_done:
  563.     andi.w    #$F800,d4            ; d4.w=red
  564.  
  565.     move.w    d2,d5
  566.     andi.w    #$07E0,d5
  567.     lsl.w    #5,d5
  568.     move.w    d3,d6
  569.     lsl.w    #5,d6
  570.     add.w    d6,d5
  571.     bcc.s    .green_sat_done
  572.     move.w    #$FFFF,d5
  573. .green_sat_done:
  574.     andi.w    #$FC00,d5            ; d5.w=green<<5
  575.     lsr.w    #5,d5                ; d5.w=green
  576.     or.w    d5,d4                ; d4.w=red|green
  577.  
  578.     move.w    d2,d5
  579.     andi.w    #$001F,d5
  580.     lsl.w    #3,d5
  581.     move.w    d3,d6
  582.     lsl.w    #3,d6
  583.     add.b    d6,d5
  584.     bcc.s    .blue_sat_done
  585.     move.w    #$00FF,d5
  586. .blue_sat_done:
  587.     andi.w    #$00F8,d5            ; d5.w=blue<<5
  588.     lsr.w    #3,d5                ; d5.w=blue
  589.     or.w    d5,d4                ; d4.w=red|green|blue
  590.  
  591.     move.w    d4,(a0)+            ; Store pixel.
  592.     dbf    d0,.xloop
  593.  
  594.     adda.l    a6,a0
  595.     dbf    d1,.yloop
  596.     rts
  597.  
  598. ; Turbulence algorithm based texture generator.
  599. ; Thanx to tat/avena and Mr Perlin.
  600.  
  601. ; Makes some default textures.
  602. ; Just some convenience stuff.
  603. Texture.makeDefaults:
  604. ; Generate 8b textures first..
  605.     move.l    #$45217D72,d2
  606.     lea    Texture.8bTexture1,a0
  607.     bsr    Texture.make8bTexture
  608.     move.l    #$142D1271,d2
  609.     lea    Texture.8bTexture2,a0
  610.     bsr    Texture.make8bTexture
  611.  
  612. ; Create sky texture by rgb saturated add shit.
  613.     lea    Texture.16bTexture2,a0
  614.     lea    Texture.8bTexture2,a1
  615.     lea    Texture.8bTexture1,a3
  616.     lea    FlareGen.blue2Pal,a2
  617.     lea    FlareGen.grPal,a4
  618.     clr.w    d0
  619. .conv_loop1:
  620.     clr.l    d1
  621.     move.b    (a1)+,d1
  622.     move.w    (a2,d1.l*2),d3
  623.     clr.l    d2
  624.     move.b    (a3)+,d2
  625.     move.w    (a4,d2.l*2),d2
  626.  
  627.     move.w    d2,d4
  628.     andi.w    #$F800,d4
  629.     add.w    d3,d4
  630.     bcc.s    .red_sat_done
  631.     move.w    #$F800,d4
  632. .red_sat_done:
  633.     andi.w    #$F800,d4            ; d4.w=red
  634.  
  635.     move.w    d2,d5
  636.     andi.w    #$07E0,d5
  637.     lsl.w    #5,d5
  638.     move.w    d3,d6
  639.     lsl.w    #5,d6
  640.     add.w    d6,d5
  641.     bcc.s    .green_sat_done
  642.     move.w    #$FFFF,d5
  643. .green_sat_done:
  644.     andi.w    #$FC00,d5            ; d5.w=green<<5
  645.     lsr.w    #5,d5                ; d5.w=green
  646.     or.w    d5,d4                ; d4.w=red|green
  647.  
  648.     move.w    d2,d5
  649.     andi.w    #$001F,d5
  650.     lsl.w    #3,d5
  651.     move.w    d3,d6
  652.     lsl.w    #3,d6
  653.     add.b    d6,d5
  654.     bcc.s    .blue_sat_done
  655.     move.w    #$00FF,d5
  656. .blue_sat_done:
  657.     andi.w    #$00F8,d5            ; d5.w=blue<<5
  658.     lsr.w    #3,d5                ; d5.w=blue
  659.     or.w    d5,d4                ; d4.w=red|green|blue
  660.  
  661.     move.w    d4,(a0)+
  662.     addq.w    #1,d0
  663.     bne.s    .conv_loop1
  664.  
  665. ; Create chrome texture..
  666.     lea    Texture.16bTexture1,a0
  667.     lea    Texture.8bTexture1,a1
  668.     lea    FlareGen.chromePal,a2
  669.     clr.w    d0
  670.     clr.l    d1
  671. .conv_loop2:
  672.     move.b    (a1)+,d1
  673.     move.w    (a2,d1.l*2),(a0)+
  674.     addq.w    #1,d0
  675.     bne.s    .conv_loop2
  676.  
  677. ; Create psychedelic palette.
  678.     lea    Texture.crapInstTable,a1
  679.     lea    Texture.crapPal,a0
  680.     bsr    Pal.makeGradientHc
  681.  
  682. ; Generate nice blue/black/purple space texture..
  683.     lea    Texture.spaceTexture,a0
  684.     move.l    #"Word",(a0)+
  685.     move.l    #"PerP",(a0)+
  686.     move.l    #"ixel",(a0)+
  687.     move.l    #$00400040,(a0)+
  688.     lea    FlareGen.icePal,a1
  689.     moveq    #6,d0
  690.     moveq    #2,d1
  691.     move.l    #$07013001,d2
  692.     bsr    Texture.createWords2
  693.     rts
  694.  
  695. ; INPUT:
  696. ; d2.l=random seed
  697. ; a0: texture
  698. Texture.make8bTexture:
  699. ; Generate nice turbulence texture 128*128..
  700.     moveq    #7,d0
  701.     moveq    #4,d1
  702.     move.l    a0,-(sp)
  703.     bsr    Texture.createBytes2
  704.     movea.l    (sp),a0
  705.  
  706. ; Tile it to 256*256..
  707.     movea.l    a0,a1
  708.     adda.l    #128*256,a0
  709.     moveq    #128-1,d7
  710.  
  711. .yloop:    lea    128(a0),a2
  712.     moveq    #128/4-1,d6
  713.  
  714. .xloop:    move.l    (a1),(a0)+
  715.     move.l    (a1)+,(a2)+
  716.     dbf    d6,.xloop
  717.  
  718.     movea.l    a2,a0
  719.     dbf    d7,.yloop
  720.  
  721.     movea.l    (sp)+,a0
  722.     movea.l    a0,a1
  723.     adda.l    #128*256,a1
  724.     move.w    #256*128/4-1,d7
  725.  
  726. .copy_loop:
  727.     move.l    (a1)+,(a0)+
  728.     dbf    d7,.copy_loop
  729.  
  730.     rts
  731.  
  732. ; INPUT:
  733. ; d2.l=random seed
  734. ; a0: texture
  735. ; a1: pal
  736. Texture.make16bTexture:
  737. ; Generate nice turbulence texture 128*128..
  738.     moveq    #7,d0
  739.     moveq    #4,d1
  740.     move.l    a0,-(sp)
  741.     bsr    Texture.createWords2
  742.     movea.l    (sp),a0
  743.  
  744. ; Tile it to 256*256..
  745.     movea.l    a0,a1
  746.     adda.l    #128*256*2,a0
  747.     moveq    #128-1,d7
  748.  
  749. .yloop:    lea    128*2(a0),a2
  750.     moveq    #128*2/4-1,d6
  751.  
  752. .xloop:    move.l    (a1),(a0)+
  753.     move.l    (a1)+,(a2)+
  754.     dbf    d6,.xloop
  755.  
  756.     movea.l    a2,a0
  757.     dbf    d7,.yloop
  758.  
  759.     movea.l    (sp)+,a0
  760.     movea.l    a0,a1
  761.     adda.l    #128*256*2,a1
  762.     move.w    #256*128*2/4-1,d7
  763.  
  764. .copy_loop:
  765.     move.l    (a1)+,(a0)+
  766.     dbf    d7,.copy_loop
  767.  
  768.     rts
  769.  
  770. ; INPUT:
  771. ; d0.l=random seed
  772. Texture.init:
  773.     move.w    #Texture.SIZE*Texture.SIZE-1,d7
  774.     lea    Texture.xGradGrid,a1
  775.     lea    Texture.yGradGrid,a2
  776.     lea    Texture.heightGrid,a0
  777.     move.l    #$001F1F7F,d2
  778.  
  779. .loop:    move.l    d0,d1
  780.     rol.l    d0,d0
  781.     mulu.w    d1,d0
  782.     eor.l    d1,d0
  783.     addq.l    #5,d0
  784.     and.l    d2,d1
  785.     move.b    d1,(a0)+
  786.     lsr.l    #8,d1
  787.     subi.b    #$10,d1
  788.     move.b    d1,(a1)+
  789.     lsr.l    #8,d1
  790.     subi.b    #$10,d1
  791.     move.b    d1,(a2)+
  792.     dbra    d7,.loop
  793.     rts
  794.  
  795. ; This gets the values from the grids at specified points. This involves a
  796. ; wrapped afair.
  797. ; INPUT:
  798. ; d0.w=x
  799. ; d1.w=y
  800. ; d4.w=mask
  801. ; OUTPUT:
  802. ; d0.b=xgrad
  803. ; d1.b=ygrad
  804. ; d2.b=height
  805. Texture.getPoint:
  806.     and.w    d4,d0                ; Wrap x.
  807.     and.w    d4,d1                ; Wrap y.
  808.     clr.l    d3
  809.     move.w    d1,d3
  810.     lsl.l    #Texture.SIZELOG,d3
  811.     add.w    d0,d3
  812.     move.b    (Texture.heightGrid,d3.l),d0
  813.     move.b    (Texture.xGradGrid,d3.l),d1
  814.     move.b    (Texture.yGradGrid,d3.l),d2
  815.     rts
  816.  
  817. ; Take the 4 corners' xgrad,ygrad and values.
  818. ; Interpolate [x,y] to [x+1,y], giving new value and ygrad
  819. ; Interpolate [x,y+1] to [x+1,y+1], giving same
  820. ; Use a and b to calculate final value.
  821. ;
  822. ; 1:[x,y]   2:[x+1,y]
  823. ; *----a----*
  824. ; |
  825. ; |    *[x+xfrac,y+yfrac]
  826. ; |
  827. ; *----b----*
  828. ; 3:[x,y+1] 4:[x+1,y+1]
  829. ;
  830. ; INPUT:
  831. ; d0.w=x, d1.w=y (8:8)
  832. ; OUTPUT:
  833. ; d0.w=noise (8:8)
  834. ; d4.w=mask
  835. Texture.getNoise:
  836. ; Get frac and whole parts.
  837.     clr.w    d2
  838.     clr.w    d3
  839.     move.b    d0,d2                ; d2.b=xfrac
  840.     move.b    d1,d3                ; d3.b=yfrac
  841.     lsr.w    #8,d0                ; d0.b=xint
  842.     lsr.w    #8,d1                ; d1.b=yint
  843.     move.w    d0,d6
  844.     move.w    d1,d7
  845.     lea    .h1(pc),a6
  846.  
  847.     movem.w    d2-d3,-(sp)
  848.  
  849.     bsr.s    Texture.getPoint
  850.     lsl.w    #8,d0
  851.     lsl.w    #8,d1
  852.     lsl.w    #8,d2
  853.     movem.w    d0-d2,(a6)            ; Store h1,xg1,yg1 (8:8).
  854.     move.w    d6,d0
  855.     move.w    d7,d1
  856.     addq.w    #1,d0
  857.     bsr.s    Texture.getPoint
  858.     lsl.w    #8,d0
  859.     lsl.w    #8,d1
  860.     lsl.w    #8,d2
  861.     movem.w    d0-d2,6(a6)            ; Store h2,xg2,yg2 (8:8).
  862.     move.w    d6,d0
  863.     move.w    d7,d1
  864.     addq.w    #1,d1
  865.     bsr.s    Texture.getPoint
  866.     lsl.w    #8,d0
  867.     lsl.w    #8,d1
  868.     lsl.w    #8,d2
  869.     movem.w    d0-d2,12(a6)            ; Store h3,xg3,yg3 (8:8).
  870.     move.w    d6,d0
  871.     move.w    d7,d1
  872.     addq.w    #1,d0
  873.     addq.w    #1,d1
  874.     bsr    Texture.getPoint
  875.     lsl.w    #8,d0
  876.     lsl.w    #8,d1
  877.     lsl.w    #8,d2
  878.     movem.w    d0-d2,18(a6)            ; Store h4,xg4,yg4 (8:8).
  879.  
  880.     movem.w    (sp)+,d2-d3
  881.  
  882. ; newvalue=Interpolate(value1, value2, xgrad1, xgrad2, xfrac)
  883.     move.w    d2,.xfrac
  884.     move.w    d3,.yfrac
  885.     move.w    d2,d4
  886.     move.w    .h1(pc),d0
  887.     move.w    .h2(pc),d1
  888.     move.w    .xg1(pc),d2
  889.     move.w    .xg2(pc),d3
  890.     IFNE    Texture.CUB_INT
  891.     bsr    Texture.interpolate
  892.     ELSE
  893.     bsr    Texture.interpolateLinear
  894.     ENDC
  895.     move.w    d0,.upper_h
  896.     
  897. ; newygrad=Interpolate(yg1, yg2, xg1, yg2, xfrac)
  898.     move.w    .yg1(pc),d0
  899.     move.w    .yg2(pc),d1
  900.     move.w    .xg1(pc),d2
  901.     move.w    .xg2(pc),d3
  902.     move.w    .xfrac(pc),d4
  903.     IFNE    Texture.CUB_INT
  904.     bsr    Texture.interpolate
  905.     ELSE
  906.     bsr    Texture.interpolateLinear
  907.     ENDC
  908.     move.w    d0,.upper_g
  909.  
  910. ; newvalue=Interpolate(h3, h4, xg3, xg4, xfrac)
  911.     move.w    .h3(pc),d0
  912.     move.w    .h4(pc),d1
  913.     move.w    .xg3(pc),d2
  914.     move.w    .xg4(pc),d3
  915.     move.w    .xfrac(pc),d4
  916.     IFNE    Texture.CUB_INT
  917.     bsr    Texture.interpolate
  918.     ELSE
  919.     bsr    Texture.interpolateLinear
  920.     ENDC
  921.     move.w    d0,.lower_h
  922.     
  923. ; newygrad=Interpolate(yg3, yg4, xg3, xg4, xfrac)
  924.     move.w    .yg3(pc),d0
  925.     move.w    .yg4(pc),d1
  926.     move.w    .xg3(pc),d2
  927.     move.w    .xg4(pc),d3
  928.     move.w    .xfrac(pc),d4
  929.     IFNE    Texture.CUB_INT
  930.     bsr    Texture.interpolate
  931.     ELSE
  932.     bsr    Texture.interpolateLinear
  933.     ENDC
  934.     move.w    d0,.lower_g
  935.  
  936. ; newvalue=Interpolate(upper_h,lower_h,upper_g,lower_g,yfrac)
  937.     movem.w    .upper_h(pc),d0-d3
  938.     move.w    .yfrac(pc),d4
  939.     IFNE    Texture.CUB_INT
  940.     bsr    Texture.interpolate
  941.     ELSE
  942.     bsr    Texture.interpolateLinear
  943.     ENDC
  944.  
  945. ; d0.w= final interpolated value..
  946.     rts
  947.  
  948. .xfrac:    DC.W    0
  949. .yfrac:    DC.W    0
  950. .upper_h:
  951.     DC.W    0
  952. .lower_h:
  953.     DC.W    0
  954. .upper_g:
  955.     DC.W    0
  956. .lower_g:
  957.     DC.W    0
  958. .h1:    DC.W    0
  959. .xg1:    DC.W    0
  960. .yg1:    DC.W    0
  961. .h2:    DC.W    0
  962. .xg2:    DC.W    0
  963. .yg2:    DC.W    0
  964. .h3:    DC.W    0
  965. .xg3:    DC.W    0
  966. .yg3:    DC.W    0
  967. .h4:    DC.W    0
  968. .xg4:    DC.W    0
  969. .yg4:    DC.W    0
  970.  
  971. ; Cubic interpolation.
  972. ; i = (2v0+g0+g1-2v1)x^3+(3v1-2g0-g1-3v0)x^2+g0x+v0
  973. ; INPUT:
  974. ; d0.w=v0, d1.w=v1, d2.w=g0, d3.w=g1 (8:8)
  975. ; d4.w=x [0..255]
  976. ; OUTPUT:
  977. ; d0.w=i (8:8)
  978. Texture.interpolate:
  979. ; Make long stuff.
  980.     ext.l    d0
  981.     ext.l    d1
  982.     ext.l    d2
  983.     ext.l    d3
  984.  
  985. ; i1=g0x+v0
  986.     move.l    d0,d5
  987.     lsl.l    #8,d5
  988.     move.w    d2,d6
  989.     muls.w    d4,d6
  990.     add.l    d6,d5
  991.  
  992.     move.w    d4,d7                ; d7.w=x (8:8)
  993.     muls.w    d4,d4
  994.     asr.l    #8,d4                ; d4.w=x^2 (8:8)
  995.  
  996. ; i2=(-2g0-g1-3v0+3v1)x^2
  997.     move.l    d1,d6
  998.     add.l    d1,d6
  999.     add.l    d1,d6
  1000.     sub.l    d3,d6
  1001.     sub.l    d2,d6
  1002.     sub.l    d2,d6
  1003.     sub.l    d0,d6
  1004.     sub.l    d0,d6
  1005.     sub.l    d0,d6
  1006.     muls.l    d4,d6
  1007.     add.l    d6,d5
  1008.  
  1009.     muls.w    d7,d4
  1010.     asr.l    #8,d4                ; d4.w=x^3 (8:8)
  1011.  
  1012. ; i3=(-2v1+2v0+g0+g1)x^3
  1013.     move.l    d0,d6
  1014.     add.l    d0,d6
  1015.     sub.l    d1,d6
  1016.     sub.l    d1,d6
  1017.     add.l    d2,d6
  1018.     add.l    d3,d6
  1019.     muls.l    d4,d6
  1020.     add.l    d6,d5                ; d5.w=i=i1+i2+i3
  1021.  
  1022.     move.l    d5,d0
  1023.     asr.l    #8,d0
  1024.     rts
  1025.  
  1026. ; Linear interpolation. Looks like garbage.
  1027. ; i = v0(1-x)+v1x
  1028. ; INPUT:
  1029. ; d0.w=v0, d1.w=v1 (8:8)
  1030. ; d4.w=x [0..255]
  1031. ; OUTPUT:
  1032. ; d0.w=i
  1033. Texture.interpolateLinear:
  1034. ; Make long stuff.
  1035.     move.w    #$0100,d3
  1036.     sub.w    d4,d3
  1037.     muls.w    d3,d0
  1038.     muls.w    d4,d1
  1039.     add.l    d1,d0
  1040.     asr.l    #8,d0
  1041.     rts
  1042.  
  1043. ; Generate a byte per pixel texture with specified dimensions.
  1044. ; INPUT:
  1045. ; d0.w=l=2log of dimension (x=y=2^l)
  1046. ; d1.w=o=#octaves of noise
  1047. ; d2.l=random seed
  1048. ; a0: texturebuffer (w*h bytes big!)
  1049. Texture.createBytes:
  1050.     move.w    d1,.octaves
  1051.  
  1052. ; Initialize grid..
  1053.     move.w    d0,-(sp)
  1054.     move.l    a0,-(sp)
  1055.     move.l    d2,d0
  1056.     bsr    Texture.init
  1057.     move.l    (sp)+,a0
  1058.     move.w    (sp)+,d2
  1059.  
  1060. ; Calc x,y..
  1061.     moveq    #1,d0
  1062.     lsl.l    d2,d0
  1063.     subq.w    #1,d0
  1064.     move.w    d0,d1
  1065.  
  1066. ; Calc scale..
  1067.     moveq    #9,d3
  1068.     sub.w    d2,d3                ; d3.w=9-l
  1069.     move.w    d3,.scale            ; Store scale.
  1070.  
  1071.     move.w    d0,d7
  1072.  
  1073. .yloop:    move.w    d7,-(sp)
  1074.  
  1075. ; Create a turbulent pixel.
  1076. .xloop:    move.l    a0,-(sp)
  1077.     movem.w    d0/d1,-(sp)
  1078.  
  1079.     clr.w    d7
  1080.     suba.l    a5,a5
  1081.  
  1082. .scale_loop:
  1083.     movem.w    (sp),d0/d1
  1084.     move.w    d7,-(sp)
  1085.     move.w    .scale(pc),d2
  1086.     add.w    d7,d2
  1087.     lsl.w    d2,d0
  1088.     lsl.w    d2,d1
  1089.     move.l    #$FFFF0001,d4
  1090.     rol.l    d7,d4
  1091.     bsr    Texture.getNoise
  1092.     move.w    (sp)+,d7
  1093.     asr.w    d7,d0
  1094.     bpl.s    .pos
  1095.     neg.w    d0
  1096. .pos:    adda.w    d0,a5
  1097.     addq.w    #1,d7
  1098.     cmp.w    .octaves(pc),d7
  1099.     blt.s    .scale_loop
  1100.  
  1101.     movem.w    (sp)+,d0/d1
  1102.     move.l    (sp)+,a0
  1103.     move.l    a5,d2
  1104.     lsr.l    #8,d2
  1105.     move.b    d2,(a0)+            ; Output pixel.
  1106.     dbf    d0,.xloop
  1107.     
  1108.     move.w    (sp)+,d7
  1109.     move.w    d7,d0
  1110.     dbf    d1,.yloop
  1111.  
  1112. .end:    rts
  1113.  
  1114. .scale:    DC.W    0
  1115. .octaves:
  1116.     DC.W    0
  1117.  
  1118.  
  1119. ; Uses the bytes version to create texture and makes it highcolor.
  1120. ; INPUT:
  1121. ; d0.w=l=2log of dimension (x=y=2^l)
  1122. ; d1.w=o=#octaves of noise
  1123. ; d2.l=random seed
  1124. ; a0: texturebuffer (w*h*2 bytes big!)
  1125. ; a1: palette (256 hc words)
  1126. Texture.createWords2:
  1127. ; Create texture..
  1128.     move.w    d0,-(sp)
  1129.     movem.l    a0/a1,-(sp)
  1130.     bsr.s    Texture.createBytes2
  1131.     movem.l    (sp)+,a0/a1
  1132.     move.w    (sp)+,d0
  1133.  
  1134. ; Convert..
  1135.     moveq    #1,d1
  1136.     add.l    d0,d0
  1137.     lsl.l    d0,d1
  1138. ; d1.l=#texels
  1139.     lea    (a0,d1.l*2),a2            ; a2: end of words (dst)
  1140.     add.l    d1,a0                ; a0: end of bytes (src)
  1141.  
  1142.     subq.w    #1,d1
  1143.     clr.l    d0
  1144. .loop:    move.b    -(a0),d0
  1145.     move.w    (a1,d0.l*2),-(a2)
  1146.     dbf    d1,.loop
  1147.     rts
  1148.  
  1149. ; Faster version, can be even faster though..
  1150. ; Generate a byte per pixel texture with specified dimensions.
  1151. ; INPUT:
  1152. ; d0.w=l=2log of dimension (x=y=2^l)
  1153. ; d1.w=o=#octaves of noise
  1154. ; d2.l=random seed
  1155. ; a0: texturebuffer (w*h bytes big!)
  1156. Texture.createBytes2:
  1157.     move.w    d0,.lw
  1158.     move.w    d1,.octave
  1159.     move.l    a0,.texture
  1160.  
  1161. ; Initialize grid..
  1162.     move.w    d0,-(sp)
  1163.     move.l    d2,d0
  1164.     bsr    Texture.init
  1165.     move.w    (sp)+,d2
  1166.  
  1167. ; Calc w,h..
  1168.     moveq    #1,d0
  1169.     lsl.l    d2,d0
  1170.     subq.w    #1,d0
  1171.     move.w    d0,d1                ; d0.w=d1.w=x=y
  1172.     move.w    d0,.width
  1173.  
  1174. ; Calc scale..
  1175.     moveq    #9,d3
  1176.     sub.w    d2,d3                ; d3.w=9-l
  1177.     move.w    d3,.scale            ; Store scale.
  1178.  
  1179. .octave_loop:
  1180.     lea    Texture.horGrid,a0
  1181.  
  1182.     move.w    .octave(pc),d0
  1183.     move.l    #$FFFF0001,d4
  1184.     rol.l    d0,d4                ; d4.w=mask
  1185.  
  1186. ; Step 1: Interpolate to (v, yg) grid.
  1187.     move.w    .width(pc),d7
  1188.     move.w    .scale(pc),d2
  1189.     add.w    .octave(pc),d2
  1190.     lsl.w    d2,d7
  1191.     lsr.w    #8,d7
  1192.  
  1193. .yloop1:move.w    .width(pc),d6
  1194.  
  1195. .xloop1:
  1196. ; Fetch (v, xg, yg) at x+1.
  1197.     move.w    d6,d0
  1198.     move.w    d7,d1
  1199.     move.w    .scale(pc),d2
  1200.     add.w    .octave(pc),d2
  1201.     lsl.w    d2,d0
  1202.     lsr.w    #8,d0
  1203.     bsr    Texture.getPoint
  1204.     lsl.w    #8,d0
  1205.     lsl.w    #8,d1
  1206.     lsl.w    #8,d2
  1207.     movem.w    d0-d2,.p1            ; Store v1,xg1,yg1 (8:8).
  1208.  
  1209. ; Fetch (v, xg, yg) at x+1.
  1210.     move.w    d6,d0
  1211.     move.w    d7,d1
  1212.     move.w    .scale(pc),d2
  1213.     add.w    .octave(pc),d2
  1214.     lsl.w    d2,d0
  1215.     lsr.w    #8,d0
  1216.     addq.w    #1,d0
  1217.     bsr    Texture.getPoint
  1218.     lsl.w    #8,d0
  1219.     lsl.w    #8,d1
  1220.     lsl.w    #8,d2
  1221.     movem.w    d0-d2,.p2            ; Store v2,xg2,yg2 (8:8).
  1222.  
  1223.     movem.w    d4/d6/d7,-(sp)
  1224.  
  1225. ; Calculate xfrac.
  1226.     move.w    .scale(pc),d2
  1227.     add.w    .octave(pc),d2
  1228.     move.w    d6,d4
  1229.     lsl.w    d2,d4
  1230.     andi.w    #$00FF,d4            ; d4.b=xfrac
  1231.  
  1232. ; Interpolate value along horizontal.
  1233.     movem.w    .p1(pc),d0/d2
  1234.     movem.w    .p2(pc),d1/d3
  1235.     bsr    Texture.interpolate
  1236.     move.w    d0,(a0)+            ; Store interpolated value.
  1237.  
  1238. ; Interpolate y_gradient along horizontal.
  1239.     move.w    .p1+4(pc),d0
  1240.     move.w    .p2+4(pc),d1
  1241.     move.w    .p1+2(pc),d2
  1242.     move.w    .p2+2(pc),d3
  1243.     bsr    Texture.interpolate
  1244.     move.w    d0,(a0)+            ; Store interpolated y_gradient.
  1245.  
  1246.     movem.w    (sp)+,d4/d6/d7
  1247.  
  1248.     dbf    d6,.xloop1
  1249.  
  1250.     dbf    d7,.yloop1
  1251.  
  1252. ; Step 2: Interpolate the (v, yg) grid to an additive octave
  1253.     movea.l    .texture(pc),a0
  1254.     lea    Texture.horGrid,a1
  1255.     move.w    .width(pc),d7
  1256.  
  1257. .yloop2:move.w    .width(pc),d6
  1258.     move.w    d7,d1
  1259.     move.w    .scale(pc),d2
  1260.     add.w    .octave(pc),d2
  1261.     lsl.w    d2,d1
  1262.     lsr.w    #8,d1
  1263.     move.w    d1,d2
  1264.     addq.w    #1,d2
  1265.     and.w    d4,d2
  1266.     move.w    .lw(pc),d3
  1267.     lsl.w    d3,d1
  1268.     lsl.w    d3,d2
  1269.     lea    (a1,d1.w*4),a2            ; a2: upper horizontal
  1270.     lea    (a1,d2.w*4),a3            ; a3: lower horizontal
  1271.  
  1272. ; Calculate yfrac.
  1273.     move.w    .scale(pc),d2
  1274.     add.w    .octave(pc),d2
  1275.     move.w    d7,d5
  1276.     lsl.w    d2,d5
  1277.     andi.w    #$00FF,d5            ; d5.b=yfrac
  1278.     move.l    d5,a4                ; a4=yfrac
  1279.     move.w    d4,-(sp)
  1280.  
  1281. ; Interpolate an inbetween horizontal.
  1282. .xloop2:movem.w    d6/d7,-(sp)
  1283.     move.l    a4,d4
  1284.  
  1285.     move.w    (a2)+,d0
  1286.     move.w    (a3)+,d1
  1287.     move.w    (a2)+,d2
  1288.     move.w    (a3)+,d3
  1289.     bsr    Texture.interpolate
  1290.  
  1291.     move.w    .octave(pc),d1
  1292.     subq.w    #1,d1
  1293.     asr.w    d1,d0
  1294.     bpl.s    .pos
  1295.     neg.w    d0
  1296. .pos:    lsr.w    #8,d0
  1297.     bcc.s    .rounded
  1298.     addq.w    #1,d0
  1299. .rounded:
  1300.     add.b    d0,(a0)+
  1301.  
  1302.     movem.w    (sp)+,d6/d7
  1303.     dbf    d6,.xloop2
  1304.  
  1305.     move.w    (sp)+,d4
  1306.     dbf    d7,.yloop2
  1307.  
  1308.     subq.w    #1,.octave
  1309.     bgt    .octave_loop
  1310.  
  1311. .end:    rts
  1312.  
  1313. .scale:    DC.W    0
  1314. .octave:DC.W    0
  1315. .width:    DC.W    0
  1316. .lw:    DC.W    0
  1317.  
  1318. .p1:    DC.W    0,0,0
  1319. .p2:    DC.W    0,0,0
  1320.  
  1321. .texture:
  1322.     DC.L    0
  1323.  
  1324. ;======== data
  1325.  
  1326.     DATA
  1327.  
  1328. FlareGen.greenInstTable:
  1329.     DC.W    (.end-.start)/4-1
  1330.     DC.W    6
  1331. .start:    DC.L    $00000000
  1332.     DC.L    $007F0000
  1333.     DC.L    $00FF0000
  1334.     DC.L    $7FFF007F
  1335.     DC.L    $FFFF00FF
  1336. .end:
  1337.  
  1338. FlareGen.copperInstTable:
  1339.     DC.W    (.end-.start)/4-1
  1340.     DC.W    6
  1341. .start:    DC.L    $00000000
  1342.     DC.L    $7F000000
  1343.     DC.L    $FF7F0000
  1344.     DC.L    $FFFF007F
  1345.     DC.L    $FFFF00FF
  1346. .end:
  1347.  
  1348. FlareGen.goldInstTable:
  1349.     DC.W    (.end-.start)/4-1
  1350.     DC.W    5
  1351. .start:    DC.L    $00000000
  1352.     DC.L    $5F1F0000
  1353.     DC.L    $9F5F0000
  1354.     DC.L    $CF9F0000
  1355.     DC.L    $FFFF0000
  1356.     DC.L    $FFFF00FF
  1357.     DC.L    $FFFF00FF
  1358.     DC.L    $FFFF00FF
  1359.     DC.L    $FFFF00FF
  1360. .end:
  1361.  
  1362. FlareGen.iceInstTable:
  1363.     DC.W    (.end-.start)/4-1
  1364.     DC.W    5
  1365.     IFNE    1
  1366. .start:    DC.L    $7F00007F
  1367.     DC.L    $FF0000FF
  1368.     DC.L    $7F0000BF
  1369.     DC.L    $0000007F
  1370.     DC.L    $0000003F
  1371.     DC.L    $00000000
  1372.     DC.L    $00000000
  1373.     DC.L    $00000000
  1374.     DC.L    $00000000
  1375. .end:
  1376.     ELSE
  1377. .start:    DC.L    $0000001F
  1378.     DC.L    $0000007F
  1379.     DC.L    $3F0000BF
  1380.     DC.L    $7F0000FF
  1381.     DC.L    $BF0000FF
  1382.     DC.L    $FF3f00FF
  1383.     DC.L    $FF7f00FF
  1384.     DC.L    $FFff00FF
  1385.     DC.L    $FFFF00FF
  1386. .end:
  1387.     ENDC
  1388.  
  1389. FlareGen.chromeInstTable:
  1390.     DC.W    (.end-.start)/4-1
  1391.     DC.W    5
  1392. .start:    DC.L    $0F000000
  1393.     DC.L    $4F2F002F
  1394.     DC.L    $847F007F
  1395.     DC.L    $C4BF00BF
  1396.     DC.L    $FFFF00FF
  1397.     DC.L    $FFFF00FF
  1398.     DC.L    $FFFF00FF
  1399.     DC.L    $FFFF00FF
  1400.     DC.L    $FFFF00FF
  1401. .end:
  1402.  
  1403. FlareGen.blueInstTable:
  1404.     DC.W    (.end-.start)/4-1
  1405.     DC.W    5
  1406. .start:    DC.L    $0000001F
  1407.     DC.L    $1f1f00dF
  1408.     DC.L    $7f7f00ff
  1409.     DC.L    $afaf00ff
  1410.     DC.L    $fFfF00fF
  1411.     DC.L    $FFFF00FF
  1412.     DC.L    $FFFF00FF
  1413.     DC.L    $FFFF00FF
  1414.     DC.L    $FFFF00FF
  1415. .end:
  1416.  
  1417. FlareGen.blue2InstTable:
  1418.     DC.W    (.end-.start)/4-1
  1419.     DC.W    6
  1420. .start:    DC.L    $0000005F
  1421.     DC.L    $0000007F
  1422.     DC.L    $0000009f
  1423.     DC.L    $000000df
  1424.     DC.L    $000000fF
  1425. .end:
  1426.  
  1427. FlareGen.fogInstTable:
  1428.     DC.W    (.end-.start)/4-1
  1429.     DC.W    5
  1430. .start:    DC.L    $0018000f
  1431.     DC.L    $3840003c
  1432.     DC.L    $7f880084
  1433.     DC.L    $bfc800c4
  1434.     DC.L    $fFfF00fF
  1435.     DC.L    $FFFF00FF
  1436.     DC.L    $FFFF00FF
  1437.     DC.L    $FFFF00FF
  1438.     DC.L    $FFFF00FF
  1439. .end:
  1440.  
  1441. ; todo: log 4 steps..
  1442. FlareGen.grayInstTable:
  1443.     DC.W    (.end-.start)/4-1
  1444.     DC.W    5
  1445. .start:    DC.L    $00000000
  1446.     DC.L    $3f44003f
  1447.     DC.L    $887f007f
  1448.     DC.L    $bfb800bf
  1449.     DC.L    $fFf800f8
  1450.     DC.L    $FFFF00FF
  1451.     DC.L    $FFFF00FF
  1452.     DC.L    $FFFF00FF
  1453.     DC.L    $FFFF00FF
  1454. .end:
  1455.  
  1456. FlareGen.grInstTable:
  1457.     DC.W    (.end-.start)/4-1
  1458.     DC.W    6
  1459. .start:    DC.L    $00000000
  1460.     DC.L    $3f3f003f
  1461.     DC.L    $7f7f007f
  1462.     DC.L    $dfdf00df
  1463.     DC.L    $fFfF00fF
  1464. .end:
  1465.  
  1466. Texture.crapInstTable:
  1467.     DC.W    (.end-.start)/4-1
  1468.     DC.W    5
  1469. .start:    DC.L    $00000000
  1470.     DC.L    $00ff0000
  1471.     DC.L    $dfff0000
  1472.     DC.L    $ffff007f
  1473.     DC.L    $ffff00ff
  1474.     DC.L    $ff7f00ff
  1475.     DC.L    $ff0000ff
  1476.     DC.L    $ff0000ff
  1477.     DC.L    $fF000000
  1478. .end:
  1479.  
  1480. Texture.sandInstTable:
  1481.     DC.W    (.end-.start)/4-1
  1482.     DC.W    5
  1483. .start:    DC.L    $3f1f001f
  1484.     DC.L    $3f3f001f
  1485.     DC.L    $8f7f001f
  1486.     DC.L    $dfdf003f
  1487.     DC.L    $ffff007f
  1488. .end:
  1489.  
  1490. Texture.redInstTable:
  1491.     DC.W    (.end-.start)/4-1
  1492.     IFNE    1
  1493.     DC.W    6
  1494. .start:    DC.L    $102f003f
  1495.     DC.L    $204f005f
  1496.     DC.L    $306f007f
  1497.     DC.L    $408f009f
  1498.     DC.L    $50Af00Bf
  1499. .end:
  1500.     ELSE
  1501.     DC.W    6
  1502. .start:    DC.L    $5f000000
  1503.     DC.L    $9f1f0000
  1504.     DC.L    $df3f0000
  1505.     DC.L    $ff5f0000
  1506.     DC.L    $fF7F0000
  1507. .end:
  1508.     ENDC
  1509.  
  1510. ;======== reserves
  1511.  
  1512.     BSS
  1513.  
  1514. FlareGen.greenPal:
  1515.     DS.W    256
  1516. FlareGen.copperPal:
  1517.     DS.W    256
  1518. FlareGen.goldPal:
  1519.     DS.W    256
  1520. FlareGen.icePal:
  1521.     DS.W    256
  1522. FlareGen.chromePal:
  1523.     DS.W    256
  1524. FlareGen.bluePal:
  1525.     DS.W    256
  1526. FlareGen.blue2Pal:
  1527.     DS.W    256
  1528. FlareGen.fogPal:
  1529.     DS.W    256
  1530. FlareGen.grayPal:
  1531.     DS.W    256
  1532. FlareGen.grPal:
  1533.     DS.W    256
  1534. Texture.crapPal:
  1535.     DS.W    256
  1536. Texture.sandPal:
  1537.     DS.W    128
  1538. Texture.redPal:
  1539.     DS.W    256
  1540. FlareGen.flare1:
  1541.     DS.B    FlareGen.W1*FlareGen.W1
  1542. FlareGen.flare2:
  1543.     DS.B    FlareGen.W2*FlareGen.W2
  1544. FlareGen.flare3:
  1545.     DS.B    FlareGen.W3*FlareGen.W3
  1546.  
  1547. FlareGen.goldBuffer:
  1548.     DS.W    FlareGen.WIDTH*FlareGen.WIDTH+10
  1549. FlareGen.chromeBuffer:
  1550.     DS.W    FlareGen.WIDTH*FlareGen.WIDTH+10
  1551. FlareGen.chromeFogBuffer:
  1552.     DS.W    FlareGen.WIDTH*FlareGen.WIDTH+10
  1553. FlareGen.redBuffer:
  1554.     DS.W    FlareGen.WIDTH*FlareGen.WIDTH+10
  1555. FlareGen.parelMoerBuffer:
  1556.     DS.W    FlareGen.WIDTH*FlareGen.WIDTH+10
  1557.  
  1558. Texture.xGradGrid:
  1559.     DS.B    Texture.SIZE*Texture.SIZE
  1560. Texture.yGradGrid:
  1561.     DS.B    Texture.SIZE*Texture.SIZE
  1562. Texture.heightGrid:
  1563.     DS.B    Texture.SIZE*Texture.SIZE
  1564.  
  1565. Texture.horGrid:
  1566.     DS.L    Texture.SIZE*Texture.SIZE            ; val, ygrad
  1567.  
  1568. Texture.8bTexture1:
  1569.     DS.B    256*256
  1570. Texture.8bTexture2:
  1571.     DS.B    256*256
  1572. Texture.16bTexture1:
  1573.     DS.W    256*256
  1574. Texture.16bTexture2:
  1575.     DS.W    256*256
  1576. Texture.spaceTexture:
  1577.     DS.W    10+64*64