[object Object]

← 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

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 →