← back to Model Arena
Agent-driven tool: DW Texture Weave Studio (frontend-developer) — 6 weave algorithms, light-sweep, magnifier, 2400px PNG export. Registered.
c318ca7f5e507ac2b4567d8107e5526bd4c9d12c · 2026-07-25 12:19:15 -0700 · Steve Abrams
Files touched
M data/arcade-games.jsonM public/games/dw-texture-weave-studio.html
Diff
commit c318ca7f5e507ac2b4567d8107e5526bd4c9d12c
Author: Steve Abrams <steve@designerwallcoverings.com>
Date: Sat Jul 25 12:19:15 2026 -0700
Agent-driven tool: DW Texture Weave Studio (frontend-developer) — 6 weave algorithms, light-sweep, magnifier, 2400px PNG export. Registered.
---
data/arcade-games.json | 6 +++++
public/games/dw-texture-weave-studio.html | 43 +++++++++----------------------
2 files changed, 18 insertions(+), 31 deletions(-)
diff --git a/data/arcade-games.json b/data/arcade-games.json
index 944e566..538b8e6 100644
--- a/data/arcade-games.json
+++ b/data/arcade-games.json
@@ -113,6 +113,12 @@
"title": "DW Pattern Sequence",
"credit": "frontend-developer",
"note": "Agent-built Simon-style memory game \u2014 repeat the growing sequence of luxury pattern pads, tones + glow"
+ },
+ {
+ "slug": "dw-texture-weave-studio",
+ "title": "DW Texture Weave Studio",
+ "credit": "frontend-developer",
+ "note": "Agent-built tool \u2014 live woven-material generator (6 weaves), 2-tone fiber, light-sweep, magnifier, PNG export"
}
]
}
\ No newline at end of file
diff --git a/public/games/dw-texture-weave-studio.html b/public/games/dw-texture-weave-studio.html
index dbb63d2..68806eb 100644
--- a/public/games/dw-texture-weave-studio.html
+++ b/public/games/dw-texture-weave-studio.html
@@ -444,36 +444,35 @@ function renderLinen(oc,ow,oh,c1,c2,density,warpT,weftT){
function renderSilk(oc,ow,oh,c1,c2,density,warpT,weftT){
const cell = ow/density;
- // Satin-like: 5-1 satin weave float (long warp floats, smooth sheen)
+ const white={r:255,g:255,b:255}, black={r:0,g:0,b:0};
+ // Satin weave: long warp floats with silky highlight band, sparse weft crossovers
for(let col=0;col<=density;col++){
const x=col*cell;
const shine=(Math.sin(col*.8)*.5+.5);
- const sh=lerpColor(c1,{r:255,g:255,b:255},shine*.18);
+ const sh=darken(c1,.88+shine*.18);
+ const hi=lighten(sh,1.28+shine*.3);
const g=oc.createLinearGradient(x,0,x+cell*warpT,0);
- g.addColorStop(0,lerpColor(hexToRgb(sh),{r:0,g:0,b:0},.15));
- g.addColorStop(.4,sh);
- g.addColorStop(.6,lerpColor(hexToRgb(sh),{r:255,g:255,b:255},.3));
- g.addColorStop(1,lerpColor(hexToRgb(sh),{r:0,g:0,b:0},.12));
+ g.addColorStop(0,rgbStr(darken(sh,.78)));
+ g.addColorStop(.35,rgbStr(hi));
+ g.addColorStop(.6,rgbStr(sh));
+ g.addColorStop(1,rgbStr(darken(sh,.72)));
oc.fillStyle=g; oc.fillRect(x,0,cell*warpT,oh);
}
const rows=Math.ceil(oh/cell);
for(let row=0;row<=rows;row++){
const y=row*cell;
- // only every 5th row has a weft crossover
if(row%5!==0) continue;
for(let col=0;col<=density;col++){
if((col+Math.floor(row/5)*2)%5===0){
const x=col*cell;
const g=oc.createLinearGradient(0,y,0,y+cell*weftT);
- g.addColorStop(0,rgbStr(darken(hexToRgb(s_c2str(c2)),.7)));
- g.addColorStop(.5,s_c2str(c2));
- g.addColorStop(1,rgbStr(darken(hexToRgb(s_c2str(c2)),.75)));
+ g.addColorStop(0,rgbStr(darken(c2,.72)));
+ g.addColorStop(.5,rgbStr(lighten(c2,1.1)));
+ g.addColorStop(1,rgbStr(darken(c2,.76)));
oc.fillStyle=g; oc.fillRect(x,y,cell,cell*weftT);
}
}
}
- function s_c2str(c){return `rgb(${c.r},${c.g},${c.b})`}
- function hexToRgb(s){const m=s.match(/\d+/g);return m?{r:+m[0],g:+m[1],b:+m[2]}:{r:200,g:180,b:140}}
}
function renderRaffia(oc,ow,oh,c1,c2,density,warpT,weftT){
@@ -664,28 +663,10 @@ function drawFrame(ts){
const dpr=Math.min(window.devicePixelRatio||1,2);
const W=canvas.width/dpr, H=canvas.height/dpr;
- ctx.save();
- ctx.scale(1/dpr,1/dpr);
- ctx.scale(dpr,dpr);
- ctx.restore();
-
ctx.clearRect(0,0,W,H);
- // Draw tiled offscreen texture
+ // Draw offscreen texture scaled to fill canvas
if(offscreenCanvas){
- const scale=W/OFFSCREEN_SIZE*1.0;
- ctx.save();
- ctx.scale(scale,scale);
- const tilesX=Math.ceil(W/(OFFSCREEN_SIZE*scale))+1;
- const tilesY=Math.ceil(H/(OFFSCREEN_SIZE*scale))+1;
- for(let ty=0;ty<tilesY;ty++){
- for(let tx=0;tx<tilesX;tx++){
- ctx.drawImage(offscreenCanvas, tx*OFFSCREEN_SIZE/scale*scale, ty*OFFSCREEN_SIZE/scale*scale);
- }
- }
- ctx.restore();
- // Actually just draw once, scaled to fit
- ctx.clearRect(0,0,W,H);
ctx.drawImage(offscreenCanvas,0,0,W,H);
}
← 05f0c2c Agent-driven game: DW Pattern Sequence (frontend-developer)
·
back to Model Arena
·
DW Suite index page (/suite, /dw) — categorized landing for bf43f1b →