Advertisement
Keldor314

Untitled

Apr 2nd, 2014
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
F# 26.64 KB | None | 0 0
  1. module GenerateKernel
  2.  
  3. open FlameData
  4. open FlameMarshal
  5. open Helper
  6. open System.Text.RegularExpressions
  7. open Cloo
  8.  
  9. type DecisionTree =
  10.     | Branch of float32*DecisionTree*DecisionTree
  11.     | Leaf of XformNodeLink
  12.  
  13. let generateIterateKernel flame (device:ComputeDevice) numPages=
  14.         let codeRepo = flame.xformNodeRepo
  15.         let xformRepo = flame.xformRepo
  16.         let varRepo = flame.varRepo
  17.  
  18.         let iterateCode = @"@pragmas@
  19. #define PI 3.1415926536f
  20.  
  21. constant int shift1[4] = {6, 2, 13, 3};
  22. constant int shift2[4] = {13, 27, 21, 12};
  23. constant int shift3[4] = {18, 2, 7, 13};
  24. constant unsigned int offset[4] = {4294967294, 4294967288, 4294967280, 4294967168};
  25.  
  26. @paletteSampler@
  27.  
  28. unsigned int TausStep(unsigned int z, int s1, int s2, int s3, unsigned int M)
  29. {
  30.    unsigned int b = ((z << s1) ^ z) >> s2;
  31.    return (((z & M) << s3) ^b);
  32. }
  33.  
  34. unsigned int RAND_INT(local volatile unsigned int* randStates)
  35. {
  36.    unsigned int index = get_local_id(0);
  37.    unsigned int i2 = get_local_id(0)&~(WARP_SIZE-1);
  38.    randStates[index] = TausStep(randStates[index], shift1[index&3], shift2[index&3], shift3[index&3], offset[index&3]);
  39.    return (randStates[index&(WARP_SIZE-1)+i2]^randStates[(index+1)&(WARP_SIZE-1)+i2]^randStates[(index+2)&(WARP_SIZE-1)+i2]^randStates[(index+3)&(WARP_SIZE-1)+i2]);
  40. }
  41.  
  42. #define randInt(void) RAND_INT(randStates)
  43.  
  44. unsigned int RAND_INT_WARP(local volatile unsigned int* randStates)
  45. {
  46.    unsigned int index = get_local_id(0);
  47.    unsigned int i2 = get_local_id(0)&~(WARP_SIZE-1);
  48.    randStates[index] = TausStep(randStates[index], shift1[index&3], shift2[index&3], shift3[index&3], offset[index&3]);
  49.    return (randStates[i2]^randStates[i2+1]^randStates[i2+2]^randStates[i2+3]);
  50. }
  51.  
  52. #define randIntWarp(void) RAND_INT_WARP(randStates)
  53.  
  54. float RAND_FLOAT(local volatile unsigned int* randStates)
  55. {
  56.    unsigned int y = randInt();
  57.    return as_float((y&0x007FFFFF)|0x3F800000)-1.0f;
  58. }
  59.  
  60. #define randFloat(void) RAND_FLOAT(randStates)
  61.  
  62. float RAND_FLOAT_WARP(local volatile unsigned int* randStates)
  63. {
  64.    unsigned int y = randIntWarp();
  65.    return as_float((y&0x007FFFFF)|0x3F800000)-1.0f;
  66. }
  67.  
  68. #define randFloatWarp(void) RAND_FLOAT_WARP(randStates)
  69.  
  70. #ifdef NVIDIA
  71. float4 loadPoint(int nodeIndex, local volatile unsigned int * randStates,local volatile unsigned int * pointOffset,local volatile float * pointStage, global volatile float* pointPool)
  72. {
  73.    unsigned int index = get_local_id(0);
  74.    pointOffset[index] = 4*(nodeIndex*NUM_POINTS_PER_NODE+randInt()%NUM_POINTS_PER_NODE);
  75.    for (int n = (index&~3); n < ((index&~3)+4);n++)
  76.    {
  77.        pointStage[n*4+(index&3)]=pointPool[pointOffset[n]+(index&3)];
  78.    }
  79.    return (float4)(pointStage[index*4],pointStage[index*4+1],pointStage[index*4+2],pointStage[index*4+3]);
  80. }
  81. #else
  82. float4 loadPoint(int nodeIndex, local volatile unsigned int * randStates,local volatile unsigned int * pointOffset,local volatile float * pointStage, global volatile float* pointPool)
  83. {
  84.    unsigned int index = get_local_id(0);
  85.    pointOffset[index] = 4*(nodeIndex*NUM_POINTS_PER_NODE+randInt()%NUM_POINTS_PER_NODE);
  86.    global float4 * pointSrc = (global float4 *) pointPool;
  87.    return pointSrc[pointOffset[index]/4];
  88. }
  89. #endif
  90.  
  91. @pointXchg@
  92.  
  93. @rasterizePoint@
  94.  
  95. void drawPoint(global volatile float4 ** renderBuffers, @palette@, int2 dim, float4 point, local volatile unsigned int* randStates, float opacity, constant float* flameBuffer, int palLength,local int * pageLookupTable, int numPages,int pageSize)
  96. {
  97.    int4 coords = rasterizePoint(point, dim, randStates,flameBuffer,pageLookupTable,numPages);
  98.    if ((coords.y >= 0.0f)&&(coords.y < dim.y)&&(coords.z != -1))
  99.    {
  100.        float4 color = opacity*@readPalette@;
  101.        renderBuffers[coords.z][coords.y*(int)ceil(((float)dim.x)/((float)numPages))+coords.x]+=color;
  102.    }
  103. }
  104.  
  105. @var@
  106. @nextXform@
  107.  
  108. kernel void renderBatch(global unsigned int* randSeeds, global unsigned int* discardStates, global volatile float *pointPool, global int* stateStacks, global int* oldStateIndices, global int* pageLookups, constant float* flameBuffer, @palette@, int xdim, int ydim, int palLength, int numPages, int pageSize,@pageBuffers@)
  109. {  
  110.    global volatile float4 * renderBuffers[@pageCount@];@assignPageBufferPointers@
  111.    int2 dimension = (int2)(xdim,ydim);
  112.    local volatile unsigned int randStates[BLOCK_SIZE];
  113.    randStates[get_local_id(0)]=randSeeds[get_global_id(1)*get_global_size(0)+get_global_id(0)];
  114.    local volatile unsigned int pointOffset[BLOCK_SIZE];
  115.    local volatile float pointStage[BLOCK_SIZE*4];
  116.    local int stateStack[BLOCK_SIZE];
  117.    local int pageLookupTable[PAGE_LOOKUP_TABLE_LENGTH];
  118.    const int warpOffset = get_local_id(0)&~(WARP_SIZE-1);
  119.    float4 oldPoint;
  120.    int dstate = 0;
  121.    float rnd = 0.0f;
  122.    float4 point;
  123.    float colIndex;
  124.    float opacity;
  125.    for (int n = 0; n < PAGE_LOOKUP_TABLE_LENGTH; n += get_global_size(0))
  126.    {
  127.        int i = n+get_local_id(0);
  128.        if (i < PAGE_LOOKUP_TABLE_LENGTH)
  129.            pageLookupTable[i] = pageLookups[i];
  130.    }
  131.    barrier(CLK_LOCAL_MEM_FENCE);
  132.    unsigned int discard = discardStates[(get_global_id(1)*get_global_size(0)+get_global_id(0))>>5];
  133.    unsigned int iterCount;
  134.    stateStack[get_local_id(0)] = stateStacks[get_global_id(1)*get_global_size(0)+get_global_id(0)];
  135.    unsigned int state=oldStateIndices[(get_global_id(1)*get_global_size(0)+get_global_id(0))>>5];
  136.    unsigned int nextState=0;
  137.    rnd = randFloatWarp();
  138.    switch (stateStack[state+warpOffset])
  139.    {
  140.    @branch@
  141.    }
  142.    for (int iterations=0; iterations<MAX_ITERATIONS; iterations++)
  143.    {
  144.        switch (nextState)
  145.        {
  146.        @nextNode@
  147.        }
  148.    }
  149.    randSeeds[get_global_id(1)*get_global_size(0)+get_global_id(0)]=randStates[get_local_id(0)];
  150.    stateStacks[get_global_id(1)*get_global_size(0)+get_global_id(0)]=stateStack[get_local_id(0)];
  151.    oldStateIndices[(get_global_id(1)*get_global_size(0)+get_global_id(0))/WARP_SIZE] = state;
  152.    discardStates[(get_global_id(1)*get_global_size(0)+get_global_id(0))/WARP_SIZE] = discard;
  153. }"
  154.         let selectXformWrapper = "if (rnd <= (float)@weight@)
  155. @TAB@{
  156. @TAB@\t@left@
  157. @TAB@}
  158. @TAB@else
  159. @TAB@{
  160. @TAB\t@right@
  161. @TAB@}"
  162.  
  163.  
  164.         let xformNodeWrapper = @"case @nodeIndex@:
  165.        {
  166.            if (discard != 0)
  167.                @loadPoint@
  168.            iterCount = as_int(oldPoint.w)&0xFF800000;
  169.            colIndex = as_float((as_int(oldPoint.w)&0x007FFFFF)|0x3F800000) -1.0f;
  170.            oldPoint.w=colIndex;
  171.            point = @xform@(oldPoint, randStates, flameBuffer);
  172.            if (iterCount > (100<<23))
  173.            {
  174.                if (opacity!=0.0f)
  175.                    drawPoint(renderBuffers,palette,dimension,point,randStates,opacity,flameBuffer,palLength,pageLookupTable,numPages,pageSize);
  176.            }
  177.            else
  178.                iterCount += 1<<23;
  179.            if (isfinite(point.x+point.y+point.z)==0)
  180.            {
  181.                point.x=randFloat();
  182.                point.y=randFloat();
  183.                point.z=randFloat();
  184.                point.w=randFloat();
  185.                iterCount=85<<23;
  186.            }
  187.            point.w=as_float(iterCount|(as_int(point.w+1.0f)&0x007FFFFF));
  188.            stateStack[state+warpOffset]=@nodeIndex@;
  189.            @loadPoint@
  190.            @storePoint@
  191.            rnd = randFloatWarp();
  192.            @continue@
  193.        }break;
  194.  
  195.    @nextNode@"
  196.  
  197.         let branchWrapper = "if (rnd <= (float)@weight@)
  198. @TAB@{
  199. @TAB@\t@left@
  200. @TAB@}
  201. @TAB@else
  202. @TAB@{
  203. @TAB@\t@right@
  204. @TAB@}"
  205.         let tab = "\t"
  206.  
  207.  
  208.         let switchCaseWrapper = "state += @state@;
  209. @TAB@dstate = @state@;
  210. @TAB@state &= (WARP_SIZE-1);
  211. @TAB@opacity = @opacity@;
  212. @TAB@discard = @discard@;
  213. @TAB@nextState = @nodeIndex@;"
  214.  
  215.         let initialSwitchCaseWrapper = "case @nodeIndex@:
  216.    {
  217.        oldPoint = loadPoint(@nodeIndex@,randStates,pointOffset,pointStage,pointPool);
  218.        @continue@
  219.    }break;
  220.    @branch@"
  221.  
  222.         let xformWrapper = @"
  223. float4 @xform@(float4 point, local unsigned int * randStates, constant float* flameBuffer)
  224. {
  225.    float4 outpos = (float4)(0.0f,0.0f,0.0f,0.0f);
  226.    float4 pos = point.xxxx*(float4)(@a@,@e@,@i@,0.0f)+point.yyyy*(float4)(@b@,@f@,@j@,0.0f)+point.zzzz*(float4)(@c@,@g@,@k@,0.0f)+(float4)(@d@,@h@,@l@,0.0f);
  227.    float r2D2 = pos.x*pos.x+pos.y*pos.y;
  228.    float r2 = pos.x*pos.x+pos.y*pos.y+pos.z*pos.z;
  229.    float r2D = sqrt(r2D2);
  230.    float r = sqrt(r2);
  231.    float theta = atan2(pos.y,pos.x);
  232.    float phi = atan2(pos.z,r2D);
  233.    float psi = atan2(pos.x,pos.y);
  234.    @var@
  235.    float col = mix(point.w,@colIndex@,@colSpeed@);
  236.    return (float4)(outpos.x,outpos.y,outpos.z,col);
  237. }
  238. @nextXform@"
  239.  
  240.         let varWrapper = @"outpos+=((float)@weight@)*@insideVar@(pos@varParam@, @weight@, r2, r, r2D2, r2D, theta, phi, psi, randStates, flameBuffer,@offset@);
  241.    @var@"
  242.         let varCodeWrapper = @"float4 @insideVar@(float4 pos@varParam@, float weight, float r2, float r, float r2D2, float r2D, float theta, float phi, float psi, local unsigned int * randStates, constant float* flameBuffer,int offset)
  243. {
  244.    float xout,yout,zout=0.0f;
  245.    float x = pos.x;
  246.    float y = pos.y;
  247.    float z = pos.z;
  248.    float a = flameBuffer[offset];
  249.    float b = flameBuffer[offset+1];
  250.    float c = flameBuffer[offset+2];
  251.    float d = flameBuffer[offset+3];
  252.    float e = flameBuffer[offset+4];
  253.    float f = flameBuffer[offset+5];
  254.    float g = flameBuffer[offset+6];
  255.    float h = flameBuffer[offset+7];
  256.    float i = flameBuffer[offset+8];
  257.    float j = flameBuffer[offset+9];
  258.    float k = flameBuffer[offset+10];
  259.    float l = flameBuffer[offset+11];
  260.    zout=z;
  261.    @varCode@
  262.    return (float4) (xout,yout,zout,0.0f);
  263. }
  264.  
  265. @var@"
  266.         let storeCode,loadCode,exchangePoints,pragmas = (   @"storePoint(point,pointOffset,pointStage,pointPool);",
  267.                                                             @"oldPoint = loadPoint(stateStack[state+warpOffset],randStates,pointOffset,pointStage,pointPool);",
  268.                                                             @"#ifdef NVIDIA
  269. void storePoint(float4 point, local volatile unsigned int * pointOffset,local volatile float * pointStage, global volatile float* pointPool)
  270. {
  271.    unsigned int index = get_local_id(0);
  272.    pointStage[index*4] = point.x;
  273.    pointStage[index*4+1]=point.y;
  274.    pointStage[index*4+2]=point.z;
  275.    pointStage[index*4+3]=point.w;
  276.    for (int n = (index&~3); n < ((index&~3)+4); n++)
  277.    {
  278.        pointPool[pointOffset[n]+(index&3)]=pointStage[n*4+(index&3)];
  279.    }
  280. }
  281. #else
  282. void storePoint(float4 point, local volatile unsigned int * pointOffset,local volatile float * pointStage, global volatile float* pointPool)
  283. {
  284.    unsigned int index = get_local_id(0);
  285.    global float4 * pointDest = (global float4 *) pointPool;
  286.    pointDest[pointOffset[index]/4] = point;
  287. }
  288. #endif",
  289.                                                                 @"#pragma OPENCL_EXTENSION cl_khr_fp64 : disable" )
  290.         //Not 64bit safe for very large GPU memory!
  291.         let rasterizePoint = "int4 rasterizePoint(float4 point, int2 dim, local volatile unsigned int* randStates, constant float* flameBuffer, local int* pageLookupTable, int numPages)
  292. {
  293.    point = point+(float4)(@d@,@h@,@l@,0.0f);
  294.    float4 pos = point.xxxx*(float4)(@a@,@e@,@i@,0.0f)+point.yyyy*(float4)(@b@,@f@,@j@,0.0f)+point.zzzz*(float4)(@c@,@g@,@k@,0.0f);
  295.    float xpos = /*@numSlices*pixelAdjust@*/((float)numPages)*(0.5f+0.5f*pos.x);
  296.    float slice = floor(xpos);
  297.    int page = -1;
  298.    if ((slice < numPages) && (slice >=0))
  299.        page = pageLookupTable[(int) slice];
  300.    float xd = (xpos-slice)*ceil(((float)dim.x)/((float)numPages));
  301.    float yd = ((0.5f+0.5f*pos.y))*(float)dim.y;
  302.    return (int4)((int)xd,(int)yd,page,0);
  303. }"
  304.  
  305.         let readPalette =   if device.ImageSupport = true then
  306.                                 @"read_imagef(palette, paletteSampler, (float2)(point.w,0.0f))"
  307.                             else
  308.                                 @"read_image(palette,palLength,point.w)"
  309.         let paletteSampler =    if device.ImageSupport = true then
  310.                                     @"const sampler_t paletteSampler = CLK_NORMALIZED_COORDS_TRUE | CLK_FILTER_LINEAR;"
  311.                                 else
  312.                                     @"float4 read_image(global float * image, int length, float index)
  313. {
  314.    float clampedIndex = index - floor(index);
  315.    float scaledIndex = clampedIndex*(float)length;
  316.    int iLow = floor(scaledIndex);
  317.    int iHigh = ceil(scaledIndex);
  318.    float iFract = scaledIndex - floor(scaledIndex);
  319.    float4 c0 = ((global float4 *) image)[iLow];
  320.    float4 c1 = ((global float4 *) image)[iHigh];
  321.    return iFract*c1+(1.0f-iFract)*c0;
  322. }"
  323.         let palette =   if device.ImageSupport=true then
  324.                             @"read_only image2d_t palette"
  325.                         else
  326.                             @"global float* palette"
  327.            
  328.  
  329.         let labelRX = new Regex "@label@"
  330.         let weightRX = new Regex "@weight@"
  331.         let branchRX = new Regex "@branch@"
  332.         let tabRX = new Regex "@TAB@"
  333.         let leftRX = new Regex "@left@"
  334.         let rightRX = new Regex "@right@"
  335.         let nodeIndexRX = new Regex "@nodeIndex@"
  336.         let opacityRX = new Regex "@opacity@"
  337.         let stateRX = new Regex "@state@"
  338.         let discardRX = new Regex "@discard@"
  339.         let xformRX = new Regex "@xform@"
  340.         let nextXformRX = new Regex "@nextXform@"
  341.         let nextNodeRX = new Regex "@nextNode@"
  342.         let varRX = new Regex "@var@"
  343.         let insideVarRX = new Regex "@insideVar@"
  344.         let varCodeRX = new Regex "@varCode@"
  345.         let colIndexRX = new Regex "@colIndex@"
  346.         let colSpeedRX = new Regex "@colSpeed@"
  347.         let varParamRX = new Regex "@varParam@"
  348.         let pointXchgRX = new Regex "@pointXchg@"
  349.         let storePointRX = new Regex "@storePoint@"
  350.         let loadPointRX = new Regex "@loadPoint@"
  351.         let numNodesRX = new Regex "@numNodes@"
  352.         let pragmasRX = new Regex "@pragmas@"
  353.         let rasterizePointRX = new Regex "@rasterizePoint@"
  354.         let selectXformRX = new Regex "@selectXform@"
  355.         let offsetRX = new Regex "@offset@"
  356.         let continueRX = new Regex "@continue@"
  357.         let readPaletteRX = new Regex "@readPalette@"
  358.         let paletteSamplerRX = new Regex "@paletteSampler@"
  359.         let paletteRX = new Regex "@palette@"
  360.         let numSlices_pixelAdjustRX = new Regex "@numSlices*pixelAdjust@"
  361.         let pageBuffersRX = new Regex "@pageBuffers@"
  362.         let pageCountRX = new Regex "@pageCount@"
  363.         let assignPageBufferPointersRX = new Regex "@assignPageBufferPointers@"
  364.         let aRX = new Regex "@a@"
  365.         let bRX = new Regex "@b@"
  366.         let cRX = new Regex "@c@"
  367.         let dRX = new Regex "@d@"
  368.         let eRX = new Regex "@e@"
  369.         let fRX = new Regex "@f@"
  370.         let gRX = new Regex "@g@"
  371.         let hRX = new Regex "@h@"
  372.         let iRX = new Regex "@i@"
  373.         let jRX = new Regex "@j@"
  374.         let kRX = new Regex "@k@"
  375.         let lRX = new Regex "@l@"
  376.  
  377.  
  378.         let fromFlameBuffer offset =
  379.             "flameBuffer["+(string offset)+"]"
  380.         let fromFlameBufferInt offset =
  381.             "as_int(flameBuffer["+(string offset)+"])"
  382.  
  383.         let pageBufferDecls numPages=
  384.             let rec pageBufferDecls numPages code index =
  385.                 if index = numPages then
  386.                     code
  387.                 else
  388.                     code + pageBufferDecls numPages (sprintf ",global float * renderBuffer%i" index) (index+1)
  389.             pageBufferDecls numPages "global float * renderBuffer0" 1
  390.         let pageBufferPointerAssignments numPages =
  391.             let rec pageBufferPointerAssignments numPages code index =
  392.                 if index = numPages then
  393.                     code
  394.                 else
  395.                     code + pageBufferPointerAssignments numPages (sprintf "\n\trenderBuffers[%i] = (global float4 *) renderBuffer%i;" index index) (index+1)
  396.             pageBufferPointerAssignments numPages "" 0
  397.  
  398.         let buildDecisionTreeCode (xformNode:XformNodeLink list) (initial:bool) (code:string)=
  399.             let getWeight decisionTree =
  400.                 match decisionTree with
  401.                 | Leaf(n) ->
  402.                     n.weight
  403.                 | Branch(n,_,_) ->
  404.                     n
  405.             let buildDecisionTree (xformNode:XformNodeLink list)=
  406.                 let rec buildDecisionTree (decisionTree:DecisionTree list) =
  407.                     match decisionTree with
  408.                     | [_] ->
  409.                         decisionTree
  410.                     | _ ->
  411.                         let sortedTree = decisionTree |> List.sortBy getWeight
  412.                         buildDecisionTree (Branch(((getWeight sortedTree.Head) + (getWeight sortedTree.Tail.Head)),sortedTree.Head,sortedTree.Tail.Head)::sortedTree.Tail.Tail)
  413.                 let decisionTree = [for node in xformNode -> Leaf(node)]
  414.                 buildDecisionTree decisionTree
  415.  
  416.             let decisionTree = (buildDecisionTree xformNode).Head
  417.             let rec buildDecisionTreeCode (decisionTree:DecisionTree) (code:string) (tabStop:int) (weight:float32):string=
  418.                 match decisionTree with
  419.                 | Branch(w,left,right) ->
  420.                     let l = buildDecisionTreeCode left code (tabStop+1) weight
  421.                     let r = buildDecisionTreeCode right code (tabStop+1) (weight+getWeight left)
  422.                     ((((code, string (weight+(getWeight left))) |>
  423.                         weightRX.Replace , l) |>
  424.                         leftRX.Replace, r) |>
  425.                         rightRX.Replace, (tab |> String.replicate(tabStop))) |>
  426.                         tabRX.Replace
  427.                 | Leaf(nodeLink) ->
  428.                     ((((((( if initial=true then initialSwitchCaseWrapper else switchCaseWrapper),
  429.                             nodeLink.next.name) |> labelRX.Replace,
  430.                             (tab |> String.replicate(tabStop))) |> tabRX.Replace,
  431.                             fromFlameBufferInt  (nodeLink.offset+1)) |> stateRX.Replace,
  432.                             fromFlameBufferInt  (nodeLink.offset+3)) |> discardRX.Replace,
  433.                             fromFlameBuffer     (nodeLink.offset+2)) |> opacityRX.Replace,
  434.                             string nodeLink.next.index) |> nodeIndexRX.Replace
  435.             (code,(buildDecisionTreeCode decisionTree branchWrapper 1 0.0f))
  436.  
  437.         let rec buildInitialSwitchCode (codeSegs:string list) (code:string) =
  438.             match codeSegs with
  439.             | head::tail ->
  440.                 branchRX.Replace(code,codeSegs.Head) |> buildInitialSwitchCode codeSegs.Tail
  441.             | _ ->
  442.                 branchRX.Replace(code,"")
  443.  
  444.         let rec buildXformNodeCode (codeSegs:string list) (code:string) =
  445.             match codeSegs with
  446.             | head::tail ->
  447.                 nextNodeRX.Replace(code,codeSegs.Head) |> buildXformNodeCode codeSegs.Tail
  448.             | _ ->
  449.                 nextNodeRX.Replace(code, "")
  450.  
  451.         let rec buildVarParams (varParamVals:float32 list) (code:string) offset=
  452.             match varParamVals with
  453.             | head::tail ->
  454.                 (code,","+(fromFlameBuffer offset)+"@varParam@") |> varParamRX.Replace |> buildVarParams varParamVals.Tail <| offset+1
  455.             | _ ->
  456.                 (code,"") |> varParamRX.Replace,offset
  457.  
  458.         let rec buildVarCalls (vars:Variation list) varOffset baseOffset (code:string)=
  459.             match vars with
  460.             | head::tail ->
  461.                 let vc,newOffset = buildVarParams (vars.Head.parameters) (( varWrapper,vars.Head.vardef.name) |>
  462.                                     insideVarRX.Replace) (varOffset+1)
  463.                 let varCode = ((vc,fromFlameBuffer varOffset) |>
  464.                                 weightRX.Replace,
  465.                                 string baseOffset) |> offsetRX.Replace
  466.                 (code,varCode) |> varRX.Replace |> buildVarCalls (vars.Tail) newOffset baseOffset
  467.             | _ ->
  468.                 (code,"") |> varRX.Replace
  469.  
  470.         let rec buildXformCode (codeSegs:string list) (code:string) =
  471.             match codeSegs with
  472.             | head::tail ->
  473.                 nextXformRX.Replace(code,codeSegs.Head) |> buildXformCode codeSegs.Tail
  474.             | _ ->
  475.                 nextXformRX.Replace(code, "")
  476.  
  477.         let rec buildVarCode (vars:VariationDef list) (code:string) =
  478.             let genVarCode (var:VariationDef) =
  479.                 let rec buildVarParams (parms:string list) (code:string) =
  480.                     match parms with
  481.                     | head::tail ->
  482.                         (code,", float "+parms.Head+"@varParam@") |> varParamRX.Replace |> buildVarParams parms.Tail
  483.                     | _ ->
  484.                         (code,"") |> varParamRX.Replace
  485.                 ((  varCodeWrapper,var.code) |>
  486.                     varCodeRX.Replace,var.name) |>
  487.                     insideVarRX.Replace |>
  488.                     buildVarParams var.parameters
  489.             match vars with
  490.             | head::tail ->
  491.                 (code,genVarCode vars.Head) |> varRX.Replace |> buildVarCode vars.Tail
  492.             | _ ->
  493.                 (code,"") |> varRX.Replace
  494.        
  495.         let initialXformNodeList = [for node in flame.xformNodeRepo.Values ->
  496.                                         node]
  497.         let initialSwitchCaseCodeSegs = initialXformNodeList |> List.map (fun node -> (initialSwitchCaseWrapper,string node.index) |>
  498.                                                                                        nodeIndexRX.Replace |>
  499.                                                                                        buildDecisionTreeCode [for n in node.next -> n] false |> continueRX.Replace)
  500.         let xformNodeCodeSegs = [   for n in codeRepo do
  501.                                     yield
  502.                                         (((((   xformNodeWrapper,n.Value.self.name) |> xformRX.Replace,
  503.                                                 string n.Value.index)               |> labelRX.Replace,
  504.                                                 storeCode)                          |> storePointRX.Replace,
  505.                                                 loadCode)                           |> loadPointRX.Replace,
  506.                                                 string n.Value.index)               |> nodeIndexRX.Replace |>
  507.                                                 buildDecisionTreeCode [for node in n.Value.next -> node] false |> continueRX.Replace]
  508.         let xformCodeSegs = [   for n in xformRepo do
  509.                                 let t = n.Value.coefs
  510.                                 let a,b,c,d,e,f,g,h,i,j,k,l = (t.a,t.b,t.c,t.d,t.e,t.f,t.g,t.h,t.i,t.j,t.k,t.l)
  511.                                 let baseOffset = n.Value.offset
  512.                                 yield
  513.                                     ((((((((((((((( xformWrapper,n.Value.name)        |> xformRX.Replace,
  514.                                                     fromFlameBuffer <| baseOffset)    |> aRX.Replace,
  515.                                                     fromFlameBuffer <| baseOffset+1)  |> bRX.Replace,
  516.                                                     fromFlameBuffer <| baseOffset+2)  |> cRX.Replace,
  517.                                                     fromFlameBuffer <| baseOffset+3)  |> dRX.Replace,
  518.                                                     fromFlameBuffer <| baseOffset+4)  |> eRX.Replace,
  519.                                                     fromFlameBuffer <| baseOffset+5)  |> fRX.Replace,
  520.                                                     fromFlameBuffer <| baseOffset+6)  |> gRX.Replace,
  521.                                                     fromFlameBuffer <| baseOffset+7)  |> hRX.Replace,
  522.                                                     fromFlameBuffer <| baseOffset+8)  |> iRX.Replace,
  523.                                                     fromFlameBuffer <| baseOffset+9)  |> jRX.Replace,
  524.                                                     fromFlameBuffer <| baseOffset+10) |> kRX.Replace,
  525.                                                     fromFlameBuffer <| baseOffset+11) |> lRX.Replace,
  526.                                                     fromFlameBuffer <| baseOffset+12) |> colIndexRX.Replace,
  527.                                                     fromFlameBuffer <| baseOffset+13) |> colSpeedRX.Replace |>
  528.                                                     buildVarCalls n.Value.vars (baseOffset+14) baseOffset  ]
  529.         let buildRasterizeCode =
  530.             let t = flame.viewport.minimumCoverage |> invertAffine
  531.             let a,b,c,d,e,f,g,h,i,j,k,l = (t.a,t.b,t.c,t.d,t.e,t.f,t.g,t.h,t.i,t.j,t.k,t.l)
  532.             let baseOffset = flame.size-12
  533.             ((((((((((((    rasterizePoint,
  534.                             fromFlameBuffer <| baseOffset)    |> aRX.Replace,
  535.                             fromFlameBuffer <| baseOffset+1)  |> bRX.Replace,
  536.                             fromFlameBuffer <| baseOffset+2)  |> cRX.Replace,
  537.                             fromFlameBuffer <| baseOffset+3)  |> dRX.Replace,
  538.                             fromFlameBuffer <| baseOffset+4)  |> eRX.Replace,
  539.                             fromFlameBuffer <| baseOffset+5)  |> fRX.Replace,
  540.                             fromFlameBuffer <| baseOffset+6)  |> gRX.Replace,
  541.                             fromFlameBuffer <| baseOffset+7)  |> hRX.Replace,
  542.                             fromFlameBuffer <| baseOffset+8)  |> iRX.Replace,
  543.                             fromFlameBuffer <| baseOffset+9)  |> jRX.Replace,
  544.                             fromFlameBuffer <| baseOffset+10) |> kRX.Replace,
  545.                             fromFlameBuffer <| baseOffset+11) |> lRX.Replace
  546.         let finalCode = ((((((((((  buildXformCode xformCodeSegs <| buildXformNodeCode xformNodeCodeSegs iterateCode |>
  547.                                     buildVarCode  varRepo,exchangePoints) |>
  548.                                     pointXchgRX.Replace, string flame.xformNodeRepo.Values.Count) |>
  549.                                     numNodesRX.Replace, pragmas) |>
  550.                                     pragmasRX.Replace, buildRasterizeCode) |>
  551.                                     rasterizePointRX.Replace, readPalette) |>
  552.                                     readPaletteRX.Replace, paletteSampler) |>
  553.                                     paletteSamplerRX.Replace, palette) |>
  554.                                     paletteRX.Replace |>
  555.                                     buildInitialSwitchCode initialSwitchCaseCodeSegs, pageBufferDecls <| numPages) |>
  556.                                     pageBuffersRX.Replace, string <| numPages) |>
  557.                                     pageCountRX.Replace, pageBufferPointerAssignments <| numPages) |>
  558.                                     assignPageBufferPointersRX.Replace
  559.  
  560.         finalCode
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement