@genart-api/adapter-editart
Version:
GenArtAPI platform adapter for editart.xyz
2 lines (1 loc) • 3.34 kB
JavaScript
;(()=>{globalThis.drawArt=()=>{};var o=5,h=["choice","range","toggle","weighted"],{math:{clamp:g,round:m,fit:p,mix:u},prng:{SFC32:P},utils:{isString:c,hashString:f}}=$genart,d=class{_paramIndex={};_searchParams;_selectedParamIDs;_cache={};_prng;_seed;_screen;constructor(){this._searchParams=new URLSearchParams(location.search),this._screen=this.screen,this.initPRNG(),$genart.on("genart:param-change",({paramID:e,param:r})=>{let t=this._paramIndex[e];if(t==null)return;let a=this.serializeParam(r);a==null||this._cache[e]===a||(this._cache[e]=a,this._searchParams.set("m"+t,a),this.reload())}),$genart.on("genart:state-change",({state:e})=>{e==="ready"&&$genart.start()}),window.addEventListener("message",e=>{e.data.hasOwnProperty("editartQueryString")&&(this._searchParams=new URLSearchParams(e.data.editartQueryString),this.reload())}),window.addEventListener("resize",()=>{let{width:e,height:r,dpr:t}=this._screen,a=this.screen;(e!==a.width||r!==a.height||t!==a.dpr)&&(this._screen=a,$genart.emit({type:"genart:resize",screen:a}))})}get id(){return"@genart-api/adapter-editart"}get mode(){return"play"}get screen(){return{width:window.innerWidth,height:window.innerHeight,dpr:window.devicePixelRatio||1}}get prng(){return this._prng}get seed(){return this._seed}configure(e){if(e.params){if(e.params.length>o)throw new Error(`${this.id}: only max. ${o} can be selected`);this._selectedParamIDs=e.params}}async updateParam(e,r){let t=this._paramIndex[e];if(t==null){h.includes(r.type)||this.warn(`ignoring unsupported param: ${e} (type: ${r.type})`);return}let a=this._searchParams.get("m"+t)||"0.5";if(this._cache[e]===a)return;this._cache[e]=a;let i=g(+a,0,.999999);switch(r.type){case"choice":{let n=r.options,s=n[i*n.length|0];return{value:c(s)?s:s[0]}}case"range":{let{min:n,max:s,step:l}=r;return{value:g(m(u(n,s,i),l),n,s)}}case"toggle":return{value:i>=.5};case"weighted":{let n=r.options;return{value:n[i*n.length|0][1]}}}}async initParams(e){let r=[];if(this._selectedParamIDs)for(let t of this._selectedParamIDs){let a=e[t];a?r.push([t,a]):this.warn(`can't select unknown param: ${t}, skipping...`)}else{for(let t of Object.entries(e))t[1].edit!=="private"&&h.includes(t[1].type)&&r.push(t);r.length>o&&(this.warn(`found ${r.length} eligible params, but platform only supports max. ${o} params`),r=r.slice(0,o),this.warn("only using these params (in order):",r.map(t=>t[0]))),r.sort((t,a)=>{let i=t[1].order,n=a[1].order;return i===n?t[0]<a[0]?-1:t[0]>a[0]?1:0:i-n})}for(let t=0,a=r.length;t<a;t++)this._paramIndex[r[t][0]]=t}capture(e){triggerPreview()}reload(){console.log(`${this.id} reloading with new params:`,this._searchParams.toString()),location.search=this._searchParams.toString()}initPRNG(){let e=typeof randomSeedEditArt<"u"?randomSeedEditArt:$genart.id;for(let r=0;r<o;r++)e+=this._searchParams.get("m"+r)||"0.5";this._seed=e,this._prng=new P(f(e))}serializeParam(e){switch(e.type){case"choice":{let r=e.options;return(r.findIndex(t=>(c(t)?t:t[0])===e.value)/r.length).toFixed(3)}case"range":{let{min:r,max:t}=e;return p(e.value,r,t,0,1).toFixed(6)}case"toggle":return e.value>=.5?"1":"0";case"weighted":{let r=e.options;return(r.findIndex(t=>(c(t)?t:t[1])===e.value)/r.length).toFixed(3)}default:return String(e.value)}}warn(e,...r){console.warn(`${this.id}:`,e,...r)}};$genart.setAdapter(new d);})();