Monorepo for Aesthetic.Computer aesthetic.computer
4
fork

Configure Feed

Select the types of activity you want to include in your feed.

cleanup: remove build symlink from tracking + kidlisp updates

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

+86 -9
-1
fedac/native/build
··· 1 - /opt/oven/native-cache
+86 -8
system/public/aesthetic.computer/lib/kidlisp.mjs
··· 6678 6678 return; 6679 6679 } 6680 6680 6681 - // �🍞 Scroll operates on whatever buffer is currently active (layer0 or bake buffer) 6682 6681 // Scroll operates on the current drawing buffer (layer0 or bake layer) 6683 6682 // This allows effects like scrolling accumulated content 6684 - 6685 6683 if (typeof api.scroll === 'function') { 6686 6684 api.scroll(dx, dy); 6685 + } 6686 + 6687 + // 🔥 When burn was called, also scroll persistent layers so the effect 6688 + // accumulates across frames. burnedBuffer is ephemeral (recreated each 6689 + // frame), so without this the scroll would be lost on the next frame. 6690 + if (this.burnedBuffer) { 6691 + this._scrollPersistentLayers(api, dx, dy); 6687 6692 } 6688 6693 }, 6689 6694 spin: (api, args = []) => { ··· 6700 6705 return; 6701 6706 } 6702 6707 api.spin(...args); 6708 + 6709 + // 🔥 When burn was called, also spin persistent layers 6710 + if (this.burnedBuffer) { 6711 + this._spinPersistentLayers(api, args); 6712 + } 6703 6713 }, 6704 6714 resetSpin: (api, args = []) => { 6705 6715 api.resetSpin(); ··· 6718 6728 return; 6719 6729 } 6720 6730 api.smoothSpin(...args); 6731 + 6732 + // 🔥 When burn was called, also smoothspin persistent layers 6733 + if (this.burnedBuffer) { 6734 + this._spinPersistentLayers(api, args, true); 6735 + } 6721 6736 }, 6722 6737 sort: (api, args = []) => { 6723 6738 api.sort(...args); ··· 6754 6769 6755 6770 // Execute zoom immediately 6756 6771 performZoom(); 6772 + 6773 + // 🔥 When burn was called, also zoom persistent layers 6774 + if (this.burnedBuffer) { 6775 + const layers = []; 6776 + if (this.layer0?.pixels) layers.push(this.layer0); 6777 + if (this.bakes) { 6778 + for (const b of this.bakes) { 6779 + if (b?.pixels) layers.push(b); 6780 + } 6781 + } 6782 + for (const buf of layers) { 6783 + api.page(buf); 6784 + api.zoom(...args); 6785 + } 6786 + api.page(this.burnedBuffer); 6787 + } 6757 6788 }, 6758 6789 flip: (api, args = []) => { 6759 6790 // Request persistence for next frame to allow trails ··· 8494 8525 // Subsequent operations (blur, sharpen, scroll) will operate on it 8495 8526 // BUT we must leave the graph module pointing to burnedBuffer so those 8496 8527 // operations modify the correct buffer! 8497 - 8498 - // Note: Reset scroll accumulator after burn to ensure clean state 8499 - if (api.resetScrollState) { 8500 - api.resetScrollState(); 8501 - } 8502 - 8528 + 8503 8529 return 0; // Burned layer is always index 0 8504 8530 }, 8505 8531 // � Tape function - loads and plays tape recordings as embedded video ··· 13139 13165 this.layer0 = null; 13140 13166 this.burnedBuffer = null; 13141 13167 this.displayBuffer = null; 13168 + this._burnScrollAccX = 0; 13169 + this._burnScrollAccY = 0; 13142 13170 13143 13171 // CRITICAL: Clear the arrays by setting length to 0, not replacing with new arrays 13144 13172 // This ensures any existing references to these arrays see the cleared state ··· 13368 13396 height, 13369 13397 pixels: new Uint8ClampedArray(width * height * 4) 13370 13398 }; 13399 + } 13400 + 13401 + // 🔥 Scroll all persistent layers (layer0 + bakes) after burn. 13402 + // Uses its own accumulator to avoid interfering with graph.mjs's shared one. 13403 + _scrollPersistentLayers(api, dx, dy) { 13404 + if (!this._burnScrollAccX) this._burnScrollAccX = 0; 13405 + if (!this._burnScrollAccY) this._burnScrollAccY = 0; 13406 + this._burnScrollAccX += dx; 13407 + this._burnScrollAccY += dy; 13408 + const intDx = Math.trunc(this._burnScrollAccX); 13409 + const intDy = Math.trunc(this._burnScrollAccY); 13410 + this._burnScrollAccX -= intDx; 13411 + this._burnScrollAccY -= intDy; 13412 + if (intDx === 0 && intDy === 0) return; 13413 + 13414 + const layers = []; 13415 + if (this.layer0?.pixels) layers.push(this.layer0); 13416 + if (this.bakes) { 13417 + for (const b of this.bakes) { 13418 + if (b?.pixels) layers.push(b); 13419 + } 13420 + } 13421 + for (const buf of layers) { 13422 + api.page(buf); 13423 + api.resetScrollState?.(); 13424 + api.scroll(intDx, intDy); // integer → no accumulator remainder 13425 + } 13426 + // Restore page to burnedBuffer 13427 + api.page(this.burnedBuffer); 13428 + } 13429 + 13430 + // 🔥 Spin/smoothspin all persistent layers after burn. 13431 + _spinPersistentLayers(api, args, smooth = false) { 13432 + const layers = []; 13433 + if (this.layer0?.pixels) layers.push(this.layer0); 13434 + if (this.bakes) { 13435 + for (const b of this.bakes) { 13436 + if (b?.pixels) layers.push(b); 13437 + } 13438 + } 13439 + for (const buf of layers) { 13440 + api.page(buf); 13441 + if (smooth) { 13442 + api.smoothSpin(...args); 13443 + } else { 13444 + api.spin(...args); 13445 + } 13446 + } 13447 + // Restore page to burnedBuffer 13448 + api.page(this.burnedBuffer); 13371 13449 } 13372 13450 13373 13451 // Helper function to paste a buffer with alpha blending