From 0af25b4cf5137ae9802b7bac713b5e8354ad514d Mon Sep 17 00:00:00 2001 From: charlottebe Date: Fri, 27 Mar 2026 19:47:20 -0600 Subject: [PATCH 1/3] Added Interlacing Blend operation files and the description doc --- .../interlacing_blend/interlacing_blend.ts | 357 ++++++++++++++++++ .../src/operations/operation_list.ts | 1 + .../cloth/interlacing_blend/index.md | 31 ++ 3 files changed, 389 insertions(+) create mode 100644 packages/adacad-drafting-lib/src/operations/interlacing_blend/interlacing_blend.ts create mode 100644 projects/docs/docs/reference/operations/cloth/interlacing_blend/index.md diff --git a/packages/adacad-drafting-lib/src/operations/interlacing_blend/interlacing_blend.ts b/packages/adacad-drafting-lib/src/operations/interlacing_blend/interlacing_blend.ts new file mode 100644 index 000000000..f04b87372 --- /dev/null +++ b/packages/adacad-drafting-lib/src/operations/interlacing_blend/interlacing_blend.ts @@ -0,0 +1,357 @@ +import { createCell, Draft, getHeddle, initDraftFromDrawdown, updateWarpSystemsAndShuttles, updateWeftSystemsAndShuttles, warps, wefts } from "../../draft"; +import { defaults, lcm } from "../../utils"; +import { clothOp } from "../categories"; +import { getAllDraftsAtInlet, getOpParamValById, parseDraftNames } from "../operations"; +import { NumParam, OperationInlet, OpParamVal, OpInput, Operation, OpMeta, SelectParam } from "../types"; + +const name="interlacing_blend"; + +const meta: OpMeta={ + displayname:"interlacing blend", + desc:"Creates a new draft by placing draft A and draft B on either side of a blend region. The inputs are repeated to a common size, and the blend region transitions between them based on the selected direction, center, and length.", + categories:[clothOp], + advanced:true, + old_names:["interlacing blend"] +}; + +//PARAMS +const blendRegionLength: NumParam={ + name:"blend region length", + type:"number", + min:1, + max:10000, + value:10, + dx:"the length of the blend region" +}; + +const blendCenterPercent: NumParam={ + name:"blend center percent", + type:"number", + min:0, + max:100, + value:50, + dx:"the center of the blend transition as a percent from 0 to 100" +}; + +const changePatternSize: NumParam={ + name:"change pattern size", + type:"number", + min:-10000, + max:10000, + value:0, + dx:"adds to or subtracts from the common repeated pattern size" +}; + +const blendDirection: SelectParam={ + name:"blend direction", + type:"select", + value:0, + selectlist:[ + {name:"horizontal", value:0}, + {name:"vertical", value:1} + ], + dx:"controls whether the blend runs horizontally or vertically" +}; + +const params=[blendRegionLength, blendCenterPercent, changePatternSize, blendDirection]; + +//INLETS +const draft_a: OperationInlet={ + name:"a", + type:"static", + value:null, + uses:"draft", + dx:"the first draft to blend", + num_drafts:1 +}; + +const draft_b: OperationInlet={ + name:"b", + type:"static", + value:null, + uses:"draft", + dx:"the second draft to blend", + num_drafts:1 +}; + +const inlets=[draft_a, draft_b]; + +let getCommonSize=(patternAOrg:Draft, patternBOrg:Draft, patternSizeChange:number)=>{ + let drafts = [patternAOrg, patternBOrg]; + let commonW = lcm(drafts.map(draft=>warps(draft.drawdown)).filter(size=>size>0), defaults.lcm_timeout)+patternSizeChange; + let commonH = lcm(drafts.map(draft=>wefts(draft.drawdown)).filter(size=>size>0), defaults.lcm_timeout)+patternSizeChange; + let adjustedCommonW = commonW; + let adjustedCommonH = commonH; + + if(adjustedCommonW<1)adjustedCommonW=1; + if(adjustedCommonH<1)adjustedCommonH=1; + + return {commonW:adjustedCommonW, commonH:adjustedCommonH}; +}; + +let repeatPatternToSize=(patternOrg:Draft, targetH:number, targetW:number):(boolean | null)[][]=>{ + let output:(boolean | null)[][]=[]; + + for(let i=0;i{ + let inputDraftA=getAllDraftsAtInlet(op_inputs, 0); + let inputDraftB=getAllDraftsAtInlet(op_inputs, 1); + let middleColumnCount=Math.floor(getOpParamValById(0, op_params)); + let blendCenterPercent=Math.floor(getOpParamValById(1, op_params)); + let changePatternSizeValue=Math.floor(getOpParamValById(2, op_params)); + let isVertical=false; + + if(getOpParamValById(3, op_params)===1){ + isVertical=true; + } + + if(inputDraftA.length===0 || inputDraftB.length===0){ + return Promise.resolve([]); + } + + let rows=0; + let cols=0; + let patternAOrg=inputDraftA[0]; + let patternBOrg=inputDraftB[0]; + let {commonW, commonH}=getCommonSize(patternAOrg, patternBOrg, changePatternSizeValue); + let patternA=repeatPatternToSize(patternAOrg, commonH, commonW); + let patternB=repeatPatternToSize(patternBOrg, commonH, commonW); + + if(!isVertical){ + rows=commonH; + cols=commonW+commonW+middleColumnCount; + }else{ + rows=commonH+commonH+middleColumnCount; + cols=commonW; + } + + let horizontalPatternBStart=cols-commonW; + let horizontalMiddleLength=horizontalPatternBStart-commonW; + let verticalPatternBStart=rows-commonH; + let verticalMiddleLength=verticalPatternBStart-commonH; + + let drawdown:any[][]=[]; + for(let i=0;i0){ + center=(blendCenterPercent/100)*(fullTileCount-1); + } + + for(let i=0;i=horizontalPatternBStart){ + let patternBCol=j-horizontalPatternBStart; + cellValue=patternB[i][patternBCol]; + } + else if(j>=commonW && j=remainderStart && middleColcenter; + let stripeSpacing=2+distance; + let useOpposite=((colInTile+1)%stripeSpacing===0); + + if(!isPatternASide && !isPatternBSide){ + usePatternA=(colInTile%2===0); + }else if(isPatternASide){ + usePatternA=!useOpposite; + }else{ + usePatternA=useOpposite; + } + + if(usePatternA){ + cellValue=patternA[i][colInTile]; + }else{ + cellValue=patternB[i][colInTile]; + } + } + + if(middleCol>=remainderStart && middleCol0){ + center=(blendCenterPercent/100)*(fullTileCount-1); + } + + for(let i=0;i=verticalPatternBStart){ + let patternBRow=j-verticalPatternBStart; + cellValue=patternB[patternBRow][i]; + }else if(j>=commonH && j=remainderStart && middleColcenter; + let stripeSpacing=2+distance; + let useOpposite=((colInTile+1)%stripeSpacing===0); + + if(!isPatternASide && !isPatternBSide){ + usePatternA=(colInTile%2===0); + }else if(isPatternASide){ + usePatternA=!useOpposite; + }else{ + usePatternA=useOpposite; + } + + if(usePatternA){ + cellValue=patternA[colInTile][i]; + }else{ + cellValue=patternB[colInTile][i]; + } + } + + if(middleCol>=remainderStart && middleCol{ + let draftAInputs=getAllDraftsAtInlet(op_inputs, 0); + let draftBInputs=getAllDraftsAtInlet(op_inputs, 1); + let drafts=draftAInputs.concat(draftBInputs); + let name_list=parseDraftNames(drafts); + return "interlacing blend test(" + name_list + ")"; +}; + +let sizeCheck=(op_params:OpParamVal[], op_inputs:OpInput[]):boolean=>{ + + let inputDraftA=getAllDraftsAtInlet(op_inputs, 0); + let inputDraftB=getAllDraftsAtInlet(op_inputs, 1); + let middleColumnCount=Math.floor(getOpParamValById(0, op_params)); + let changePatternSizeValue=Math.floor(getOpParamValById(2, op_params)); + let isVertical=false; + + if(getOpParamValById(3, op_params)===1){ + isVertical=true; + } + + if(inputDraftA.length===0 || inputDraftB.length===0){ + return true; + } + + let totalRows=0; + let totalCols=0; + let patternAOrg=inputDraftA[0]; + let patternBOrg=inputDraftB[0]; + let {commonW, commonH}=getCommonSize(patternAOrg, patternBOrg, changePatternSizeValue); + + if(!isVertical){ + totalRows=commonH; + totalCols=commonW+commonW+middleColumnCount; + }else{ + totalRows=commonH+commonH+middleColumnCount; + totalCols=commonW; + } + + if(getOpParamValById(3, op_params)===1){ + isVertical=true; + } + + return totalRows*totalCols<=defaults.max_area; +}; + +export const interlacing_blend: Operation={ name, meta, params, inlets, perform, generateName, sizeCheck }; diff --git a/packages/adacad-drafting-lib/src/operations/operation_list.ts b/packages/adacad-drafting-lib/src/operations/operation_list.ts index b18353909..c840ea7f6 100644 --- a/packages/adacad-drafting-lib/src/operations/operation_list.ts +++ b/packages/adacad-drafting-lib/src/operations/operation_list.ts @@ -25,6 +25,7 @@ export * from './glitchsatin/glitchsatin'; export * from './imagemap/imagemap'; export * from './interlace/interlace'; export * from './interlace_warps/interlace_warps' +export * from './interlacing_blend/interlacing_blend'; export * from './invert/invert'; export * from './join_left/join_left' export * from './join_top/join_top' diff --git a/projects/docs/docs/reference/operations/cloth/interlacing_blend/index.md b/projects/docs/docs/reference/operations/cloth/interlacing_blend/index.md new file mode 100644 index 000000000..1a03b581d --- /dev/null +++ b/projects/docs/docs/reference/operations/cloth/interlacing_blend/index.md @@ -0,0 +1,31 @@ +--- +title: interlacing blend +sidebar_label: interlacing blend +sidebar_class_name: cloth opItem +editUrl: 'https://github.com/UnstableDesign/AdaCAD/tree/main/packages/adacad-drafting-lib/src/operations/interlacing_blend/interlacing_blend.ts' +--- + +import {OperationHeader} from '@site/src/components/OperationPage'; + + + + +## Parameters +- `blend-region-length`: the length of the blend region +- `blend center percent`: the center of the blend transition as a percent from 0 to 100 +- `change pattern size`: adds or subtracts from the common repeated pattern size +- `blend direction`: controls whether the blend runs horizontally or vertically + +## Inlets +- `draft-a`: the first draft to blend +- `draft-b`: the second draft to blend + + +## Application +Can be used to create a transition vertically or horizontally between patterns through interlacement. Create the look of a blend/gradient. + +## Developer +adacad id: `interlacing blend` + +```ts reference +https://github.com/UnstableDesign/AdaCAD/tree/main/packages/adacad-drafting-lib/src/operations/interlacing_blend/interlacing_blend.ts \ No newline at end of file From 4041e8841499f4ba9268742aab337ee57dd3f96c Mon Sep 17 00:00:00 2001 From: charlottebe Date: Fri, 27 Mar 2026 19:59:32 -0600 Subject: [PATCH 2/3] Added .ada file and png example image --- .../interlacing_blend/interlacing_blend.ada | 1 + .../interlacing_blend/interlacing_blend.png | Bin 0 -> 53658 bytes 2 files changed, 1 insertion(+) create mode 100644 projects/docs/docs/reference/operations/cloth/interlacing_blend/interlacing_blend.ada create mode 100644 projects/docs/docs/reference/operations/cloth/interlacing_blend/interlacing_blend.png diff --git a/projects/docs/docs/reference/operations/cloth/interlacing_blend/interlacing_blend.ada b/projects/docs/docs/reference/operations/cloth/interlacing_blend/interlacing_blend.ada new file mode 100644 index 000000000..f427a9029 --- /dev/null +++ b/projects/docs/docs/reference/operations/cloth/interlacing_blend/interlacing_blend.ada @@ -0,0 +1 @@ +{"version":"5.0.7","workspace":{"min_frames":8,"min_treadles":8,"type":"jacquard","epi":12,"ppi":12,"units":"in","show_materials":true,"black_cell_up":true,"number_threading":false,"selected_origin_option":3,"file_favorites":[],"hide_mixer_drafts":false,"show_advanced_operations":true,"oversize_dim_threshold":2500,"max_draft_input_area":6250000},"type":"mixer","zoom":{"editor":0.303,"mixer":0.177},"nodes":[{"node_id":30582212,"type":"op","topleft":{"x":564.4651162790699,"y":1548.046511627907}},{"node_id":61924379,"type":"op","topleft":{"x":1852.139534883721,"y":358.13953488372096}},{"node_id":38189780,"type":"draft","topleft":{"x":0,"y":0}},{"node_id":50772489,"type":"cxn","topleft":{"x":0,"y":0}},{"node_id":20561588,"type":"cxn","topleft":{"x":0,"y":0}},{"node_id":52502654,"type":"op","topleft":{"x":625.7796610169493,"y":282.4519774011299}},{"node_id":70158734,"type":"draft","topleft":{"x":0,"y":0}},{"node_id":86953434,"type":"cxn","topleft":{"x":0,"y":0}},{"node_id":46686591,"type":"cxn","topleft":{"x":0,"y":0}},{"node_id":58948118,"type":"draft","topleft":{"x":0,"y":0}},{"node_id":83515784,"type":"cxn","topleft":{"x":0,"y":0}},{"node_id":20118245,"type":"op","topleft":{"x":114.65536723163848,"y":2694.4915254237285}},{"node_id":13402403,"type":"draft","topleft":{"x":0,"y":0}},{"node_id":58302661,"type":"cxn","topleft":{"x":0,"y":0}},{"node_id":68760579,"type":"op","topleft":{"x":1210.1807909604518,"y":2691.751412429379}},{"node_id":63150322,"type":"draft","topleft":{"x":0,"y":0}},{"node_id":86602797,"type":"cxn","topleft":{"x":0,"y":0}},{"node_id":61422204,"type":"op","topleft":{"x":582.954802259887,"y":3993.983050847458}},{"node_id":64370536,"type":"draft","topleft":{"x":0,"y":0}},{"node_id":85755201,"type":"cxn","topleft":{"x":0,"y":0}},{"node_id":73950262,"type":"cxn","topleft":{"x":0,"y":0}},{"node_id":20421290,"type":"cxn","topleft":{"x":0,"y":0}}],"tree":[{"node":30582212,"parent":-1,"inputs":[{"tn":20561588,"ndx":1},{"tn":46686591,"ndx":0}],"outputs":[{"tn":83515784,"ndx":0}]},{"node":61924379,"parent":-1,"inputs":[],"outputs":[{"tn":50772489,"ndx":0}]},{"node":38189780,"parent":61924379,"inputs":[{"tn":50772489,"ndx":0}],"outputs":[{"tn":20561588,"ndx":0}]},{"node":50772489,"parent":-1,"inputs":[{"tn":61924379,"ndx":0}],"outputs":[{"tn":38189780,"ndx":0}]},{"node":20561588,"parent":-1,"inputs":[{"tn":38189780,"ndx":0}],"outputs":[{"tn":30582212,"ndx":0}]},{"node":52502654,"parent":-1,"inputs":[],"outputs":[{"tn":86953434,"ndx":0}]},{"node":70158734,"parent":52502654,"inputs":[{"tn":86953434,"ndx":0}],"outputs":[{"tn":46686591,"ndx":0}]},{"node":86953434,"parent":-1,"inputs":[{"tn":52502654,"ndx":0}],"outputs":[{"tn":70158734,"ndx":0}]},{"node":46686591,"parent":-1,"inputs":[{"tn":70158734,"ndx":0}],"outputs":[{"tn":30582212,"ndx":0}]},{"node":58948118,"parent":30582212,"inputs":[{"tn":83515784,"ndx":0}],"outputs":[]},{"node":83515784,"parent":-1,"inputs":[{"tn":30582212,"ndx":0}],"outputs":[{"tn":58948118,"ndx":0}]},{"node":20118245,"parent":-1,"inputs":[],"outputs":[{"tn":58302661,"ndx":0}]},{"node":13402403,"parent":20118245,"inputs":[{"tn":58302661,"ndx":0}],"outputs":[{"tn":73950262,"ndx":0}]},{"node":58302661,"parent":-1,"inputs":[{"tn":20118245,"ndx":0}],"outputs":[{"tn":13402403,"ndx":0}]},{"node":68760579,"parent":-1,"inputs":[],"outputs":[{"tn":86602797,"ndx":0}]},{"node":63150322,"parent":68760579,"inputs":[{"tn":86602797,"ndx":0}],"outputs":[{"tn":20421290,"ndx":0}]},{"node":86602797,"parent":-1,"inputs":[{"tn":68760579,"ndx":0}],"outputs":[{"tn":63150322,"ndx":0}]},{"node":61422204,"parent":-1,"inputs":[{"tn":73950262,"ndx":0},{"tn":20421290,"ndx":1}],"outputs":[{"tn":85755201,"ndx":0}]},{"node":64370536,"parent":61422204,"inputs":[{"tn":85755201,"ndx":0}],"outputs":[]},{"node":85755201,"parent":-1,"inputs":[{"tn":61422204,"ndx":0}],"outputs":[{"tn":64370536,"ndx":0}]},{"node":73950262,"parent":-1,"inputs":[{"tn":13402403,"ndx":0}],"outputs":[{"tn":61422204,"ndx":0}]},{"node":20421290,"parent":-1,"inputs":[{"tn":63150322,"ndx":0}],"outputs":[{"tn":61422204,"ndx":0}]}],"draft_nodes":[{"node_id":38189780,"draft_id":38189780,"ud_name":"","gen_name":"twill(3,3,Z)","notes":"","draft":null,"compressed_draft":null,"draft_visible":true,"loom":null,"loom_settings":{"type":"jacquard","epi":12,"ppi":12,"units":"in","frames":8,"treadles":8},"render_colors":true,"scale":1},{"node_id":70158734,"draft_id":70158734,"ud_name":"","gen_name":"tabby(3,3,3,3)","notes":"","draft":null,"compressed_draft":null,"draft_visible":true,"loom":null,"loom_settings":{"type":"jacquard","epi":12,"ppi":12,"units":"in","frames":8,"treadles":8},"render_colors":true,"scale":1},{"node_id":58948118,"draft_id":58948118,"ud_name":"","gen_name":"interlacing blend test(tabby(3,3,3,3)+twill(3,3,Z))","notes":"","draft":null,"compressed_draft":null,"draft_visible":true,"loom":null,"loom_settings":{"type":"jacquard","epi":12,"ppi":12,"units":"in","frames":8,"treadles":8},"render_colors":true,"scale":1},{"node_id":13402403,"draft_id":13402403,"ud_name":"","gen_name":"tabby(3,3,3,3)","notes":"","draft":null,"compressed_draft":null,"draft_visible":true,"loom":null,"loom_settings":{"type":"jacquard","epi":12,"ppi":12,"units":"in","frames":8,"treadles":8},"render_colors":true,"scale":1},{"node_id":63150322,"draft_id":63150322,"ud_name":"","gen_name":"twill(3,3,Z)","notes":"","draft":null,"compressed_draft":null,"draft_visible":true,"loom":null,"loom_settings":{"type":"jacquard","epi":12,"ppi":12,"units":"in","frames":8,"treadles":8},"render_colors":true,"scale":1},{"node_id":64370536,"draft_id":64370536,"ud_name":"","gen_name":"interlacing blend test(tabby(3,3,3,3)+twill(3,3,Z))","notes":"","draft":null,"compressed_draft":null,"draft_visible":true,"loom":null,"loom_settings":{"type":"jacquard","epi":12,"ppi":12,"units":"in","frames":8,"treadles":8},"render_colors":true,"scale":1}],"ops":[{"node_id":30582212,"name":"interlacing_blend","params":[60,50,0,0],"inlets":[0,0]},{"node_id":61924379,"name":"twill","params":[3,3,0,0],"inlets":[]},{"node_id":52502654,"name":"tabby","params":[3,3,3,3],"inlets":[]},{"node_id":20118245,"name":"tabby","params":[3,3,3,3],"inlets":[]},{"node_id":68760579,"name":"twill","params":[3,3,0,0],"inlets":[]},{"node_id":61422204,"name":"interlacing_blend","params":[53,50,0,1],"inlets":[0,0]}],"notes":[],"materials":[{"id":0,"name":"black","stretch":1,"insert":true,"visible":true,"color":"#333333","thickness":100,"diameter":1,"type":0,"notes":"","rgb":{"r":51,"g":51,"b":51}},{"id":1,"name":"white","stretch":1,"insert":true,"visible":true,"color":"#f9f8f3","thickness":100,"diameter":1,"type":0,"notes":"","rgb":{"r":249,"g":248,"b":243}},{"id":2,"name":"red","stretch":1,"insert":true,"visible":true,"color":"#d55e00","thickness":100,"diameter":1,"type":1,"notes":"","rgb":{"r":213,"g":94,"b":0}},{"id":3,"name":"orange","stretch":1,"insert":true,"visible":true,"color":"#e69f00","thickness":100,"diameter":1,"type":1,"notes":"","rgb":{"r":230,"g":159,"b":0}},{"id":4,"name":"yellow","stretch":1,"insert":true,"visible":true,"color":"#f0e442","thickness":100,"diameter":1,"type":1,"notes":"","rgb":{"r":240,"g":228,"b":66}},{"id":5,"name":"green","stretch":1,"insert":true,"visible":true,"color":"#4aff4a","thickness":100,"diameter":1,"type":1,"notes":"","rgb":{"r":74,"g":255,"b":74}},{"id":6,"name":"dark green","stretch":1,"insert":true,"visible":true,"color":"#009e73","thickness":100,"diameter":1,"type":1,"notes":"","rgb":{"r":0,"g":158,"b":115}},{"id":7,"name":"dark blue","stretch":1,"insert":true,"visible":true,"color":"#0072b2","thickness":100,"diameter":1,"type":1,"notes":"","rgb":{"r":0,"g":114,"b":178}},{"id":8,"name":"blue","stretch":1,"insert":true,"visible":true,"color":"#56b4e9","thickness":100,"diameter":1,"type":1,"notes":"","rgb":{"r":86,"g":180,"b":233}},{"id":9,"name":"violet","stretch":1,"insert":true,"visible":true,"color":"#cc79a7","thickness":100,"diameter":1,"type":1,"notes":"","rgb":{"r":204,"g":121,"b":167}},{"id":10,"name":"grey","stretch":1,"insert":true,"visible":true,"color":"#aaaaaa","thickness":100,"diameter":1,"type":1,"notes":"","rgb":{"r":170,"g":170,"b":170}}],"indexed_image_data":[]} \ No newline at end of file diff --git a/projects/docs/docs/reference/operations/cloth/interlacing_blend/interlacing_blend.png b/projects/docs/docs/reference/operations/cloth/interlacing_blend/interlacing_blend.png new file mode 100644 index 0000000000000000000000000000000000000000..fb9a3709affc83fc31451ad12c42a205c74ce320 GIT binary patch literal 53658 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

9S3^GdjpW4ZaEqYh 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 literal 0 HcmV?d00001 From e0b1223cf142cb74f470999c79819e71ecbacfb7 Mon Sep 17 00:00:00 2001 From: charlottebe Date: Mon, 30 Mar 2026 10:30:28 -0600 Subject: [PATCH 3/3] Added descriptive comments to main interlacing blend operation file --- .../interlacing_blend/interlacing_blend.ts | 44 +++++++++---------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/packages/adacad-drafting-lib/src/operations/interlacing_blend/interlacing_blend.ts b/packages/adacad-drafting-lib/src/operations/interlacing_blend/interlacing_blend.ts index f04b87372..ad9e167fd 100644 --- a/packages/adacad-drafting-lib/src/operations/interlacing_blend/interlacing_blend.ts +++ b/packages/adacad-drafting-lib/src/operations/interlacing_blend/interlacing_blend.ts @@ -76,7 +76,7 @@ const draft_b: OperationInlet={ const inlets=[draft_a, draft_b]; -let getCommonSize=(patternAOrg:Draft, patternBOrg:Draft, patternSizeChange:number)=>{ +let getCommonSize=(patternAOrg:Draft, patternBOrg:Draft, patternSizeChange:number)=>{ // get the common width and height to repeat the two patterns too let drafts = [patternAOrg, patternBOrg]; let commonW = lcm(drafts.map(draft=>warps(draft.drawdown)).filter(size=>size>0), defaults.lcm_timeout)+patternSizeChange; let commonH = lcm(drafts.map(draft=>wefts(draft.drawdown)).filter(size=>size>0), defaults.lcm_timeout)+patternSizeChange; @@ -89,7 +89,7 @@ let getCommonSize=(patternAOrg:Draft, patternBOrg:Draft, patternSizeChange:numbe return {commonW:adjustedCommonW, commonH:adjustedCommonH}; }; -let repeatPatternToSize=(patternOrg:Draft, targetH:number, targetW:number):(boolean | null)[][]=>{ +let repeatPatternToSize=(patternOrg:Draft, targetH:number, targetW:number):(boolean | null)[][]=>{ // repeat the patterns to fill the area using common width and height let output:(boolean | null)[][]=[]; for(let i=0;i{ if(!isVertical){ let fullTileCount=Math.floor(horizontalMiddleLength/commonW); - let remainder=horizontalMiddleLength%commonW; - let leftFullTileCount=Math.floor(fullTileCount/2); + let remainder=horizontalMiddleLength%commonW; // found full tile count and the remainder of cols left over + let leftFullTileCount=Math.floor(fullTileCount/2); let leftFullWidth=leftFullTileCount*commonW; - let remainderStart=leftFullWidth; + let remainderStart=leftFullWidth; // place remainder in middle so full pattern tiles can be on either side let remainderEnd=remainderStart+remainder; let center=0; if(fullTileCount>0){ - center=(blendCenterPercent/100)*(fullTileCount-1); + center=(blendCenterPercent/100)*(fullTileCount-1); // find center of blend using blend center percent } for(let i=0;i=horizontalPatternBStart){ + else if(j>=horizontalPatternBStart){ // right pattern let patternBCol=j-horizontalPatternBStart; cellValue=patternB[i][patternBCol]; } - else if(j>=commonW && j=commonW && j=remainderStart && middleCol=remainderStart && middleColcenter; - let stripeSpacing=2+distance; - let useOpposite=((colInTile+1)%stripeSpacing===0); - + let stripeSpacing=2+distance; // minimum distance of 2 + let useOpposite=((colInTile+1)%stripeSpacing===0); // if remainder is 0 after dividing by stripe space then flips to other pattern + // farther from center less likely to flip (ex. closer to A it can go A/A/A/B/A) if(!isPatternASide && !isPatternBSide){ usePatternA=(colInTile%2===0); }else if(isPatternASide){ @@ -205,14 +205,14 @@ const perform=(op_params:OpParamVal[], op_inputs:OpInput[])=>{ usePatternA=useOpposite; } - if(usePatternA){ + if(usePatternA){ // get cell values for middle region cellValue=patternA[i][colInTile]; }else{ cellValue=patternB[i][colInTile]; } } - if(middleCol>=remainderStart && middleCol=remainderStart && middleCol{ } } - drawdown[i][j]=createCell(cellValue); + drawdown[i][j]=createCell(cellValue); // put the cell value found into the array holding all cell values } } } - else{ + else{ // same logic for vertical, just based on rows instead of cols let fullTileCount=Math.floor(verticalMiddleLength/commonH); let remainder=verticalMiddleLength%commonH; let leftFullTileCount=Math.floor(fullTileCount/2); @@ -302,7 +302,7 @@ const perform=(op_params:OpParamVal[], op_inputs:OpInput[])=>{ } } - let draft=initDraftFromDrawdown(drawdown); + let draft=initDraftFromDrawdown(drawdown); // make draft using drawdown draft=updateWeftSystemsAndShuttles(draft, patternAOrg); draft=updateWarpSystemsAndShuttles(draft, patternAOrg);