textmode.synth.js 1.0.0-beta.4 → 1.0.0-beta.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,7 @@
1
- (function(g,I){typeof exports=="object"&&typeof module<"u"?I(exports):typeof define=="function"&&define.amd?define(["exports"],I):I((g=typeof globalThis<"u"?globalThis:g||self).TextmodeSynth={})})(this,function(g){"use strict";const I={src:{returnType:"vec4",args:[{type:"vec2",name:"_st"}]},coord:{returnType:"vec2",args:[{type:"vec2",name:"_st"}]},color:{returnType:"vec4",args:[{type:"vec4",name:"_c0"}]},combine:{returnType:"vec4",args:[{type:"vec4",name:"_c0"},{type:"vec4",name:"_c1"}]},combineCoord:{returnType:"vec2",args:[{type:"vec2",name:"_st"},{type:"vec4",name:"_c0"}]}},L=new class{_transforms=new Map;_processedCache=new Map;register(e){this._transforms.has(e.name)&&console.warn(`[TransformRegistry] Overwriting existing transform: ${e.name}`),this._transforms.set(e.name,e),this._processedCache.delete(e.name)}registerMany(e){for(const t of e)this.register(t)}get(e){return this._transforms.get(e)}getProcessed(e){let t=this._processedCache.get(e);if(!t){const r=this._transforms.get(e);r&&(t=(function(a){const n=I[a.type],o=[...n.args,...a.inputs.map(c=>({type:c.type,name:c.name}))].map(c=>`${c.type} ${c.name}`).join(", "),s=`
1
+ (function(g,L){typeof exports=="object"&&typeof module<"u"?L(exports):typeof define=="function"&&define.amd?define(["exports"],L):L((g=typeof globalThis<"u"?globalThis:g||self).TextmodeSynth={})})(this,function(g){"use strict";const L={src:{returnType:"vec4",args:[{type:"vec2",name:"_st"}]},coord:{returnType:"vec2",args:[{type:"vec2",name:"_st"}]},color:{returnType:"vec4",args:[{type:"vec4",name:"_c0"}]},combine:{returnType:"vec4",args:[{type:"vec4",name:"_c0"},{type:"vec4",name:"_c1"}]},combineCoord:{returnType:"vec2",args:[{type:"vec2",name:"_st"},{type:"vec4",name:"_c0"}]}},A=new class{_transforms=new Map;_processedCache=new Map;register(e){this._transforms.has(e.name)&&console.warn(`[TransformRegistry] Overwriting existing transform: ${e.name}`),this._transforms.set(e.name,e),this._processedCache.delete(e.name)}registerMany(e){for(const t of e)this.register(t)}get(e){return this._transforms.get(e)}getProcessed(e){let t=this._processedCache.get(e);if(!t){const r=this._transforms.get(e);r&&(t=(function(a){const n=L[a.type],o=[...n.args,...a.inputs.map(c=>({type:c.type,name:c.name}))].map(c=>`${c.type} ${c.name}`).join(", "),s=`
2
2
  ${n.returnType} ${a.name}(${o}) {
3
3
  ${a.glsl}
4
- }`;return{...a,glslFunction:s}})(r),this._processedCache.set(e,t))}return t}has(e){return this._transforms.has(e)}getByType(e){return Array.from(this._transforms.values()).filter(t=>t.type===e)}getNames(){return Array.from(this._transforms.keys())}getAll(){return Array.from(this._transforms.values())}getSourceTransforms(){return this.getByType("src")}remove(e){return this._processedCache.delete(e),this._transforms.delete(e)}clear(){this._transforms.clear(),this._processedCache.clear()}get size(){return this._transforms.size}},Y=new Set(["src"]),R=new class{_generatedFunctions={};_synthSourceClass=null;setSynthSourceClass(e){this._synthSourceClass=e}injectMethods(e){const t=L.getAll();for(const r of t)this._injectMethod(e,r)}_injectMethod(e,t){const{name:r,inputs:a,type:n}=t;e[r]=n==="combine"||n==="combineCoord"?function(o,...s){const c=a.map((l,u)=>s[u]??l.default);return this.addCombineTransform(r,o,c)}:function(...o){const s=a.map((c,l)=>o[l]??c.default);return this.addTransform(r,s)}}generateStandaloneFunctions(){if(!this._synthSourceClass)throw new Error("[TransformFactory] SynthSource class not set. Call setSynthSourceClass first.");const e={},t=L.getAll(),r=this._synthSourceClass;for(const a of t)if(Y.has(a.type)){const{name:n,inputs:o}=a;e[n]=(...s)=>{const c=new r,l=o.map((u,h)=>s[h]??u.default);return c.addTransform(n,l)}}return this._generatedFunctions=e,e}getGeneratedFunctions(){return this._generatedFunctions}addTransform(e,t){if(L.register(e),t&&this._injectMethod(t,e),Y.has(e.type)&&this._synthSourceClass){const r=this._synthSourceClass,{name:a,inputs:n}=e;this._generatedFunctions[a]=(...o)=>{const s=new r,c=n.map((l,u)=>o[u]??l.default);return s.addTransform(a,c)}}}},G=[{name:"osc",type:"src",inputs:[{name:"frequency",type:"float",default:60},{name:"sync",type:"float",default:.1},{name:"offset",type:"float",default:0}],glsl:`
4
+ }`;return{...a,glslFunction:s}})(r),this._processedCache.set(e,t))}return t}has(e){return this._transforms.has(e)}getByType(e){return Array.from(this._transforms.values()).filter(t=>t.type===e)}getNames(){return Array.from(this._transforms.keys())}getAll(){return Array.from(this._transforms.values())}getSourceTransforms(){return this.getByType("src")}remove(e){return this._processedCache.delete(e),this._transforms.delete(e)}clear(){this._transforms.clear(),this._processedCache.clear()}get size(){return this._transforms.size}},Y=new Set(["src"]),R=new class{_generatedFunctions={};_synthSourceClass=null;setSynthSourceClass(e){this._synthSourceClass=e}injectMethods(e){const t=A.getAll();for(const r of t)this._injectMethod(e,r)}_injectMethod(e,t){const{name:r,inputs:a,type:n}=t;e[r]=n==="combine"||n==="combineCoord"?function(o,...s){const c=a.map((l,f)=>s[f]??l.default);return this.addCombineTransform(r,o,c)}:function(...o){const s=a.map((c,l)=>o[l]??c.default);return this.addTransform(r,s)}}generateStandaloneFunctions(){if(!this._synthSourceClass)throw new Error("[TransformFactory] SynthSource class not set. Call setSynthSourceClass first.");const e={},t=A.getAll(),r=this._synthSourceClass;for(const a of t)if(Y.has(a.type)){const{name:n,inputs:o}=a;e[n]=(...s)=>{const c=new r,l=o.map((f,h)=>s[h]??f.default);return c.addTransform(n,l)}}return this._generatedFunctions=e,e}getGeneratedFunctions(){return this._generatedFunctions}addTransform(e,t){if(A.register(e),t&&this._injectMethod(t,e),Y.has(e.type)&&this._synthSourceClass){const r=this._synthSourceClass,{name:a,inputs:n}=e;this._generatedFunctions[a]=(...o)=>{const s=new r,c=n.map((l,f)=>o[f]??l.default);return s.addTransform(a,c)}}}},G=[{name:"osc",type:"src",inputs:[{name:"frequency",type:"float",default:60},{name:"sync",type:"float",default:.1},{name:"offset",type:"float",default:0}],glsl:`
5
5
  vec2 st = _st;
6
6
  float r = sin((st.x - offset/frequency + time*sync) * frequency) * 0.5 + 0.5;
7
7
  float g = sin((st.x + time*sync) * frequency) * 0.5 + 0.5;
@@ -215,7 +215,7 @@ ${a.glsl}
215
215
  return fract(st);
216
216
  `,description:"Modulate Y repeat with another source"},{name:"modulateHue",type:"combineCoord",inputs:[{name:"amount",type:"float",default:1}],glsl:`
217
217
  return _st + (vec2(_c0.g - _c0.r, _c0.b - _c0.g) * amount * 1.0 / resolution);
218
- `,description:"Modulate coordinates based on hue differences"}];class P{_transforms;constructor(t){this._transforms=t}static empty(){return new P([])}static from(t){return new P([...t])}get transforms(){return this._transforms}push(t){this._transforms.push(t)}get length(){return this._transforms.length}get isEmpty(){return this._transforms.length===0}append(t){return new P([...this._transforms,t])}get(t){return this._transforms[t]}[Symbol.iterator](){return this._transforms[Symbol.iterator]()}}class w{_chain;_charMapping;_nestedSources;_externalLayerRefs;_colorSource;_cellColorSource;_charSource;_charCount;constructor(t){this._chain=t?.chain??P.empty(),this._charMapping=t?.charMapping,this._colorSource=t?.colorSource,this._cellColorSource=t?.cellColorSource,this._charSource=t?.charSource,this._charCount=t?.charCount,this._nestedSources=t?.nestedSources??new Map,this._externalLayerRefs=t?.externalLayerRefs??new Map}addTransform(t,r){const a={name:t,userArgs:r};return this._chain.push(a),this}addCombineTransform(t,r,a){const n=this._chain.length;return this._nestedSources.set(n,r),this.addTransform(t,a)}addExternalLayerRef(t){const r=this._chain.length;return this._externalLayerRefs.set(r,t),this.addTransform("src",[])}charMap(t){const r=Array.from(t),a=[];for(const n of r)a.push(n.codePointAt(0)??32);return this._charMapping={chars:t,indices:a},this}charColor(t){return this._colorSource=t,this}char(t,r){return this._charSource=t,this._charCount=r,this}cellColor(t){return this._cellColorSource=t,this}paint(t){return this._colorSource=t,this._cellColorSource=t,this}clone(){const t=new Map;for(const[a,n]of this._nestedSources)t.set(a,n.clone());const r=new Map;for(const[a,n]of this._externalLayerRefs)r.set(a,{...n});return new w({chain:P.from(this._chain.transforms),charMapping:this._charMapping,colorSource:this._colorSource?.clone(),cellColorSource:this._cellColorSource?.clone(),charSource:this._charSource?.clone(),charCount:this._charCount,nestedSources:t,externalLayerRefs:r})}get transforms(){return this._chain.transforms}get charMapping(){return this._charMapping}get colorSource(){return this._colorSource}get cellColorSource(){return this._cellColorSource}get charSource(){return this._charSource}get charCount(){return this._charCount}get nestedSources(){return this._nestedSources}get externalLayerRefs(){return this._externalLayerRefs}}const j={linear:e=>e,easeInQuad:e=>e*e,easeOutQuad:e=>e*(2-e),easeInOutQuad:e=>e<.5?2*e*e:(4-2*e)*e-1,easeInCubic:e=>e*e*e,easeOutCubic:e=>--e*e*e+1,easeInOutCubic:e=>e<.5?4*e*e*e:(e-1)*(2*e-2)*(2*e-2)+1,easeInQuart:e=>e*e*e*e,easeOutQuart:e=>1- --e*e*e*e,easeInOutQuart:e=>e<.5?8*e*e*e*e:1-8*--e*e*e*e,easeInQuint:e=>e*e*e*e*e,easeOutQuint:e=>1+--e*e*e*e*e,easeInOutQuint:e=>e<.5?16*e*e*e*e*e:1+16*--e*e*e*e*e,sin:e=>(1+Math.sin(Math.PI*e-Math.PI/2))/2};function B(e,t){return(e%t+t)%t}"fast"in Array.prototype||(Array.prototype.fast=function(e=1){return this._speed=e,this},Array.prototype.smooth=function(e=1){return this._smooth=e,this},Array.prototype.ease=function(e="linear"){return typeof e=="function"?(this._smooth=1,this._ease=e):j[e]&&(this._smooth=1,this._ease=j[e]),this},Array.prototype.offset=function(e=.5){return this._offset=e%1,this},Array.prototype.fit=function(e=0,t=1){const r=Math.min(...this),a=Math.max(...this),n=this.map(o=>(function(s,c,l,u,h){return(s-c)*(h-u)/(l-c)+u})(o,r,a,e,t));return n._speed=this._speed,n._smooth=this._smooth,n._ease=this._ease,n._offset=this._offset,n}),L.registerMany(G),R.setSynthSourceClass(w),R.injectMethods(w.prototype);const k=R.generateStandaloneFunctions(),$="textmode.synth.js";class K{_usesFeedback=!1;_usesCharFeedback=!1;_usesCellColorFeedback=!1;trackUsage(t){switch(t){case"char":this._usesCharFeedback=!0;break;case"cellColor":this._usesCellColorFeedback=!0;break;default:this._usesFeedback=!0}}reset(){this._usesFeedback=!1,this._usesCharFeedback=!1,this._usesCellColorFeedback=!1}getUsage(){return{usesCharColorFeedback:this._usesFeedback,usesCharFeedback:this._usesCharFeedback,usesCellColorFeedback:this._usesCellColorFeedback}}get usesAnyFeedback(){return this._usesFeedback||this._usesCharFeedback||this._usesCellColorFeedback}get usesCharColorFeedback(){return this._usesFeedback}get usesCharFeedback(){return this._usesCharFeedback}get usesCellColorFeedback(){return this._usesCellColorFeedback}}class Q{_externalLayers=new Map;_counter=0;_layerIdToPrefix=new Map;getPrefix(t){let r=this._layerIdToPrefix.get(t);return r||(r="extLayer"+this._counter++,this._layerIdToPrefix.set(t,r)),r}trackUsage(t,r){const a=this.getPrefix(t.layerId);let n=this._externalLayers.get(t.layerId);switch(n||(n={layerId:t.layerId,uniformPrefix:a,usesChar:!1,usesCharColor:!1,usesCellColor:!1},this._externalLayers.set(t.layerId,n)),r){case"char":n.usesChar=!0;break;case"cellColor":n.usesCellColor=!0;break;default:n.usesCharColor=!0}}hasLayer(t){return this._externalLayers.has(t)}getLayerInfo(t){return this._externalLayers.get(t)}getExternalLayers(){return new Map(this._externalLayers)}get hasExternalLayers(){return this._externalLayers.size>0}get count(){return this._externalLayers.size}reset(){this._externalLayers.clear(),this._counter=0,this._layerIdToPrefix.clear()}}const H={char:"prevCharBuffer",charColor:"prevCharColorBuffer",cellColor:"prevCellColorBuffer",main:"prevCharColorBuffer"};class W{getContextAwareGlslFunction(t,r,a,n,o){return r!=="src"?t.glslFunction:n&&o?this._generateExternalSrcFunction(n,a,o):this._generateSelfFeedbackSrcFunction(a)}getFunctionName(t,r,a,n){return t.name!=="src"?t.name:a&&n?`src_ext_${n(a.layerId)}_${r}`:`src_${r}`}generateTransformCode(t,r,a,n,o,s,c,l,u,h,y,v,C){const _=this.getFunctionName(r,h,v,C),f=(...m)=>[...m,...u].join(", ");let i=o,p=s,d=c,b=l;switch(r.type){case"src":{const m=`c${a}`;t.push(` vec4 ${m} = ${_}(${f(n)});`),i=m;break}case"coord":{const m=`st${a}`;t.push(` vec2 ${m} = ${_}(${f(n)});`),t.push(` ${n} = ${m};`);break}case"color":{const m=`c${a}`;t.push(` vec4 ${m} = ${_}(${f(o)});`),i=m;break}case"combine":{const m=`c${a}`;t.push(` vec4 ${m} = ${_}(${f(o,y??"vec4(0.0)")});`),i=m;break}case"combineCoord":{const m=`st${a}`;t.push(` vec2 ${m} = ${_}(${f(n,y??"vec4(0.0)")});`),t.push(` ${n} = ${m};`);break}}return{colorVar:i,charVar:p,flagsVar:d,rotationVar:b}}_generateExternalSrcFunction(t,r,a){const n=a(t.layerId);return`
218
+ `,description:"Modulate coordinates based on hue differences"}];class T{_transforms;constructor(t){this._transforms=t}static empty(){return new T([])}static from(t){return new T([...t])}get transforms(){return this._transforms}push(t){this._transforms.push(t)}get length(){return this._transforms.length}get isEmpty(){return this._transforms.length===0}append(t){return new T([...this._transforms,t])}get(t){return this._transforms[t]}[Symbol.iterator](){return this._transforms[Symbol.iterator]()}}class S{_chain;_charMapping;_nestedSources;_externalLayerRefs;_colorSource;_cellColorSource;_charSource;constructor(t){this._chain=t?.chain??T.empty(),this._charMapping=t?.charMapping,this._colorSource=t?.colorSource,this._cellColorSource=t?.cellColorSource,this._charSource=t?.charSource,this._nestedSources=t?.nestedSources??new Map,this._externalLayerRefs=t?.externalLayerRefs??new Map}addTransform(t,r){const a={name:t,userArgs:r};return this._chain.push(a),this}addCombineTransform(t,r,a){const n=this._chain.length;return this._nestedSources.set(n,r),this.addTransform(t,a)}addExternalLayerRef(t){const r=this._chain.length;return this._externalLayerRefs.set(r,t),this.addTransform("src",[])}charMap(t){const r=Array.from(t),a=[];for(const n of r)a.push(n.codePointAt(0)??32);return this._charMapping={chars:t,indices:a},this}charColor(t){return this._colorSource=t,this}char(t){return this._charSource=t,this}cellColor(t){return this._cellColorSource=t,this}paint(t){return this._colorSource=t,this._cellColorSource=t,this}clone(){const t=new Map;for(const[a,n]of this._nestedSources)t.set(a,n.clone());const r=new Map;for(const[a,n]of this._externalLayerRefs)r.set(a,{...n});return new S({chain:T.from(this._chain.transforms),charMapping:this._charMapping,colorSource:this._colorSource?.clone(),cellColorSource:this._cellColorSource?.clone(),charSource:this._charSource?.clone(),nestedSources:t,externalLayerRefs:r})}get transforms(){return this._chain.transforms}get charMapping(){return this._charMapping}get colorSource(){return this._colorSource}get cellColorSource(){return this._cellColorSource}get charSource(){return this._charSource}get nestedSources(){return this._nestedSources}get externalLayerRefs(){return this._externalLayerRefs}}const j={linear:e=>e,easeInQuad:e=>e*e,easeOutQuad:e=>e*(2-e),easeInOutQuad:e=>e<.5?2*e*e:(4-2*e)*e-1,easeInCubic:e=>e*e*e,easeOutCubic:e=>--e*e*e+1,easeInOutCubic:e=>e<.5?4*e*e*e:(e-1)*(2*e-2)*(2*e-2)+1,easeInQuart:e=>e*e*e*e,easeOutQuart:e=>1- --e*e*e*e,easeInOutQuart:e=>e<.5?8*e*e*e*e:1-8*--e*e*e*e,easeInQuint:e=>e*e*e*e*e,easeOutQuint:e=>1+--e*e*e*e*e,easeInOutQuint:e=>e<.5?16*e*e*e*e*e:1+16*--e*e*e*e*e,sin:e=>(1+Math.sin(Math.PI*e-Math.PI/2))/2};function U(e,t){return(e%t+t)%t}"fast"in Array.prototype||(Array.prototype.fast=function(e=1){return this._speed=e,this},Array.prototype.smooth=function(e=1){return this._smooth=e,this},Array.prototype.ease=function(e="linear"){return typeof e=="function"?(this._smooth=1,this._ease=e):j[e]&&(this._smooth=1,this._ease=j[e]),this},Array.prototype.offset=function(e=.5){return this._offset=e%1,this},Array.prototype.fit=function(e=0,t=1){const r=Math.min(...this),a=Math.max(...this),n=this.map(o=>(function(s,c,l,f,h){return(s-c)*(h-f)/(l-c)+f})(o,r,a,e,t));return n._speed=this._speed,n._smooth=this._smooth,n._ease=this._ease,n._offset=this._offset,n}),A.registerMany(G),R.setSynthSourceClass(S),R.injectMethods(S.prototype);const P=R.generateStandaloneFunctions(),w="textmode.synth.js";class K{_usesFeedback=!1;_usesCharFeedback=!1;_usesCellColorFeedback=!1;trackUsage(t){switch(t){case"char":this._usesCharFeedback=!0;break;case"cellColor":this._usesCellColorFeedback=!0;break;default:this._usesFeedback=!0}}reset(){this._usesFeedback=!1,this._usesCharFeedback=!1,this._usesCellColorFeedback=!1}getUsage(){return{usesCharColorFeedback:this._usesFeedback,usesCharFeedback:this._usesCharFeedback,usesCellColorFeedback:this._usesCellColorFeedback}}get usesAnyFeedback(){return this._usesFeedback||this._usesCharFeedback||this._usesCellColorFeedback}get usesCharColorFeedback(){return this._usesFeedback}get usesCharFeedback(){return this._usesCharFeedback}get usesCellColorFeedback(){return this._usesCellColorFeedback}}class Q{_externalLayers=new Map;_counter=0;_layerIdToPrefix=new Map;getPrefix(t){let r=this._layerIdToPrefix.get(t);return r||(r="extLayer"+this._counter++,this._layerIdToPrefix.set(t,r)),r}trackUsage(t,r){const a=this.getPrefix(t.layerId);let n=this._externalLayers.get(t.layerId);switch(n||(n={layerId:t.layerId,uniformPrefix:a,usesChar:!1,usesCharColor:!1,usesCellColor:!1},this._externalLayers.set(t.layerId,n)),r){case"char":n.usesChar=!0;break;case"cellColor":n.usesCellColor=!0;break;default:n.usesCharColor=!0}}hasLayer(t){return this._externalLayers.has(t)}getLayerInfo(t){return this._externalLayers.get(t)}getExternalLayers(){return new Map(this._externalLayers)}get hasExternalLayers(){return this._externalLayers.size>0}get count(){return this._externalLayers.size}reset(){this._externalLayers.clear(),this._counter=0,this._layerIdToPrefix.clear()}}const H={char:"prevCharBuffer",charColor:"prevCharColorBuffer",cellColor:"prevCellColorBuffer",main:"prevCharColorBuffer"};class W{getContextAwareGlslFunction(t,r,a,n,o){return r!=="src"?t.glslFunction:n&&o?this._generateExternalSrcFunction(n,a,o):this._generateSelfFeedbackSrcFunction(a)}getFunctionName(t,r,a,n){return t.name!=="src"?t.name:a&&n?`src_ext_${n(a.layerId)}_${r}`:`src_${r}`}generateTransformCode(t,r,a,n,o,s,c,l,f,h,y,v,C){const _=this.getFunctionName(r,h,v,C),p=(...d)=>[...d,...f].join(", ");let i=o,u=s,m=c,b=l;switch(r.type){case"src":{const d=`c${a}`;t.push(` vec4 ${d} = ${_}(${p(n)});`),i=d;break}case"coord":{const d=`st${a}`;t.push(` vec2 ${d} = ${_}(${p(n)});`),t.push(` ${n} = ${d};`);break}case"color":{const d=`c${a}`;t.push(` vec4 ${d} = ${_}(${p(o)});`),i=d;break}case"combine":{const d=`c${a}`;t.push(` vec4 ${d} = ${_}(${p(o,y??"vec4(0.0)")});`),i=d;break}case"combineCoord":{const d=`st${a}`;t.push(` vec2 ${d} = ${_}(${p(n,y??"vec4(0.0)")});`),t.push(` ${n} = ${d};`);break}}return{colorVar:i,charVar:u,flagsVar:m,rotationVar:b}}_generateExternalSrcFunction(t,r,a){const n=a(t.layerId);return`
219
219
  vec4 ${`src_ext_${n}_${r}`}(vec2 _st) {
220
220
  return texture(${{char:`${n}_char`,charColor:`${n}_primary`,cellColor:`${n}_cell`,main:`${n}_primary`}[r]}, fract(_st));
221
221
  }
@@ -223,21 +223,21 @@ vec4 ${`src_ext_${n}_${r}`}(vec2 _st) {
223
223
  vec4 ${`src_${t}`}(vec2 _st) {
224
224
  return texture(${H[t]}, fract(_st));
225
225
  }
226
- `}}class J{_uniforms=new Map;_dynamicUpdaters=new Map;processArgument(t,r,a){if((function(n){return Array.isArray(n)&&n.length>0&&typeof n[0]=="number"})(t)){const n=`${a}_${r.name}`,o={name:n,type:r.type,value:r.default??0,isDynamic:!0},s=c=>(function(l,u){const h=l._speed??1,y=l._smooth??0;let v=u.time*h*(u.bpm/60)+(l._offset??0);if(y!==0){const C=l._ease??j.linear,_=v-y/2,f=l[Math.floor(B(_,l.length))],i=l[Math.floor(B(_+1,l.length))];return C(Math.min(B(_,1)/y,1))*(i-f)+f}return l[Math.floor(B(v,l.length))]})(t,c);return this._uniforms.set(n,o),this._dynamicUpdaters.set(n,s),{glslValue:n,uniform:o,updater:s}}if(typeof t=="function"){const n=`${a}_${r.name}`,o={name:n,type:r.type,value:r.default??0,isDynamic:!0};return this._uniforms.set(n,o),this._dynamicUpdaters.set(n,t),{glslValue:n,uniform:o,updater:t}}if(typeof t=="number")return{glslValue:x(t)};if(Array.isArray(t)&&typeof t[0]=="number"){const n=t;if(n.length===2)return{glslValue:`vec2(${x(n[0])}, ${x(n[1])})`};if(n.length===3)return{glslValue:`vec3(${x(n[0])}, ${x(n[1])}, ${x(n[2])})`};if(n.length===4)return{glslValue:`vec4(${x(n[0])}, ${x(n[1])}, ${x(n[2])}, ${x(n[3])})`}}return this.processDefault(r)}processDefault(t){const r=t.default;return typeof r=="number"?{glslValue:x(r)}:Array.isArray(r)?{glslValue:`vec${r.length}(${r.map(x).join(", ")})`}:{glslValue:"0.0"}}getUniforms(){return new Map(this._uniforms)}getDynamicUpdaters(){return new Map(this._dynamicUpdaters)}clear(){this._uniforms.clear(),this._dynamicUpdaters.clear()}}function x(e){const t=e.toString();return t.includes(".")?t:t+".0"}function X(e){return new Z().compile(e)}class Z{_uniformManager=new J;_feedbackTracker=new K;_externalLayerManager=new Q;_codeGenerator=new W;_glslFunctions=new Set;_mainCode=[];_varCounter=0;_currentTarget="main";compile(t){this._reset();const r=this._compileChain(t,"main","vec4(1.0, 1.0, 1.0, 1.0)","v_uv","main");let a=r.charVar;t.charSource&&(a=this._compileCharSource(t));let n=r.colorVar;t.colorSource&&(n=this._compileChain(t.colorSource,"charColor","vec4(1.0, 1.0, 1.0, 1.0)","v_uv","charColor").colorVar);let o="vec4(0.0, 0.0, 0.0, 0.0)";t.cellColorSource&&(o=this._compileChain(t.cellColorSource,"cellColor","vec4(0.0, 0.0, 0.0, 0.0)","v_uv","cellColor").colorVar);const s=(function(u,h,y){return u?`
226
+ `}}class J{_uniforms=new Map;_dynamicUpdaters=new Map;processArgument(t,r,a){if((function(n){return Array.isArray(n)&&n.length>0&&typeof n[0]=="number"})(t)){const n=`${a}_${r.name}`,o={name:n,type:r.type,value:r.default??0,isDynamic:!0},s=c=>(function(l,f){const h=l._speed??1,y=l._smooth??0;let v=f.time*h*(f.bpm/60)+(l._offset??0);if(y!==0){const C=l._ease??j.linear,_=v-y/2,p=l[Math.floor(U(_,l.length))],i=l[Math.floor(U(_+1,l.length))];return C(Math.min(U(_,1)/y,1))*(i-p)+p}return l[Math.floor(U(v,l.length))]})(t,c);return this._uniforms.set(n,o),this._dynamicUpdaters.set(n,s),{glslValue:n,uniform:o,updater:s}}if(typeof t=="function"){const n=`${a}_${r.name}`,o={name:n,type:r.type,value:r.default??0,isDynamic:!0};return this._uniforms.set(n,o),this._dynamicUpdaters.set(n,t),{glslValue:n,uniform:o,updater:t}}if(typeof t=="number")return{glslValue:x(t)};if(Array.isArray(t)&&typeof t[0]=="number"){const n=t;if(n.length===2)return{glslValue:`vec2(${x(n[0])}, ${x(n[1])})`};if(n.length===3)return{glslValue:`vec3(${x(n[0])}, ${x(n[1])}, ${x(n[2])})`};if(n.length===4)return{glslValue:`vec4(${x(n[0])}, ${x(n[1])}, ${x(n[2])}, ${x(n[3])})`}}return this.processDefault(r)}processDefault(t){const r=t.default;return typeof r=="number"?{glslValue:x(r)}:Array.isArray(r)?{glslValue:`vec${r.length}(${r.map(x).join(", ")})`}:{glslValue:"0.0"}}getUniforms(){return new Map(this._uniforms)}getDynamicUpdaters(){return new Map(this._dynamicUpdaters)}clear(){this._uniforms.clear(),this._dynamicUpdaters.clear()}}function x(e){const t=e.toString();return t.includes(".")?t:t+".0"}function X(e){return new Z().compile(e)}class Z{_uniformManager=new J;_feedbackTracker=new K;_externalLayerManager=new Q;_codeGenerator=new W;_glslFunctions=new Set;_mainCode=[];_varCounter=0;_currentTarget="main";_usesCharSource=!1;compile(t){this._reset();const r=this._compileChain(t,"main","vec4(1.0, 1.0, 1.0, 1.0)","v_uv","main");let a=r.charVar;t.charSource&&(a=this._compileCharSource(t));let n=r.colorVar;t.colorSource&&(n=this._compileChain(t.colorSource,"charColor","vec4(1.0, 1.0, 1.0, 1.0)","v_uv","charColor").colorVar);let o="vec4(0.0, 0.0, 0.0, 0.0)";t.cellColorSource&&(o=this._compileChain(t.cellColorSource,"cellColor","vec4(0.0, 0.0, 0.0, 0.0)","v_uv","cellColor").colorVar);const s=(function(f,h,y){return f?`
227
227
  // Character output from generator
228
228
  vec4 charOutput = ${h};`:`
229
229
  // Derive character from color luminance
230
230
  float lum = _luminance(${y}.rgb);
231
231
  int charIdx = int(lum * 255.0);
232
- vec4 charOutput = vec4(float(charIdx % 256) / 255.0, float(charIdx / 256) / 255.0, 0.0, 0.0);`})(!!a,a??"vec4(0.0)",r.colorVar),c=this._feedbackTracker.getUsage();return{fragmentSource:(function(u){const{uniforms:h,glslFunctions:y,mainCode:v,charOutputCode:C,primaryColorVar:_,cellColorVar:f,charMapping:i,usesFeedback:p,usesCharFeedback:d,usesCellColorFeedback:b,externalLayers:m}=u,M=Array.from(h.values()).map(F=>`uniform ${F.type} ${F.name};`).join(`
233
- `);let A="",z="";i&&(A=`uniform int u_charMap[${i.indices.length}];
234
- uniform int u_charMapSize;`,z=`
232
+ vec4 charOutput = vec4(float(charIdx % 256) / 255.0, float(charIdx / 256) / 255.0, 0.0, 0.0);`})(!!a,a??"vec4(0.0)",r.colorVar),c=this._feedbackTracker.getUsage();return{fragmentSource:(function(f){const{uniforms:h,glslFunctions:y,mainCode:v,charOutputCode:C,primaryColorVar:_,cellColorVar:p,charMapping:i,usesFeedback:u,usesCharFeedback:m,usesCellColorFeedback:b,usesCharSource:d,externalLayers:M}=f,B=Array.from(h.values()).map(F=>`uniform ${F.type} ${F.name};`).join(`
233
+ `);let z="",$="";i&&(z=`uniform int u_charMap[${i.indices.length}];
234
+ uniform int u_charMapSize;`,$=`
235
235
  // Apply character mapping
236
236
  int rawCharIdx = int(charOutput.r * 255.0 + charOutput.g * 255.0 * 256.0);
237
237
  int mappedCharIdx = u_charMap[int(mod(float(rawCharIdx), float(u_charMapSize)))];
238
238
  charOutput.r = float(mappedCharIdx % 256) / 255.0;
239
- charOutput.g = float(mappedCharIdx / 256) / 255.0;`);const S=[];p&&S.push("uniform sampler2D prevCharColorBuffer;"),d&&S.push("uniform sampler2D prevCharBuffer;"),b&&S.push("uniform sampler2D prevCellColorBuffer;");const V=S.join(`
240
- `),U=[];if(m)for(const[,F]of m)F.usesChar&&U.push(`uniform sampler2D ${F.uniformPrefix}_char;`),F.usesCharColor&&U.push(`uniform sampler2D ${F.uniformPrefix}_primary;`),F.usesCellColor&&U.push(`uniform sampler2D ${F.uniformPrefix}_cell;`);return`#version 300 es
239
+ charOutput.g = float(mappedCharIdx / 256) / 255.0;`);const k=[];u&&k.push("uniform sampler2D prevCharColorBuffer;"),m&&k.push("uniform sampler2D prevCharBuffer;"),b&&k.push("uniform sampler2D prevCellColorBuffer;");const oe=k.join(`
240
+ `),se=d?"uniform float u_charSourceCount;":"",V=[];if(M)for(const[,F]of M)F.usesChar&&V.push(`uniform sampler2D ${F.uniformPrefix}_char;`),F.usesCharColor&&V.push(`uniform sampler2D ${F.uniformPrefix}_primary;`),F.usesCellColor&&V.push(`uniform sampler2D ${F.uniformPrefix}_cell;`);return`#version 300 es
241
241
  precision highp float;
242
242
 
243
243
  // Varyings
@@ -251,14 +251,15 @@ layout(location = 2) out vec4 o_secondaryColor;
251
251
  // Standard uniforms
252
252
  uniform float time;
253
253
  uniform vec2 resolution;
254
- ${V}
255
- ${U.length>0?`// External layer samplers
256
- ${U.join(`
254
+ ${oe}
255
+ ${V.length>0?`// External layer samplers
256
+ ${V.join(`
257
257
  `)}`:""}
258
- ${A}
258
+ ${z}
259
+ ${se}
259
260
 
260
261
  // Dynamic uniforms
261
- ${M}
262
+ ${B}
262
263
 
263
264
 
264
265
  // Utility functions
@@ -368,11 +369,11 @@ ${v.join(`
368
369
  `)}
369
370
 
370
371
  ${C}
371
- ${z}
372
+ ${$}
372
373
 
373
374
  // Output to MRT
374
375
  o_character = charOutput;
375
376
  o_primaryColor = ${_};
376
- o_secondaryColor = ${f};
377
+ o_secondaryColor = ${p};
377
378
  }
378
- `})({uniforms:this._uniformManager.getUniforms(),glslFunctions:this._glslFunctions,mainCode:this._mainCode,charOutputCode:s,primaryColorVar:n,cellColorVar:o,charMapping:t.charMapping,usesFeedback:c.usesCharColorFeedback,usesCharFeedback:c.usesCharFeedback,usesCellColorFeedback:c.usesCellColorFeedback,externalLayers:this._externalLayerManager.getExternalLayers()}),uniforms:this._uniformManager.getUniforms(),dynamicUpdaters:this._uniformManager.getDynamicUpdaters(),charMapping:t.charMapping,usesCharColorFeedback:c.usesCharColorFeedback,usesCharFeedback:c.usesCharFeedback,usesCellColorFeedback:c.usesCellColorFeedback,externalLayers:this._externalLayerManager.getExternalLayers()}}_reset(){this._varCounter=0,this._uniformManager.clear(),this._feedbackTracker.reset(),this._externalLayerManager.reset(),this._glslFunctions.clear(),this._mainCode.length=0,this._currentTarget="main"}_compileCharSource(t){const r=this._compileChain(t.charSource,"charSrc","vec4(1.0, 1.0, 1.0, 1.0)","v_uv","char"),a="charFromSource_"+this._varCounter++,n=t.charCount??256;return this._mainCode.push(" // Convert charSource color to character index"),this._mainCode.push(` float charLum_${a} = _luminance(${r.colorVar}.rgb);`),this._mainCode.push(` int charIdx_${a} = int(charLum_${a} * ${n.toFixed(1)});`),this._mainCode.push(` vec4 ${a} = vec4(float(charIdx_${a} % 256) / 255.0, float(charIdx_${a} / 256) / 255.0, 0.0, 0.0);`),a}_compileChain(t,r,a,n="v_uv",o="main"){const s=this._currentTarget;this._currentTarget=o;const c=`${r}_st`;let l,u,h,y=`${r}_c`;this._mainCode.push(` vec2 ${c} = ${n};`),this._mainCode.push(` vec4 ${y} = ${a};`);const v=t.transforms,C=v.map(i=>this._getProcessedTransform(i.name)),_=this._identifyCoordTransforms(C),f=i=>{const p=v[i],d=C[i];if(!d)return void console.warn(`[SynthCompiler] Unknown transform: ${p.name}`);const b=t.externalLayerRefs.get(i);p.name==="src"&&this._trackSrcUsage(b);const m=this._codeGenerator.getContextAwareGlslFunction(d,p.name,this._currentTarget,b,V=>this._externalLayerManager.getPrefix(V));this._glslFunctions.add(m);const M=this._processArguments(p.userArgs,d.inputs,`${r}_${i}_${p.name}`),A=t.nestedSources.get(i);let z;A&&(d.type==="combine"||d.type==="combineCoord")&&(z=this._compileChain(A,`${r}_nested_${i}`,a,c,o).colorVar);const S=this._codeGenerator.generateTransformCode(this._mainCode,d,this._varCounter++,c,y,l,u,h,M,this._currentTarget,z,b,V=>this._externalLayerManager.getPrefix(V));y=S.colorVar,S.charVar&&(l=S.charVar),S.flagsVar&&(u=S.flagsVar),S.rotationVar&&(h=S.rotationVar)};for(let i=_.length-1;i>=0;i--)f(_[i]);for(let i=0;i<v.length;i++){const p=C[i];(!p||p.type!=="coord"&&p.type!=="combineCoord")&&f(i)}return this._currentTarget=s,{coordVar:c,colorVar:y,charVar:l,flagsVar:u,rotationVar:h}}_identifyCoordTransforms(t){const r=[];for(let a=0;a<t.length;a++){const n=t[a];n&&(n.type!=="coord"&&n.type!=="combineCoord"||r.push(a))}return r}_trackSrcUsage(t){t?this._externalLayerManager.trackUsage(t,this._currentTarget):this._feedbackTracker.trackUsage(this._currentTarget)}_getProcessedTransform(t){return L.getProcessed(t)}_processArguments(t,r,a){const n=[];for(let o=0;o<r.length;o++){const s=r[o],c=t[o]??s.default,l=this._uniformManager.processArgument(c,s,a);n.push(l.glslValue)}return n}}class ee{_resolvedIndices;_lastFontCharacterCount=0;_lastChars="";resolve(t,r){const a=r.characters.length;if(this._resolvedIndices&&this._lastFontCharacterCount===a&&this._lastChars===t)return this._resolvedIndices;const n=Array.from(t),o=new Int32Array(n.length),s=r.characterMap,c=r.characters;for(let l=0;l<n.length;l++){const u=n[l],h=s.get(u);if(h!==void 0)o[l]=c.indexOf(h);else{const y=s.get(" ");o[l]=y!==void 0?c.indexOf(y):0}}return this._resolvedIndices=o,this._lastFontCharacterCount=a,this._lastChars=t,o}invalidate(){this._resolvedIndices=void 0,this._lastFontCharacterCount=0,this._lastChars=""}}function E(e={}){return{source:e.source??new w,compiled:e.compiled,shader:e.shader,characterResolver:e.characterResolver??new ee,needsCompile:e.needsCompile??!1,pingPongBuffers:e.pingPongBuffers,pingPongIndex:e.pingPongIndex??0,externalLayerMap:e.externalLayerMap,bpm:e.bpm}}let D=60;function te(e){e.bpm=function(t){return(function(r){D=r})(t),t}}function T(e){const t=new Map;for(const[,r]of e.externalLayerRefs)t.set(r.layerId,r.layer);for(const[,r]of e.nestedSources){const a=T(r);for(const[n,o]of a)t.set(n,o)}if(e.charSource){const r=T(e.charSource);for(const[a,n]of r)t.set(a,n)}if(e.colorSource){const r=T(e.colorSource);for(const[a,n]of r)t.set(a,n)}if(e.cellColorSource){const r=T(e.cellColorSource);for(const[a,n]of r)t.set(a,n)}return t}let O=null;function q(e,t,r){const a=r??O;if(a)try{a(e,t)}catch{}}function ne(e,t,r,a={}){let n;try{n=e()}catch(o){return q(o,t,a.onError),r}return(function(o){return o==null?!1:typeof o=="number"?Number.isFinite(o):Array.isArray(o)?o.length>0&&o.every(s=>typeof s=="number"&&Number.isFinite(s)):!1})(n)?n:(q(new Error(`[textmode.synth.js] Invalid dynamic parameter value for "${t}": ${N(n)}`),t,a.onError),r)}function N(e){if(e===void 0)return"undefined";if(e===null)return"null";if(typeof e=="number"){if(Number.isNaN(e))return"NaN";if(!Number.isFinite(e))return e>0?"Infinity":"-Infinity"}if(Array.isArray(e)){const t=e.findIndex(r=>typeof r!="number"||!Number.isFinite(r));if(t>=0)return`array with invalid element at index ${t}: ${N(e[t])}`}return String(e)}function re(e){const t=e.getPluginState($);t&&(t.shader?.dispose&&t.shader.dispose(),t.pingPongBuffers&&(t.pingPongBuffers[0].dispose?.(),t.pingPongBuffers[1].dispose?.()))}const ae={name:$,version:"1.0.0",install(e,t){te(e),(function(r){r.extendLayer("synth",function(a){const n=this.grid!==void 0&&this.drawFramebuffer!==void 0;let o=this.getPluginState($);o?(o.source=a,o.needsCompile=!0,o.characterResolver.invalidate(),n&&(o.compiled=X(a))):o=E({source:a,compiled:n?X(a):void 0,needsCompile:!0}),this.setPluginState($,o)})})(t),(function(r){r.extendLayer("bpm",function(a){let n=this.getPluginState($);n?n.bpm=a:n=E({bpm:a}),this.setPluginState($,n)})})(t),(function(r){r.extendLayer("clearSynth",function(){const a=this.getPluginState($);a&&(a.shader?.dispose&&a.shader.dispose(),a.pingPongBuffers&&(a.pingPongBuffers[0].dispose?.(),a.pingPongBuffers[1].dispose?.()),this.setPluginState($,void 0))})})(t),t.registerLayerPreRenderHook(r=>(async function(a,n){const o=a.getPluginState($);if(!o)return;const s=a.grid,c=a.drawFramebuffer;if(!s||!c||(o.compiled||(o.compiled=X(o.source),o.externalLayerMap=T(o.source),o.needsCompile=!0),o.needsCompile&&o.compiled&&(o.shader?.dispose&&o.shader.dispose(),o.externalLayerMap=T(o.source),o.shader=await n.createFilterShader(o.compiled.fragmentSource),o.needsCompile=!1),!o.shader||!o.compiled))return;const l=o.compiled.usesCharColorFeedback,u=o.compiled.usesCharFeedback,h=o.compiled.usesCellColorFeedback,y=l||u||h;y&&!o.pingPongBuffers&&(o.pingPongBuffers=[n.createFramebuffer({width:s.cols,height:s.rows,attachments:3}),n.createFramebuffer({width:s.cols,height:s.rows,attachments:3})],o.pingPongIndex=0);const v={time:n.secs,frameCount:n.frameCount,width:s.width,height:s.height,cols:s.cols,rows:s.rows,bpm:o.bpm??D},C=new Map;for(const[f,i]of o.compiled.dynamicUpdaters){const p=o.compiled.uniforms.get(f),d=ne(()=>i(v),f,p?.value??0,{onError:o.onDynamicError});C.set(f,d)}const _=f=>{n.setUniform("time",n.secs),n.setUniform("resolution",[v.cols,v.rows]);for(const[p,d]of C)n.setUniform(p,d);for(const[p,d]of o.compiled.uniforms)d.isDynamic||typeof d.value=="function"||n.setUniform(p,d.value);if(o.compiled.charMapping){const p=o.characterResolver.resolve(o.compiled.charMapping.chars,a.font);n.setUniform("u_charMap",p),n.setUniform("u_charMapSize",p.length)}f&&(l&&n.setUniform("prevCharColorBuffer",f.textures[1]),u&&n.setUniform("prevCharBuffer",f.textures[0]),h&&n.setUniform("prevCellColorBuffer",f.textures[2]));const i=o.compiled.externalLayers;if(i&&i.size>0&&o.externalLayerMap)for(const[p,d]of i){const b=o.externalLayerMap.get(p);if(!b){console.warn(`[textmode.synth.js] External layer not found: ${p}`);continue}const m=b.getPluginState($);let M;m?.pingPongBuffers?M=m.pingPongBuffers[m.pingPongIndex].textures:b.drawFramebuffer&&(M=b.drawFramebuffer.textures),M&&(d.usesChar&&n.setUniform(`${d.uniformPrefix}_char`,M[0]),d.usesCharColor&&n.setUniform(`${d.uniformPrefix}_primary`,M[1]),d.usesCellColor&&n.setUniform(`${d.uniformPrefix}_cell`,M[2]))}};if(y&&o.pingPongBuffers){const f=o.pingPongBuffers[o.pingPongIndex],i=o.pingPongBuffers[1-o.pingPongIndex];i.begin(),n.clear(),n.shader(o.shader),_(f),n.rect(s.cols,s.rows),i.end(),c.begin(),n.clear(),n.shader(o.shader),_(f),n.rect(s.cols,s.rows),c.end(),o.pingPongIndex=1-o.pingPongIndex}else c.begin(),n.clear(),n.shader(o.shader),_(null),n.rect(s.cols,s.rows),c.end()})(r,e)),t.registerLayerDisposedHook(re)},uninstall(e,t){const r=[t.layerManager.base,...t.layerManager.all];for(const a of r){const n=a.getPluginState($);n&&(n.shader?.dispose&&n.shader.dispose(),n.pingPongBuffers&&(n.pingPongBuffers[0].dispose?.(),n.pingPongBuffers[1].dispose?.()))}delete e.bpm,t.removeLayerExtension("synth"),t.removeLayerExtension("bpm"),t.removeLayerExtension("clearSynth")}};g.SynthPlugin=ae,g.SynthSource=w,g.cellColor=e=>{const t=new w;return t._colorSource=e,t},g.char=(e,t)=>{const r=new w;return r._charSource=e,r._charCount=t,r},g.charColor=e=>{const t=new w;return t._colorSource=e,t},g.gradient=function(e){return k.gradient(e)},g.noise=function(e,t){return k.noise(e,t)},g.osc=function(e,t,r){return k.osc(e,t,r)},g.paint=e=>{const t=new w;return t._colorSource=e,t._cellColorSource=e,t},g.setGlobalErrorCallback=function(e){O=e},g.shape=function(e,t,r){return k.shape(e,t,r)},g.solid=function(e,t,r,a){return k.solid(e,t,r,a)},g.src=e=>{const t=k.src;if(!e)return t();const r=new w,a=e.id??`layer_${Date.now()}_${Math.random().toString(36).slice(2,9)}`;return r.addExternalLayerRef({layerId:a,layer:e}),r},g.voronoi=function(e,t,r){return k.voronoi(e,t,r)},Object.defineProperty(g,Symbol.toStringTag,{value:"Module"})});
379
+ `})({uniforms:this._uniformManager.getUniforms(),glslFunctions:this._glslFunctions,mainCode:this._mainCode,charOutputCode:s,primaryColorVar:n,cellColorVar:o,charMapping:t.charMapping,usesFeedback:c.usesCharColorFeedback,usesCharFeedback:c.usesCharFeedback,usesCellColorFeedback:c.usesCellColorFeedback,usesCharSource:this._usesCharSource,externalLayers:this._externalLayerManager.getExternalLayers()}),uniforms:this._uniformManager.getUniforms(),dynamicUpdaters:this._uniformManager.getDynamicUpdaters(),charMapping:t.charMapping,usesCharColorFeedback:c.usesCharColorFeedback,usesCharFeedback:c.usesCharFeedback,usesCellColorFeedback:c.usesCellColorFeedback,usesCharSource:this._usesCharSource,externalLayers:this._externalLayerManager.getExternalLayers()}}_reset(){this._varCounter=0,this._uniformManager.clear(),this._feedbackTracker.reset(),this._externalLayerManager.reset(),this._glslFunctions.clear(),this._mainCode.length=0,this._currentTarget="main",this._usesCharSource=!1}_compileCharSource(t){this._usesCharSource=!0;const r=this._compileChain(t.charSource,"charSrc","vec4(1.0, 1.0, 1.0, 1.0)","v_uv","char"),a="charFromSource_"+this._varCounter++;return this._mainCode.push(" // Convert charSource color to character index"),this._mainCode.push(` float charLum_${a} = _luminance(${r.colorVar}.rgb);`),this._mainCode.push(` int charIdx_${a} = int(charLum_${a} * u_charSourceCount);`),this._mainCode.push(` vec4 ${a} = vec4(float(charIdx_${a} % 256) / 255.0, float(charIdx_${a} / 256) / 255.0, 0.0, 0.0);`),a}_compileChain(t,r,a,n="v_uv",o="main"){const s=this._currentTarget;this._currentTarget=o;const c=`${r}_st`;let l,f,h,y=`${r}_c`;this._mainCode.push(` vec2 ${c} = ${n};`),this._mainCode.push(` vec4 ${y} = ${a};`);const v=t.transforms,C=v.map(i=>this._getProcessedTransform(i.name)),_=this._identifyCoordTransforms(C),p=i=>{const u=v[i],m=C[i];if(!m)return void console.warn(`[SynthCompiler] Unknown transform: ${u.name}`);const b=t.externalLayerRefs.get(i);u.name==="src"&&this._trackSrcUsage(b);const d=this._codeGenerator.getContextAwareGlslFunction(m,u.name,this._currentTarget,b,k=>this._externalLayerManager.getPrefix(k));this._glslFunctions.add(d);const M=this._processArguments(u.userArgs,m.inputs,`${r}_${i}_${u.name}`),B=t.nestedSources.get(i);let z;B&&(m.type==="combine"||m.type==="combineCoord")&&(z=this._compileChain(B,`${r}_nested_${i}`,a,c,o).colorVar);const $=this._codeGenerator.generateTransformCode(this._mainCode,m,this._varCounter++,c,y,l,f,h,M,this._currentTarget,z,b,k=>this._externalLayerManager.getPrefix(k));y=$.colorVar,$.charVar&&(l=$.charVar),$.flagsVar&&(f=$.flagsVar),$.rotationVar&&(h=$.rotationVar)};for(let i=_.length-1;i>=0;i--)p(_[i]);for(let i=0;i<v.length;i++){const u=C[i];(!u||u.type!=="coord"&&u.type!=="combineCoord")&&p(i)}return this._currentTarget=s,{coordVar:c,colorVar:y,charVar:l,flagsVar:f,rotationVar:h}}_identifyCoordTransforms(t){const r=[];for(let a=0;a<t.length;a++){const n=t[a];n&&(n.type!=="coord"&&n.type!=="combineCoord"||r.push(a))}return r}_trackSrcUsage(t){t?this._externalLayerManager.trackUsage(t,this._currentTarget):this._feedbackTracker.trackUsage(this._currentTarget)}_getProcessedTransform(t){return A.getProcessed(t)}_processArguments(t,r,a){const n=[];for(let o=0;o<r.length;o++){const s=r[o],c=t[o]??s.default,l=this._uniformManager.processArgument(c,s,a);n.push(l.glslValue)}return n}}class ee{_resolvedIndices;_lastFontCharacterCount=0;_lastChars="";resolve(t,r){const a=r.characters.length;if(this._resolvedIndices&&this._lastFontCharacterCount===a&&this._lastChars===t)return this._resolvedIndices;const n=Array.from(t),o=new Int32Array(n.length),s=r.characterMap,c=r.characters;for(let l=0;l<n.length;l++){const f=n[l],h=s.get(f);if(h!==void 0)o[l]=c.indexOf(h);else{const y=s.get(" ");o[l]=y!==void 0?c.indexOf(y):0}}return this._resolvedIndices=o,this._lastFontCharacterCount=a,this._lastChars=t,o}invalidate(){this._resolvedIndices=void 0,this._lastFontCharacterCount=0,this._lastChars=""}}function E(e={}){return{source:e.source??new S,compiled:e.compiled,shader:e.shader,characterResolver:e.characterResolver??new ee,needsCompile:e.needsCompile??!1,pingPongBuffers:e.pingPongBuffers,pingPongIndex:e.pingPongIndex??0,externalLayerMap:e.externalLayerMap,bpm:e.bpm}}let D=60;function te(e){e.bpm=function(t){return(function(r){D=r})(t),t}}function I(e){const t=new Map;for(const[,r]of e.externalLayerRefs)t.set(r.layerId,r.layer);for(const[,r]of e.nestedSources){const a=I(r);for(const[n,o]of a)t.set(n,o)}if(e.charSource){const r=I(e.charSource);for(const[a,n]of r)t.set(a,n)}if(e.colorSource){const r=I(e.colorSource);for(const[a,n]of r)t.set(a,n)}if(e.cellColorSource){const r=I(e.cellColorSource);for(const[a,n]of r)t.set(a,n)}return t}let O=null;function q(e,t,r){const a=r??O;if(a)try{a(e,t)}catch{}}function ne(e,t,r,a={}){let n;try{n=e()}catch(o){return q(o,t,a.onError),r}return(function(o){return o==null?!1:typeof o=="number"?Number.isFinite(o):Array.isArray(o)?o.length>0&&o.every(s=>typeof s=="number"&&Number.isFinite(s)):!1})(n)?n:(q(new Error(`[textmode.synth.js] Invalid dynamic parameter value for "${t}": ${N(n)}`),t,a.onError),r)}function N(e){if(e===void 0)return"undefined";if(e===null)return"null";if(typeof e=="number"){if(Number.isNaN(e))return"NaN";if(!Number.isFinite(e))return e>0?"Infinity":"-Infinity"}if(Array.isArray(e)){const t=e.findIndex(r=>typeof r!="number"||!Number.isFinite(r));if(t>=0)return`array with invalid element at index ${t}: ${N(e[t])}`}return String(e)}function re(e){const t=e.getPluginState(w);t&&(t.shader?.dispose&&t.shader.dispose(),t.pingPongBuffers&&(t.pingPongBuffers[0].dispose?.(),t.pingPongBuffers[1].dispose?.()))}const ae={name:w,version:"1.0.0",install(e,t){te(e),(function(r){r.extendLayer("synth",function(a){const n=this.grid!==void 0&&this.drawFramebuffer!==void 0;let o=this.getPluginState(w);o?(o.source=a,o.needsCompile=!0,o.characterResolver.invalidate(),n&&(o.compiled=X(a))):o=E({source:a,compiled:n?X(a):void 0,needsCompile:!0}),this.setPluginState(w,o)})})(t),(function(r){r.extendLayer("bpm",function(a){let n=this.getPluginState(w);n?n.bpm=a:n=E({bpm:a}),this.setPluginState(w,n)})})(t),(function(r){r.extendLayer("clearSynth",function(){const a=this.getPluginState(w);a&&(a.shader?.dispose&&a.shader.dispose(),a.pingPongBuffers&&(a.pingPongBuffers[0].dispose?.(),a.pingPongBuffers[1].dispose?.()),this.setPluginState(w,void 0))})})(t),t.registerLayerPreRenderHook(r=>(async function(a,n){const o=a.getPluginState(w);if(!o)return;const s=a.grid,c=a.drawFramebuffer;if(!s||!c||(o.compiled||(o.compiled=X(o.source),o.externalLayerMap=I(o.source),o.needsCompile=!0),o.needsCompile&&o.compiled&&(o.shader?.dispose&&o.shader.dispose(),o.externalLayerMap=I(o.source),o.shader=await n.createFilterShader(o.compiled.fragmentSource),o.needsCompile=!1),!o.shader||!o.compiled))return;const l=o.compiled.usesCharColorFeedback,f=o.compiled.usesCharFeedback,h=o.compiled.usesCellColorFeedback,y=l||f||h;y&&!o.pingPongBuffers&&(o.pingPongBuffers=[n.createFramebuffer({width:s.cols,height:s.rows,attachments:3}),n.createFramebuffer({width:s.cols,height:s.rows,attachments:3})],o.pingPongIndex=0);const v={time:n.secs,frameCount:n.frameCount,width:s.width,height:s.height,cols:s.cols,rows:s.rows,bpm:o.bpm??D},C=new Map;for(const[p,i]of o.compiled.dynamicUpdaters){const u=o.compiled.uniforms.get(p),m=ne(()=>i(v),p,u?.value??0,{onError:o.onDynamicError});C.set(p,m)}const _=p=>{n.setUniform("time",n.secs),n.setUniform("resolution",[v.cols,v.rows]);for(const[u,m]of C)n.setUniform(u,m);for(const[u,m]of o.compiled.uniforms)m.isDynamic||typeof m.value=="function"||n.setUniform(u,m.value);if(o.compiled.charMapping){const u=o.characterResolver.resolve(o.compiled.charMapping.chars,a.font);n.setUniform("u_charMap",u),n.setUniform("u_charMapSize",u.length)}if(o.compiled.usesCharSource){const u=o.compiled.charMapping?o.compiled.charMapping.chars.length:a.font.characters.length;n.setUniform("u_charSourceCount",u)}p&&(l&&n.setUniform("prevCharColorBuffer",p.textures[1]),f&&n.setUniform("prevCharBuffer",p.textures[0]),h&&n.setUniform("prevCellColorBuffer",p.textures[2]));const i=o.compiled.externalLayers;if(i&&i.size>0&&o.externalLayerMap)for(const[u,m]of i){const b=o.externalLayerMap.get(u);if(!b){console.warn(`[textmode.synth.js] External layer not found: ${u}`);continue}const d=b.getPluginState(w);let M;d?.pingPongBuffers?M=d.pingPongBuffers[d.pingPongIndex].textures:b.drawFramebuffer&&(M=b.drawFramebuffer.textures),M&&(m.usesChar&&n.setUniform(`${m.uniformPrefix}_char`,M[0]),m.usesCharColor&&n.setUniform(`${m.uniformPrefix}_primary`,M[1]),m.usesCellColor&&n.setUniform(`${m.uniformPrefix}_cell`,M[2]))}};if(y&&o.pingPongBuffers){const p=o.pingPongBuffers[o.pingPongIndex],i=o.pingPongBuffers[1-o.pingPongIndex];i.begin(),n.clear(),n.shader(o.shader),_(p),n.rect(s.cols,s.rows),i.end(),c.begin(),n.clear(),n.shader(o.shader),_(p),n.rect(s.cols,s.rows),c.end(),o.pingPongIndex=1-o.pingPongIndex}else c.begin(),n.clear(),n.shader(o.shader),_(null),n.rect(s.cols,s.rows),c.end()})(r,e)),t.registerLayerDisposedHook(re)},uninstall(e,t){const r=[t.layerManager.base,...t.layerManager.all];for(const a of r){const n=a.getPluginState(w);n&&(n.shader?.dispose&&n.shader.dispose(),n.pingPongBuffers&&(n.pingPongBuffers[0].dispose?.(),n.pingPongBuffers[1].dispose?.()))}delete e.bpm,t.removeLayerExtension("synth"),t.removeLayerExtension("bpm"),t.removeLayerExtension("clearSynth")}};g.SynthPlugin=ae,g.SynthSource=S,g.cellColor=e=>{const t=new S;return t._colorSource=e,t},g.char=(e,t)=>{const r=new S;return r._charSource=e,r._charCount=t,r},g.charColor=e=>{const t=new S;return t._colorSource=e,t},g.gradient=function(e){return P.gradient(e)},g.noise=function(e,t){return P.noise(e,t)},g.osc=function(e,t,r){return P.osc(e,t,r)},g.paint=e=>{const t=new S;return t._colorSource=e,t._cellColorSource=e,t},g.setGlobalErrorCallback=function(e){O=e},g.shape=function(e,t,r){return P.shape(e,t,r)},g.solid=function(e,t,r,a){return P.solid(e,t,r,a)},g.src=e=>{const t=P.src;if(!e)return t();const r=new S,a=e.id??`layer_${Date.now()}_${Math.random().toString(36).slice(2,9)}`;return r.addExternalLayerRef({layerId:a,layer:e}),r},g.voronoi=function(e,t,r){return P.voronoi(e,t,r)},Object.defineProperty(g,Symbol.toStringTag,{value:"Module"})});
@@ -30,6 +30,8 @@ export interface ShaderGenerationOptions {
30
30
  usesCharFeedback?: boolean;
31
31
  /** Whether cell color feedback (src) is used */
32
32
  usesCellColorFeedback?: boolean;
33
+ /** Whether char() function is used */
34
+ usesCharSource?: boolean;
33
35
  /** External layer references used in this shader */
34
36
  externalLayers?: Map<string, ExternalLayerInfo>;
35
37
  }
@@ -1 +1 @@
1
- {"version":3,"file":"GLSLGenerator.d.ts","sourceRoot":"","sources":["../../../src/compiler/GLSLGenerator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACpE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAEjD;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACvC,2BAA2B;IAC3B,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACpC,gCAAgC;IAChC,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC3B,+BAA+B;IAC/B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,4BAA4B;IAC5B,cAAc,EAAE,MAAM,CAAC;IACvB,kCAAkC;IAClC,eAAe,EAAE,MAAM,CAAC;IACxB,+BAA+B;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,iCAAiC;IACjC,WAAW,CAAC,EAAE,gBAAgB,CAAC;IAC/B,mDAAmD;IACnD,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,+CAA+C;IAC/C,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,gDAAgD;IAChD,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,oDAAoD;IACpD,cAAc,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;CAChD;AAuGD;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,uBAAuB,GAAG,MAAM,CAyG/E;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CAC1C,UAAU,EAAE,OAAO,EACnB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,GACd,MAAM,CAaR"}
1
+ {"version":3,"file":"GLSLGenerator.d.ts","sourceRoot":"","sources":["../../../src/compiler/GLSLGenerator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACpE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAEjD;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACvC,2BAA2B;IAC3B,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACpC,gCAAgC;IAChC,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC3B,+BAA+B;IAC/B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,4BAA4B;IAC5B,cAAc,EAAE,MAAM,CAAC;IACvB,kCAAkC;IAClC,eAAe,EAAE,MAAM,CAAC;IACxB,+BAA+B;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,iCAAiC;IACjC,WAAW,CAAC,EAAE,gBAAgB,CAAC;IAC/B,mDAAmD;IACnD,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,+CAA+C;IAC/C,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,gDAAgD;IAChD,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,sCAAsC;IACtC,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,oDAAoD;IACpD,cAAc,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;CAChD;AAuGD;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,uBAAuB,GAAG,MAAM,CA8G/E;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CAC1C,UAAU,EAAE,OAAO,EACnB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,GACd,MAAM,CAaR"}
@@ -45,6 +45,8 @@ export interface CompiledSynthShader {
45
45
  usesCharFeedback: boolean;
46
46
  /** Whether this shader uses cell color feedback (src) - reads from prevCellColorBuffer */
47
47
  usesCellColorFeedback: boolean;
48
+ /** Whether this shader uses char() function for character indices */
49
+ usesCharSource: boolean;
48
50
  /** External layer references used in this shader, keyed by layer ID */
49
51
  externalLayers: Map<string, ExternalLayerInfo>;
50
52
  }
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/compiler/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAElF;;;;;;;GAOG;AACH,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,WAAW,GAAG,WAAW,GAAG,MAAM,CAAC;AAE5E;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IACjC,8DAA8D;IAC9D,OAAO,EAAE,MAAM,CAAC;IAChB,mEAAmE;IACnE,aAAa,EAAE,MAAM,CAAC;IACtB,+CAA+C;IAC/C,QAAQ,EAAE,OAAO,CAAC;IAClB,mDAAmD;IACnD,aAAa,EAAE,OAAO,CAAC;IACvB,gDAAgD;IAChD,aAAa,EAAE,OAAO,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IACnC,sCAAsC;IACtC,cAAc,EAAE,MAAM,CAAC;IACvB,qDAAqD;IACrD,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACpC,qDAAqD;IACrD,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,YAAY,KAAK,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC;IACvE,4CAA4C;IAC5C,WAAW,CAAC,EAAE,gBAAgB,CAAC;IAC/B,+FAA+F;IAC/F,qBAAqB,EAAE,OAAO,CAAC;IAC/B,oFAAoF;IACpF,gBAAgB,EAAE,OAAO,CAAC;IAC1B,0FAA0F;IAC1F,qBAAqB,EAAE,OAAO,CAAC;IAC/B,uEAAuE;IACvE,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;CAC/C;AAED;;GAEG;AACH,MAAM,WAAW,MAAM;IACtB,qBAAqB;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,iEAAiE;IACjE,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,qBAAqB;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,iEAAiE;IACjE,cAAc,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACtC,uCAAuC;IACvC,QAAQ,EAAE,MAAM,CAAC;IACjB,kCAAkC;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,yCAAyC;IACzC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8BAA8B;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iCAAiC;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IACjC,wCAAwC;IACxC,UAAU,EAAE,MAAM,CAAC;IACnB,4CAA4C;IAC5C,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC3B,kCAAkC;IAClC,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,yBAAyB;IACzB,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACpC,+BAA+B;IAC/B,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,YAAY,KAAK,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC;CACvE"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/compiler/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAElF;;;;;;;GAOG;AACH,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,WAAW,GAAG,WAAW,GAAG,MAAM,CAAC;AAE5E;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IACjC,8DAA8D;IAC9D,OAAO,EAAE,MAAM,CAAC;IAChB,mEAAmE;IACnE,aAAa,EAAE,MAAM,CAAC;IACtB,+CAA+C;IAC/C,QAAQ,EAAE,OAAO,CAAC;IAClB,mDAAmD;IACnD,aAAa,EAAE,OAAO,CAAC;IACvB,gDAAgD;IAChD,aAAa,EAAE,OAAO,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IACnC,sCAAsC;IACtC,cAAc,EAAE,MAAM,CAAC;IACvB,qDAAqD;IACrD,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACpC,qDAAqD;IACrD,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,YAAY,KAAK,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC;IACvE,4CAA4C;IAC5C,WAAW,CAAC,EAAE,gBAAgB,CAAC;IAC/B,+FAA+F;IAC/F,qBAAqB,EAAE,OAAO,CAAC;IAC/B,oFAAoF;IACpF,gBAAgB,EAAE,OAAO,CAAC;IAC1B,0FAA0F;IAC1F,qBAAqB,EAAE,OAAO,CAAC;IAC/B,qEAAqE;IACrE,cAAc,EAAE,OAAO,CAAC;IACxB,uEAAuE;IACvE,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;CAC/C;AAED;;GAEG;AACH,MAAM,WAAW,MAAM;IACtB,qBAAqB;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,iEAAiE;IACjE,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,qBAAqB;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,iEAAiE;IACjE,cAAc,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACtC,uCAAuC;IACvC,QAAQ,EAAE,MAAM,CAAC;IACjB,kCAAkC;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,yCAAyC;IACzC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8BAA8B;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iCAAiC;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IACjC,wCAAwC;IACxC,UAAU,EAAE,MAAM,CAAC;IACnB,4CAA4C;IAC5C,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC3B,kCAAkC;IAClC,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,yBAAyB;IACzB,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACpC,+BAA+B;IAC/B,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,YAAY,KAAK,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC;CACvE"}
@@ -63,21 +63,22 @@ export interface ISynthSource {
63
63
  cellColor(source: ISynthSource): this;
64
64
  /**
65
65
  * Set the character indices using a character source chain.
66
+ * The number of characters is determined by `charMap()` if defined,
67
+ * otherwise falls back to the total characters in the layer's font.
66
68
  *
67
69
  * @param source A synth source producing character indices
68
- * @param charCount Number of different characters to use from the character mapping
69
70
  * @returns The SynthSource for chaining
70
71
  *
71
72
  * @example
72
73
  * ```ts
73
- * // Use noise to select characters
74
- * char(noise(10), 16)
74
+ * // Use noise to select characters from charMap
75
+ * char(noise(10)).charMap('@#%*+=-:. ')
75
76
  *
76
- * // Use oscillator to select characters
77
- * char(osc(5), 32)
77
+ * // Use oscillator with default font characters
78
+ * char(osc(5))
78
79
  * ```
79
80
  */
80
- char(source: ISynthSource, charCount: number): this;
81
+ char(source: ISynthSource): this;
81
82
  /**
82
83
  * Set both character foreground and cell background color using the same source chain.
83
84
  * This is a convenience method that combines `.charColor()` and `.cellColor()` in one call.
@@ -1 +1 @@
1
- {"version":3,"file":"ISynthSource.d.ts","sourceRoot":"","sources":["../../../src/core/ISynthSource.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAEnD;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC5B;;;;;;;;;;;;;;;;;;OAkBG;IACH,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAE7B;;;;;;;;;;;;;;;;;OAiBG;IACH,SAAS,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAAC;IAEtC;;;;;;;;;;;;;;OAcG;IACH,SAAS,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAAC;IAEtC;;;;;;;;;;;;;;;OAeG;IACH,IAAI,CAAC,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAEpD;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,KAAK,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAAC;IAElC;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,KAAK,IAAI,YAAY,CAAC;IAEtB;;;;;OAKG;IACH,GAAG,CACF,SAAS,CAAC,EAAE,mBAAmB,EAC/B,IAAI,CAAC,EAAE,mBAAmB,EAC1B,MAAM,CAAC,EAAE,mBAAmB,GAC1B,IAAI,CAAC;IAER;;;;OAIG;IACH,KAAK,CAAC,KAAK,CAAC,EAAE,mBAAmB,EAAE,KAAK,CAAC,EAAE,mBAAmB,GAAG,IAAI,CAAC;IAEtE;;;;;OAKG;IACH,OAAO,CACN,KAAK,CAAC,EAAE,mBAAmB,EAC3B,KAAK,CAAC,EAAE,mBAAmB,EAC3B,QAAQ,CAAC,EAAE,mBAAmB,GAC5B,IAAI,CAAC;IAER;;;;;;;;OAQG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,mBAAmB,GAAG,IAAI,CAAC;IAE5C;;;;;OAKG;IACH,KAAK,CACJ,KAAK,CAAC,EAAE,mBAAmB,EAC3B,MAAM,CAAC,EAAE,mBAAmB,EAC5B,SAAS,CAAC,EAAE,mBAAmB,GAC7B,IAAI,CAAC;IAER;;;;;;OAMG;IACH,KAAK,CACJ,CAAC,CAAC,EAAE,mBAAmB,EACvB,CAAC,CAAC,EAAE,mBAAmB,EACvB,CAAC,CAAC,EAAE,mBAAmB,EACvB,CAAC,CAAC,EAAE,mBAAmB,GACrB,IAAI,CAAC;IAER;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAkCG;IACH,GAAG,CAAC,KAAK,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAE3B;;;;;;;;;;;;OAYG;IACH,MAAM,CAAC,KAAK,CAAC,EAAE,mBAAmB,EAAE,KAAK,CAAC,EAAE,mBAAmB,GAAG,IAAI,CAAC;IAEvE;;;;;;;;;;;;;OAaG;IACH,KAAK,CACJ,MAAM,CAAC,EAAE,mBAAmB,EAC5B,KAAK,CAAC,EAAE,mBAAmB,EAC3B,KAAK,CAAC,EAAE,mBAAmB,EAC3B,OAAO,CAAC,EAAE,mBAAmB,EAC7B,OAAO,CAAC,EAAE,mBAAmB,GAC3B,IAAI,CAAC;IAER;;;;;;;;;;;;OAYG;IACH,MAAM,CACL,OAAO,CAAC,EAAE,mBAAmB,EAC7B,OAAO,CAAC,EAAE,mBAAmB,EAC7B,MAAM,CAAC,EAAE,mBAAmB,EAC5B,MAAM,CAAC,EAAE,mBAAmB,GAC1B,IAAI,CAAC;IAER;;;;OAIG;IACH,OAAO,CAAC,OAAO,CAAC,EAAE,mBAAmB,EAAE,KAAK,CAAC,EAAE,mBAAmB,GAAG,IAAI,CAAC;IAE1E;;;;OAIG;IACH,OAAO,CAAC,OAAO,CAAC,EAAE,mBAAmB,EAAE,KAAK,CAAC,EAAE,mBAAmB,GAAG,IAAI,CAAC;IAE1E;;;;;;;;;;;;OAYG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,mBAAmB,EAAE,MAAM,CAAC,EAAE,mBAAmB,GAAG,IAAI,CAAC;IAE3E;;;;;;;;;;;;;;OAcG;IACH,MAAM,CACL,OAAO,CAAC,EAAE,mBAAmB,EAC7B,OAAO,CAAC,EAAE,mBAAmB,EAC7B,OAAO,CAAC,EAAE,mBAAmB,EAC7B,OAAO,CAAC,EAAE,mBAAmB,GAC3B,IAAI,CAAC;IAER;;;;OAIG;IACH,OAAO,CAAC,IAAI,CAAC,EAAE,mBAAmB,EAAE,MAAM,CAAC,EAAE,mBAAmB,GAAG,IAAI,CAAC;IAExE;;;;OAIG;IACH,OAAO,CAAC,IAAI,CAAC,EAAE,mBAAmB,EAAE,MAAM,CAAC,EAAE,mBAAmB,GAAG,IAAI,CAAC;IAExE;;;;;;;;;;;OAWG;IACH,MAAM,CAAC,MAAM,CAAC,EAAE,mBAAmB,GAAG,IAAI,CAAC;IAE3C;;;;;;;;;;;OAWG;IACH,UAAU,CAAC,MAAM,CAAC,EAAE,mBAAmB,GAAG,IAAI,CAAC;IAE/C;;;;;;;;;;;OAWG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,mBAAmB,GAAG,IAAI,CAAC;IAE7C;;;;;;;;;;OAUG;IACH,MAAM,CAAC,MAAM,CAAC,EAAE,mBAAmB,GAAG,IAAI,CAAC;IAE3C;;;;;;;;;;;;OAYG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,mBAAmB,GAAG,IAAI,CAAC;IAE7C;;;;;;;;;;;OAWG;IACH,GAAG,CAAC,GAAG,CAAC,EAAE,mBAAmB,GAAG,IAAI,CAAC;IAErC;;;;;;;;;OASG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,mBAAmB,GAAG,IAAI,CAAC;IAE7C;;;;;;;;;;;;;;OAcG;IACH,SAAS,CAAC,IAAI,CAAC,EAAE,mBAAmB,EAAE,KAAK,CAAC,EAAE,mBAAmB,GAAG,IAAI,CAAC;IAEzE;;;;;;;;;;OAUG;IACH,IAAI,CAAC,SAAS,CAAC,EAAE,mBAAmB,EAAE,SAAS,CAAC,EAAE,mBAAmB,GAAG,IAAI,CAAC;IAE7E;;;;OAIG;IACH,MAAM,CAAC,SAAS,CAAC,EAAE,mBAAmB,EAAE,SAAS,CAAC,EAAE,mBAAmB,GAAG,IAAI,CAAC;IAE/E;;;;;;;;;;;;;;;;;;;OAmBG;IACH,KAAK,CACJ,CAAC,CAAC,EAAE,mBAAmB,EACvB,CAAC,CAAC,EAAE,mBAAmB,EACvB,CAAC,CAAC,EAAE,mBAAmB,EACvB,CAAC,CAAC,EAAE,mBAAmB,GACrB,IAAI,CAAC;IAER;;;;;;;;;;;;;OAaG;IACH,CAAC,CAAC,KAAK,CAAC,EAAE,mBAAmB,EAAE,MAAM,CAAC,EAAE,mBAAmB,GAAG,IAAI,CAAC;IAEnE;;;;;;;;;OASG;IACH,CAAC,CAAC,KAAK,CAAC,EAAE,mBAAmB,EAAE,MAAM,CAAC,EAAE,mBAAmB,GAAG,IAAI,CAAC;IAEnE;;;;;;;;;OASG;IACH,CAAC,CAAC,KAAK,CAAC,EAAE,mBAAmB,EAAE,MAAM,CAAC,EAAE,mBAAmB,GAAG,IAAI,CAAC;IAEnE;;;;;;OAMG;IACH,KAAK,CACJ,CAAC,CAAC,EAAE,mBAAmB,EACvB,CAAC,CAAC,EAAE,mBAAmB,EACvB,CAAC,CAAC,EAAE,mBAAmB,EACvB,CAAC,CAAC,EAAE,mBAAmB,GACrB,IAAI,CAAC;IAER;;;;;;;;;OASG;IACH,KAAK,CAAC,MAAM,CAAC,EAAE,mBAAmB,GAAG,IAAI,CAAC;IAE1C;;;;;;;;;;;;;;;;;;OAkBG;IACH,MAAM,CACL,KAAK,CAAC,EAAE,mBAAmB,EAC3B,KAAK,CAAC,EAAE,mBAAmB,EAC3B,MAAM,CAAC,EAAE,mBAAmB,EAC5B,MAAM,CAAC,EAAE,mBAAmB,EAC5B,KAAK,CAAC,EAAE,mBAAmB,GACzB,IAAI,CAAC;IAER;;;;;;;;;OASG;IACH,KAAK,CAAC,GAAG,CAAC,EAAE,mBAAmB,EAAE,GAAG,CAAC,EAAE,mBAAmB,GAAG,IAAI,CAAC;IAElE;;;;;;;;;;;;OAYG;IACH,GAAG,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,mBAAmB,GAAG,IAAI,CAAC;IAE9D;;;;OAIG;IACH,GAAG,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,mBAAmB,GAAG,IAAI,CAAC;IAE9D;;;;OAIG;IACH,IAAI,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,mBAAmB,GAAG,IAAI,CAAC;IAE/D;;;;;;;;;;;;OAYG;IACH,KAAK,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,mBAAmB,GAAG,IAAI,CAAC;IAEhE;;;;;;;;OAQG;IACH,IAAI,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAAC;IAEjC;;;;;;;;;;OAUG;IACH,KAAK,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAAC;IAElC;;;;;;;;;OASG;IACH,IAAI,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAAC;IAEjC;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,mBAAmB,GAAG,IAAI,CAAC;IAEnE;;;;;OAKG;IACH,aAAa,CACZ,MAAM,EAAE,YAAY,EACpB,QAAQ,CAAC,EAAE,mBAAmB,EAC9B,MAAM,CAAC,EAAE,mBAAmB,GAC1B,IAAI,CAAC;IAER;;;;;OAKG;IACH,cAAc,CACb,MAAM,EAAE,YAAY,EACpB,QAAQ,CAAC,EAAE,mBAAmB,EAC9B,MAAM,CAAC,EAAE,mBAAmB,GAC1B,IAAI,CAAC;IAER;;;;;;;;;;OAUG;IACH,gBAAgB,CACf,MAAM,EAAE,YAAY,EACpB,QAAQ,CAAC,EAAE,mBAAmB,EAC9B,MAAM,CAAC,EAAE,mBAAmB,GAC1B,IAAI,CAAC;IAER;;;;;;;;;;OAUG;IACH,cAAc,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,mBAAmB,GAAG,IAAI,CAAC;IAEzE;;;;;OAKG;IACH,eAAe,CACd,MAAM,EAAE,YAAY,EACpB,OAAO,CAAC,EAAE,mBAAmB,EAC7B,KAAK,CAAC,EAAE,mBAAmB,GACzB,IAAI,CAAC;IAER;;;;;OAKG;IACH,eAAe,CACd,MAAM,EAAE,YAAY,EACpB,OAAO,CAAC,EAAE,mBAAmB,EAC7B,KAAK,CAAC,EAAE,mBAAmB,GACzB,IAAI,CAAC;IAMR;;;OAGG;IACH,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,mBAAmB,EAAE,GAAG,IAAI,CAAC;IAElE;;;OAGG;IACH,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,mBAAmB,EAAE,GAAG,IAAI,CAAC;IAE/F;;;OAGG;IACH,mBAAmB,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAAC;CACxC"}
1
+ {"version":3,"file":"ISynthSource.d.ts","sourceRoot":"","sources":["../../../src/core/ISynthSource.ts"],"names":[],"mappings":"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"}
@@ -12,7 +12,6 @@ interface SynthSourceCreateOptions {
12
12
  colorSource?: SynthSource;
13
13
  cellColorSource?: SynthSource;
14
14
  charSource?: SynthSource;
15
- charCount?: number;
16
15
  nestedSources?: Map<number, SynthSource>;
17
16
  externalLayerRefs?: Map<number, ExternalLayerReference>;
18
17
  }
@@ -51,8 +50,6 @@ export declare class SynthSource {
51
50
  private _cellColorSource?;
52
51
  /** Reference to the character source chain (if any) - used by char() function */
53
52
  private _charSource?;
54
- /** Number of unique characters when using char() function */
55
- private _charCount?;
56
53
  /**
57
54
  * Create a new SynthSource.
58
55
  * @param options Optional initialization options
@@ -78,7 +75,7 @@ export declare class SynthSource {
78
75
  addExternalLayerRef(ref: ExternalLayerReference): this;
79
76
  charMap(chars: string): this;
80
77
  charColor(source: SynthSource): this;
81
- char(source: SynthSource, charCount: number): this;
78
+ char(source: SynthSource): this;
82
79
  cellColor(source: SynthSource): this;
83
80
  paint(source: SynthSource): this;
84
81
  clone(): SynthSource;
@@ -107,11 +104,6 @@ export declare class SynthSource {
107
104
  * @ignore
108
105
  */
109
106
  get charSource(): SynthSource | undefined;
110
- /**
111
- * Get the character count if defined (from char() function).
112
- * @ignore
113
- */
114
- get charCount(): number | undefined;
115
107
  /**
116
108
  * Get all nested sources for combine operations.
117
109
  * @ignore
@@ -1 +1 @@
1
- {"version":3,"file":"SynthSource.d.ts","sourceRoot":"","sources":["../../../src/core/SynthSource.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAC;AAC7F,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAInD,MAAM,WAAW,WAAY,SAAQ,YAAY;CAAG;AAEpD;;GAEG;AACH,UAAU,wBAAwB;IACjC,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,WAAW,CAAC,EAAE,gBAAgB,CAAC;IAC/B,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,eAAe,CAAC,EAAE,WAAW,CAAC;IAC9B,UAAU,CAAC,EAAE,WAAW,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACzC,iBAAiB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;CACxD;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,WAAW;IACvB,wCAAwC;IACxC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAa;IAEpC,8CAA8C;IAC9C,OAAO,CAAC,YAAY,CAAC,CAAmB;IAExC,4EAA4E;IAC5E,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA2B;IAE1D,yFAAyF;IACzF,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAsC;IAEzE,mDAAmD;IACnD,OAAO,CAAC,YAAY,CAAC,CAAc;IAEnC,wDAAwD;IACxD,OAAO,CAAC,gBAAgB,CAAC,CAAc;IAEvC,iFAAiF;IACjF,OAAO,CAAC,WAAW,CAAC,CAAc;IAElC,6DAA6D;IAC7D,OAAO,CAAC,UAAU,CAAC,CAAS;IAE5B;;;;OAIG;gBACS,OAAO,CAAC,EAAE,wBAAwB;IAW9C;;;;OAIG;IACI,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,mBAAmB,EAAE,GAAG,IAAI;IASxE;;;OAGG;IACI,mBAAmB,CACzB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,WAAW,EACnB,QAAQ,EAAE,mBAAmB,EAAE,GAC7B,IAAI;IAMP;;;;OAIG;IACI,mBAAmB,CAAC,GAAG,EAAE,sBAAsB,GAAG,IAAI;IAMtD,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAa5B,SAAS,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI;IAKpC,IAAI,CAAC,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAMlD,SAAS,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI;IAKpC,KAAK,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI;IAMhC,KAAK,IAAI,WAAW;IAyB3B;;;OAGG;IACH,IAAW,UAAU,IAAI,SAAS,eAAe,EAAE,CAElD;IAED;;;OAGG;IACH,IAAW,WAAW,IAAI,gBAAgB,GAAG,SAAS,CAErD;IAED;;;OAGG;IACH,IAAW,WAAW,IAAI,WAAW,GAAG,SAAS,CAEhD;IAED;;;OAGG;IACH,IAAW,eAAe,IAAI,WAAW,GAAG,SAAS,CAEpD;IAED;;;OAGG;IACH,IAAW,UAAU,IAAI,WAAW,GAAG,SAAS,CAE/C;IAED;;;OAGG;IACH,IAAW,SAAS,IAAI,MAAM,GAAG,SAAS,CAEzC;IAED;;;OAGG;IACH,IAAW,aAAa,IAAI,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAEnD;IAED;;;OAGG;IACH,IAAW,iBAAiB,IAAI,GAAG,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAElE;CACD"}
1
+ {"version":3,"file":"SynthSource.d.ts","sourceRoot":"","sources":["../../../src/core/SynthSource.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAC;AAC7F,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAInD,MAAM,WAAW,WAAY,SAAQ,YAAY;CAAI;AAErD;;GAEG;AACH,UAAU,wBAAwB;IACjC,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,WAAW,CAAC,EAAE,gBAAgB,CAAC;IAC/B,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,eAAe,CAAC,EAAE,WAAW,CAAC;IAC9B,UAAU,CAAC,EAAE,WAAW,CAAC;IACzB,aAAa,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACzC,iBAAiB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;CACxD;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,WAAW;IACvB,wCAAwC;IACxC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAa;IAEpC,8CAA8C;IAC9C,OAAO,CAAC,YAAY,CAAC,CAAmB;IAExC,4EAA4E;IAC5E,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA2B;IAE1D,yFAAyF;IACzF,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAsC;IAEzE,mDAAmD;IACnD,OAAO,CAAC,YAAY,CAAC,CAAc;IAEnC,wDAAwD;IACxD,OAAO,CAAC,gBAAgB,CAAC,CAAc;IAEvC,iFAAiF;IACjF,OAAO,CAAC,WAAW,CAAC,CAAc;IAElC;;;;OAIG;gBACS,OAAO,CAAC,EAAE,wBAAwB;IAU9C;;;;OAIG;IACI,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,mBAAmB,EAAE,GAAG,IAAI;IASxE;;;OAGG;IACI,mBAAmB,CACzB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,WAAW,EACnB,QAAQ,EAAE,mBAAmB,EAAE,GAC7B,IAAI;IAMP;;;;OAIG;IACI,mBAAmB,CAAC,GAAG,EAAE,sBAAsB,GAAG,IAAI;IAMtD,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAa5B,SAAS,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI;IAKpC,IAAI,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI;IAK/B,SAAS,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI;IAKpC,KAAK,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI;IAMhC,KAAK,IAAI,WAAW;IAwB3B;;;OAGG;IACH,IAAW,UAAU,IAAI,SAAS,eAAe,EAAE,CAElD;IAED;;;OAGG;IACH,IAAW,WAAW,IAAI,gBAAgB,GAAG,SAAS,CAErD;IAED;;;OAGG;IACH,IAAW,WAAW,IAAI,WAAW,GAAG,SAAS,CAEhD;IAED;;;OAGG;IACH,IAAW,eAAe,IAAI,WAAW,GAAG,SAAS,CAEpD;IAED;;;OAGG;IACH,IAAW,UAAU,IAAI,WAAW,GAAG,SAAS,CAE/C;IAID;;;OAGG;IACH,IAAW,aAAa,IAAI,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAEnD;IAED;;;OAGG;IACH,IAAW,iBAAiB,IAAI,GAAG,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAElE;CACD"}
@@ -1 +1 @@
1
- {"version":3,"file":"synthRender.d.ts","sourceRoot":"","sources":["../../../src/lifecycle/synthRender.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAS1D;;;;;;GAMG;AACH,wBAAsB,WAAW,CAAC,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,GAAG,iBAsLxE"}
1
+ {"version":3,"file":"synthRender.d.ts","sourceRoot":"","sources":["../../../src/lifecycle/synthRender.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAS1D;;;;;;GAMG;AACH,wBAAsB,WAAW,CAAC,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,GAAG,iBA+LxE"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "textmode.synth.js",
3
- "version": "1.0.0-beta.4",
3
+ "version": "1.0.0-beta.5",
4
4
  "description": "Synth engine for textmode.js",
5
5
  "type": "module",
6
6
  "types": "./dist/types/index.d.ts",