@litecanvas/utils 0.29.0 → 0.30.0

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.
package/dist/all.js CHANGED
@@ -57,7 +57,10 @@
57
57
  head: () => head_default,
58
58
  intersection: () => intersection_default,
59
59
  last: () => last_default,
60
+ lerpAngle: () => lerp_angle_default,
60
61
  mag: () => mag_default,
62
+ makeCircle: () => make_circle_default,
63
+ makeRectangle: () => make_rectangle_default,
61
64
  mean: () => mean_default,
62
65
  mod: () => mod_default,
63
66
  range: () => range_default,
@@ -953,6 +956,17 @@
953
956
  return sum_default(values) / values.length;
954
957
  };
955
958
 
959
+ // src/math/lerp-angle.js
960
+ var lerp_angle_default = (start, end, amount) => {
961
+ let dif = (end - start) % 360;
962
+ if (dif > 180) {
963
+ dif -= 360;
964
+ } else if (dif < -180) {
965
+ dif += 360;
966
+ }
967
+ return start + dif * amount;
968
+ };
969
+
956
970
  // src/tween/index.js
957
971
  var HALF_PI = Math.PI / 2;
958
972
  var tween = (object, prop, toValue, duration = 1, easing = LINEAR) => {
@@ -1335,6 +1349,37 @@
1335
1349
  });
1336
1350
  };
1337
1351
 
1352
+ // src/image/make-circle.js
1353
+ var make_circle_default = (radius, color, { borderWidth = 0, borderColor = 0, engine = globalThis } = {}) => {
1354
+ const imageSize = radius * 2 + borderWidth;
1355
+ return engine.paint(imageSize, imageSize, () => {
1356
+ engine.circfill(imageSize / 2, imageSize / 2, radius, color);
1357
+ if (borderWidth > 0) {
1358
+ engine.linewidth(borderWidth);
1359
+ engine.stroke(borderColor);
1360
+ }
1361
+ });
1362
+ };
1363
+
1364
+ // src/image/make-rectangle.js
1365
+ var make_rectangle_default = (width, height, color, { borderWidth = 0, borderColor = 0, engine = globalThis } = {}) => {
1366
+ const imageWidth = width + borderWidth * 2;
1367
+ const imageHeight = height + borderWidth * 2;
1368
+ return engine.paint(imageWidth, imageHeight, () => {
1369
+ engine.rectfill(
1370
+ borderWidth > 0 ? borderWidth : 0,
1371
+ borderWidth > 0 ? borderWidth : 0,
1372
+ width,
1373
+ height,
1374
+ color
1375
+ );
1376
+ if (borderWidth > 0) {
1377
+ engine.linewidth(borderWidth);
1378
+ engine.stroke(borderColor);
1379
+ }
1380
+ });
1381
+ };
1382
+
1338
1383
  // src/collection/range.js
1339
1384
  var range_default = (size, from = 0, step = 1) => Array.from(
1340
1385
  Array(size).keys().map((i) => {
package/dist/all.min.js CHANGED
@@ -1,3 +1,3 @@
1
- (()=>{var yt=Object.defineProperty;var wt=(e,t)=>{for(var r in t)yt(e,r,{get:t[r],enumerable:!0})};globalThis.utils=globalThis.utils||{};globalThis.utils.global=(e=!0)=>{for(let t in globalThis.utils)t!=="global"&&(e||globalThis[t]===void 0)&&(globalThis[t]=globalThis.utils[t])};var F={};wt(F,{ANCHOR_BOT_LEFT:()=>Zt,ANCHOR_BOT_RIGHT:()=>Kt,ANCHOR_CENTER:()=>Vt,ANCHOR_TOP_LEFT:()=>Q,ANCHOR_TOP_RIGHT:()=>$t,Actor:()=>R,BACK_IN:()=>ee,BACK_IN_OUT:()=>se,BACK_OUT:()=>re,BOUNCE_IN:()=>ht,BOUNCE_IN_OUT:()=>oe,BOUNCE_OUT:()=>Y,Camera:()=>y,DOWN:()=>jt,EASE_IN:()=>Jt,EASE_IN_OUT:()=>te,EASE_OUT:()=>vt,ELASTIC_IN:()=>ae,ELASTIC_IN_OUT:()=>ie,ELASTIC_OUT:()=>ne,Grid:()=>I,LEFT:()=>qt,LINEAR:()=>ot,Noise:()=>X,ONE:()=>Bt,RIGHT:()=>Gt,TypedGrid:()=>P,UP:()=>zt,Vector:()=>w,ZERO:()=>K,advance:()=>et,diff:()=>J,dist:()=>at,flipImage:()=>pt,fract:()=>tt,head:()=>_t,intersection:()=>E,last:()=>xt,mag:()=>nt,mean:()=>it,mod:()=>rt,range:()=>ft,resolve:()=>B,roundd:()=>st,sample:()=>dt,scaleImage:()=>ct,shuffle:()=>bt,sum:()=>H,tail:()=>gt,tintImage:()=>mt,tween:()=>Qt,vec:()=>i,vecAbs:()=>Rt,vecAdd:()=>D,vecAngle:()=>Pt,vecAngleBetween:()=>Ct,vecCeil:()=>Nt,vecClamp:()=>Xt,vecCross:()=>Dt,vecDist:()=>kt,vecDist2:()=>Ot,vecDiv:()=>A,vecDot:()=>Z,vecEq:()=>C,vecFloor:()=>Yt,vecIsZero:()=>Ut,vecLerp:()=>Lt,vecLimit:()=>Ht,vecMag:()=>V,vecMag2:()=>$,vecMove:()=>Ft,vecMult:()=>T,vecNorm:()=>S,vecRand:()=>St,vecReflect:()=>It,vecRotate:()=>Et,vecRound:()=>Wt,vecSet:()=>q,vecSetMag:()=>At,vecSub:()=>L,wave:()=>v});var E=(e,t,r,s,a,n,o,h)=>{let u=Math.max(e,a),d=Math.min(e+r,a+o)-u,p=Math.max(t,n),_=Math.min(t+s,n+h)-p;return[u,p,d,_]};var B=(e,t,r,s,a,n,o,h)=>{let[u,d,p,_]=E(e,t,r,s,a,n,o,h),b="",g=e,l=t;return p<_?e<a?(b="right",g=a-r):(b="left",g=a+o):t<n?(b="bottom",l=n-s):(b="top",l=n+h),{direction:b,x:g,y:l}};var y=class{_engine=null;x=0;y=0;ox=0;oy=0;width=0;height=0;rotation=0;scale=1;_shake={x:0,y:0,removeListener:null};constructor(t=null,r=0,s=0,a=null,n=null){this._engine=t||globalThis,this.ox=r,this.oy=s,this.resize(a||this._engine.WIDTH-r,n||this._engine.HEIGHT-s),this.x=this.width/2,this.y=this.height/2}resize(t,r){this.width=t,this.height=r,this._engine.emit("camera-resized",this)}start(t=!1){if(this._engine.push(),t){let a=path();a.rect(this.ox,this.oy,this.width,this.height),this._engine.clip(a)}let r=this.ox+this.width/2,s=this.oy+this.height/2;this._engine.translate(r,s),this._engine.scale(this.scale),this._engine.rotate(this.rotation),this._engine.translate(-this.x+this._shake.x,-this.y+this._shake.y)}end(){this._engine.pop()}lookAt(t,r){this.x=t,this.y=r}move(t,r){this.x+=t,this.y+=r}zoom(t){this.scale*=t}zoomTo(t){this.scale=t}rotate(t){this.rotation+=t}rotateTo(t){this.rotation=t}getWorldPoint(t,r,s={}){let a=Math.cos(-this.rotation),n=Math.sin(-this.rotation);return t=(t-this.width/2-this.ox)/this.scale,r=(r-this.height/2-this.oy)/this.scale,s.x=a*t-n*r+this.x,s.y=n*t+a*r+this.y,s}getCameraPoint(t,r,s={}){let a=Math.cos(-this.rotation),n=Math.sin(-this.rotation);return t=t-this.x,r=r-this.y,t=a*t-n*r,r=n*t+a*r,s.x=t*this.scale+this.width/2+this.ox,s.y=r*this.scale+this.height/2+this.oy,s}getBounds(){return[this.ox,this.oy,this.width,this.height]}viewing(t,r,s,a){let n=this.width/2-this.x,o=this.height/2-this.y,h=this.width/this.scale,u=this.height/this.scale;return this._engine.colrect(t,r,s,a,n,o,h,u)}shake(t=1,r=.3){this.shaking||(this._shake.removeListener=this._engine.listen("update",s=>{this._shake.x=this._engine.randi(-t,t),this._shake.y=this._engine.randi(-t,t),r-=s,r<=0&&this.unshake()}))}unshake(){this.shaking&&(this._shake.removeListener(),this._shake.removeListener=null,this._shake.x=this._shake.y=0)}get shaking(){return this._shake.removeListener!==null}};var I=class e{_w;_h;_c;constructor(t,r,s=[]){this._w=Math.max(1,~~t),this._h=Math.max(1,~~r),this._c=s}[Symbol.iterator](){let t=0;return{next:()=>({value:[this.indexToPointX(t),this.indexToPointY(t),this._c[t++]],done:t>this._c.length})}}clone(){return new e(this._w,this._h,this._c)}clear(){this.forEach((t,r)=>this.set(t,r,void 0))}get width(){return this._w}get height(){return this._h}set(t,r,s){this._c[this.pointToIndex(t,r)]=s}get(t,r){return this._c[this.pointToIndex(t,r)]}has(t,r){return this.get(t,r)!=null}check(t,r){return t>=0&&t<this._w&&r>=0&&r<this._h}get length(){return this._w*this._h}pointToIndex(t,r){return this.clampX(~~t)+this.clampY(~~r)*this._w}indexToPointX(t){return t%this._w}indexToPointY(t){return Math.floor(t/this._w)}forEach(t,r=!1){let s=r?this.length-1:0,a=r?-1:this.length,n=r?-1:1;for(;s!==a;){let o=this.indexToPointX(s),h=this.indexToPointY(s),u=this._c[s];if(t(o,h,u,this)===!1)break;s+=n}}fill(t){this.forEach((r,s)=>{this.set(r,s,t)})}clampX(t){return z(t,0,this._w-1)}clampY(t){return z(t,0,this._h-1)}toArray(){return this._c.slice()}toString(t=" ",r=!0){if(!r)return this._c.join(t);let s=[];return this.forEach((a,n,o)=>{s[n]=s[n]||"",s[n]+=o+t}),s.join(`
2
- `)}},P=class e extends I{constructor(t,r,s=Uint8Array){super(t,r,null),this._c=new s(this._w*this._h)}has(t,r){return this.get(t,r)!==0}clone(){let t=new e(this._w,this._h,this._c.constructor);return this.forEach((r,s,a)=>{t.set(r,s,a)}),t}};function z(e,t,r){return e<t?t:e>r?r:e}var Tt=Math.sqrt,G=Math.cos,j=Math.sin,Mt=2*Math.PI,w=class{x;y;constructor(t=0,r=t){this.x=t,this.y=r}toString(){return`Vector (${this.x}, ${this.y})`}},x=e=>e instanceof w,i=(e=0,t=e)=>(x(e)&&(t=e.y,e=e.x),new w(e,t)),C=(e,t,r=t)=>x(t)?C(e,t.x,t.y):e.x===t&&e.y===r,q=(e,t,r=t)=>(x(t)?q(e,t.x,t.y):(e.x=t,e.y=r),e),D=(e,t,r=t)=>x(t)?D(e,t.x,t.y):(e.x+=t,e.y+=r,e),L=(e,t,r=t)=>x(t)?L(e,t.x,t.y):(e.x-=t,e.y-=r,e),T=(e,t,r=t)=>x(t)?T(e,t.x,t.y):(e.x*=t,e.y*=r,e),A=(e,t,r=t)=>x(t)?A(e,t.x,t.y):(e.x/=t||1,e.y/=r||1,e),Et=(e,t)=>{let r=G(t),s=j(t);return e.x=r*e.x-s*e.y,e.y=s*e.x+r*e.y,e},It=(e,t)=>{let r=S(i(t));return L(e,T(r,2*Z(e,r)))},At=(e,t)=>(S(e),T(e,t),e),V=e=>Math.hypot(e.x,e.y),$=e=>e.x*e.x+e.y*e.y,S=e=>{let t=V(e);return t>0&&A(e,t),e},Ht=(e,t=1)=>{let r=$(e);return r>t*t&&(A(e,Tt(r)),T(e,t)),e},kt=(e,t)=>Math.hypot(t.x-e.x,t.y-e.y),Ot=(e,t)=>{let r=e.x-t.x,s=e.y-t.y;return r*r+s*s},Pt=e=>Math.atan2(e.y,e.x),Ct=(e,t)=>Math.atan2(t.y-e.y,t.x-e.x),Z=(e,t)=>e.x*t.x+e.y*t.y,Dt=(e,t)=>e.x*t.y-e.y*t.x,Lt=(e,t,r)=>(e.x+=(t.x-e.x)*r||0,e.y+=(t.y-e.y)*r||0,e),St=(e=1,t=e,r=globalThis.rand||Math.random)=>{let s=r()*Mt,a=r()*(t-e)+e;return i(G(s)*a,j(s)*a)},Rt=e=>(e.x=Math.abs(e.x),e.y=Math.abs(e.y),e),Nt=e=>(e.x=Math.ceil(e.x),e.y=Math.ceil(e.y),e),Yt=e=>(e.x=Math.floor(e.x),e.y=Math.floor(e.y),e),Wt=e=>(e.x=Math.round(e.x),e.y=Math.round(e.y),e),Xt=(e,t,r)=>(e.x<t.x&&(e.x=t.x),e.x>r.x&&(e.x=r.x),e.y<t.y&&(e.y=t.y),e.y>r.y&&(e.y=r.y),e),Ft=(e,t,r=1)=>D(e,t.x*r,t.y*r),Ut=e=>C(e,K),K=i(0,0),Bt=i(1,1),zt=i(0,-1),Gt=i(1,0),jt=i(0,1),qt=i(-1,0);var Vt=i(.5,.5),Q=i(0,0),$t=i(1,0),Zt=i(0,1),Kt=i(1,1),R=class{sprite;pos;_o;_s;flipX=!1;flipY=!1;angle=0;opacity=1;hidden=!1;constructor(t,r,s=Q){this.sprite=t,this.pos=r||i(0),this._o=i(s),this._s=i(1,1)}set x(t){this.pos.x=t}get x(){return this.pos.x}set y(t){this.pos.y=t}get y(){return this.pos.y}set anchor(t){this._o.x=t.x,this._o.y=t.y}get anchor(){return this._o}get width(){return this.sprite.width*this._s.x}get height(){return this.sprite.height*this._s.y}get scale(){return this._s}scaleTo(t,r=t){this._s.x=t,this._s.y=r}scaleBy(t,r=t){this._s.x*=t,this._s.y*=r}getBounds(t=!0){let r=this.sprite.width*(t?this._s.x:1),s=this.sprite.height*(t?this._s.y:1),a=this.pos.x-r*this.anchor.x,n=this.pos.y-s*this.anchor.y;return[a,n,r,s]}draw(t=globalThis,r=!0){this.hidden||this.opacity<=0||(r&&t.push(),this.transform(t),this.drawImage(t),r&&t.pop())}transform(t){t.translate(this.pos.x,this.pos.y),t.rotate(t.deg2rad(this.angle)),t.scale((this.flipX?-1:1)*this._s.x,(this.flipY?-1:1)*this._s.y)}drawImage(t,r=!0){let s=this.anchor,a=-this.sprite.width*(this.flipX?1-s.x:s.x),n=-this.sprite.height*(this.flipY?1-s.y:s.y);r&&t.alpha(this.opacity),t.image(a,n,this.sprite)}};var J=(e,t)=>Math.abs(t-e)||0;var v=(e,t,r,s=Math.sin)=>e+(s(r)+1)/2*(t-e);var tt=e=>e%1||0;var et=advance=(e,t,r,s=1)=>{r&&(t.x+=r.x*s,t.y+=r.y*s),e.x+=t.x*s,e.y+=t.y*s};var rt=(e,t)=>(t+e%t)%t;var st=(e,t=0)=>{if(!t)return Math.round(e);let r=Math.pow(10,t);return Math.round(e*r)/r};var at=(e,t,r,s)=>Math.hypot(r-e,s-t);var nt=(e,t)=>Math.hypot(e,t);var H=e=>{let t=0;for(let r=0;r<e.length;r++)t+=e[r];return t};var it=e=>H(e)/e.length;var k=Math.PI/2,Qt=(e,t,r,s=1,a=ot)=>new N(e,t,r,s,a),ot=e=>e,Jt=e=>e*e,vt=e=>-e*(e-2),te=e=>e<.5?2*e*e:-2*e*e+4*e-1,ee=e=>e*e*e-e*Math.sin(e*Math.PI),re=e=>{let t=1-e;return 1-(t*t*t-t*Math.sin(t*Math.PI))},se=e=>{if(e<.5){let r=2*e;return .5*(r*r*r-r*Math.sin(r*Math.PI))}let t=1-(2*e-1);return .5*(1-(t*t*t-t*Math.sin(e*Math.PI)))+.5},ae=e=>Math.sin(13*k*e)*Math.pow(2,10*(e-1)),ne=e=>Math.sin(-13*k*(e+1))*Math.pow(2,-10*e)+1,ie=e=>{if(e<.5){let s=Math.sin(13*k*(2*e)),a=Math.pow(2,10*(2*e-1));return .5*s*a}let t=Math.sin(-13*k*(2*e-1+1)),r=Math.pow(2,-10*(2*e-1));return .5*(t*r+2)},ht=e=>1-Y(1-e),Y=e=>e<4/11?121*e*e/16:e<8/11?363/40*e*e-99/10*e+17/5:e<9/10?4356/361*e*e-35442/1805*e+16061/1805:54/5*e*e-513/25*e+268/25,oe=e=>e<.5?.5*ht(e*2):.5*Y(e*2-1)+.5,N=class{running=!1;_o;_p;_x;_d;_w;_e;_rel;_cb=[];_t=0;_u=0;_ch=this;_cu=this;_lc;constructor(t,r,s,a,n){this._o=t,this._p=r,this._x=s,this._d=a,this._e=n,this._w=0}start(t){if(this.running)return this;this._cu.stop(!1),this._ch=this._cu=this,this.running=!0;let r=this._o[this._p]||0,s=this._rel?r+this._x:this._x;return this._lc=this._lc||t||globalThis,this._u=this._lc.listen("update",a=>{if(this._t<=this._w){this._t+=a;return}let n=this._t-this._w;this._o[this._p]=this._lc.lerp(r,s,this._e(n/this._d)),this._t+=a,n>=this._d&&(this._o[this._p]=s,this.stop())}),this}stop(t=!0){if(!this._u)return this;if(this.running=!1,this._u(),this._t=0,t)for(let r of this._cb)r(this._o);return this}restart(t=null,r=!1){return this.stop(r).restart(t)}onEnd(t){return this._cb.push(t),this}chain(t){return this._ch.onEnd(()=>{this._cu=t.start(this._lc)}),this._ch=t,this}reset(){return this._cb.length=0,this.stop()}relative(t=!0){return this._rel=t,this}delay(t){return this._w=t,this}get current(){return this._cu}get progress(){return this.running&&this._t>this._w?(this._t-this._w)/this._d:0}};var ut=4,O=1<<ut,lt=8,he=1<<lt,f=4095,W=e=>.5*(1-Math.cos(e*Math.PI)),X=class{_p=[];_po=4;_pf=.5;_e=null;constructor(t){this._e=t||globalThis,this.noiseSeed()}noise(t,r=0,s=0){t<0&&(t=-t),r<0&&(r=-r),s<0&&(s=-s);let a=Math.floor(t),n=Math.floor(r),o=Math.floor(s),h=t-a,u=r-n,d=s-o,p,_,b=0,g=.5,l,c,M;for(let U=0;U<this._po;U++){let m=a+(n<<ut)+(o<<lt);p=W(h),_=W(u),l=this._p[m&f],l+=p*(this._p[m+1&f]-l),c=this._p[m+O&f],c+=p*(this._p[m+O+1&f]-c),l+=_*(c-l),m+=he,c=this._p[m&f],c+=p*(this._p[m+1&f]-c),M=this._p[m+O&f],M+=p*(this._p[m+O+1&f]-M),c+=_*(M-c),l+=W(d)*(c-l),b+=l*g,g*=this._pf,a<<=1,h*=2,n<<=1,u*=2,o<<=1,d*=2,h>=1&&(a++,h--),u>=1&&(n++,u--),d>=1&&(o++,d--)}return b}noiseDetail(t,r){t>0&&(this._po=t),r>0&&(this._pf=r)}noiseSeed(t=null){t!=null&&this._e.seed(t);let r=this._e.rand||Math.random;for(let s=0;s<f+1;s++)this._p[s]=r()}};var pt=(e,t=!0,r=!1,s=globalThis)=>s.paint(e.width,e.height,a=>{s.push(),s.scale(t?-1:1,r?-1:1),s.image(t?-e.width:0,r?-e.height:0,e),s.pop()});var ct=(e,t,r=!0,s=globalThis)=>s.paint(e.width*t,e.height*t,a=>{s.push(),a.imageSmoothingEnabled=!r,s.scale(t),s.image(0,0,e),s.pop()});var mt=(e,t,r=1,s=globalThis)=>s.paint(e.width,e.height,a=>{s.push(),s.alpha(r),s.rectfill(0,0,e.width,e.height,t),a.globalCompositeOperation="destination-atop",s.alpha(1),s.image(0,0,e),s.pop()});var ft=(e,t=0,r=1)=>Array.from(Array(e).keys().map(s=>t+r*s));var bt=(e,t=globalThis.rand||Math.random)=>{e=Array.from(e);for(let r=e.length-1;r>0;r--){let s=Math.floor(t()*(r+1)),a=e[r];e[r]=e[s],e[s]=a}return e};var dt=(e,t=globalThis.rand||Math.random)=>e[Math.floor(t()*e.length)];var _t=e=>e[0];var xt=e=>e[e.length-1];var gt=e=>e.slice(1);globalThis.utils=Object.assign(globalThis.utils||{},F);})();
1
+ (()=>{var Mt=Object.defineProperty;var Et=(e,t)=>{for(var r in t)Mt(e,r,{get:t[r],enumerable:!0})};globalThis.utils=globalThis.utils||{};globalThis.utils.global=(e=!0)=>{for(let t in globalThis.utils)t!=="global"&&(e||globalThis[t]===void 0)&&(globalThis[t]=globalThis.utils[t])};var U={};Et(U,{ANCHOR_BOT_LEFT:()=>Jt,ANCHOR_BOT_RIGHT:()=>vt,ANCHOR_CENTER:()=>Kt,ANCHOR_TOP_LEFT:()=>Q,ANCHOR_TOP_RIGHT:()=>Qt,Actor:()=>R,BACK_IN:()=>ae,BACK_IN_OUT:()=>ie,BACK_OUT:()=>ne,BOUNCE_IN:()=>ut,BOUNCE_IN_OUT:()=>le,BOUNCE_OUT:()=>Y,Camera:()=>y,DOWN:()=>$t,EASE_IN:()=>ee,EASE_IN_OUT:()=>se,EASE_OUT:()=>re,ELASTIC_IN:()=>oe,ELASTIC_IN_OUT:()=>ue,ELASTIC_OUT:()=>he,Grid:()=>I,LEFT:()=>Zt,LINEAR:()=>ht,Noise:()=>F,ONE:()=>jt,RIGHT:()=>Vt,TypedGrid:()=>P,UP:()=>qt,Vector:()=>T,ZERO:()=>K,advance:()=>et,diff:()=>J,dist:()=>at,flipImage:()=>ct,fract:()=>tt,head:()=>yt,intersection:()=>E,last:()=>Tt,lerpAngle:()=>ot,mag:()=>nt,makeCircle:()=>bt,makeRectangle:()=>dt,mean:()=>it,mod:()=>rt,range:()=>_t,resolve:()=>W,roundd:()=>st,sample:()=>gt,scaleImage:()=>mt,shuffle:()=>xt,sum:()=>k,tail:()=>wt,tintImage:()=>ft,tween:()=>te,vec:()=>i,vecAbs:()=>Xt,vecAdd:()=>D,vecAngle:()=>Lt,vecAngleBetween:()=>St,vecCeil:()=>Ft,vecClamp:()=>Wt,vecCross:()=>Rt,vecDist:()=>Ct,vecDist2:()=>Dt,vecDiv:()=>A,vecDot:()=>Z,vecEq:()=>C,vecFloor:()=>Ut,vecIsZero:()=>Gt,vecLerp:()=>Nt,vecLimit:()=>Pt,vecMag:()=>V,vecMag2:()=>$,vecMove:()=>zt,vecMult:()=>w,vecNorm:()=>S,vecRand:()=>Yt,vecReflect:()=>Ht,vecRotate:()=>kt,vecRound:()=>Bt,vecSet:()=>q,vecSetMag:()=>Ot,vecSub:()=>L,wave:()=>v});var E=(e,t,r,s,a,n,o,h)=>{let u=Math.max(e,a),d=Math.min(e+r,a+o)-u,p=Math.max(t,n),_=Math.min(t+s,n+h)-p;return[u,p,d,_]};var W=(e,t,r,s,a,n,o,h)=>{let[u,d,p,_]=E(e,t,r,s,a,n,o,h),b="",g=e,l=t;return p<_?e<a?(b="right",g=a-r):(b="left",g=a+o):t<n?(b="bottom",l=n-s):(b="top",l=n+h),{direction:b,x:g,y:l}};var y=class{_engine=null;x=0;y=0;ox=0;oy=0;width=0;height=0;rotation=0;scale=1;_shake={x:0,y:0,removeListener:null};constructor(t=null,r=0,s=0,a=null,n=null){this._engine=t||globalThis,this.ox=r,this.oy=s,this.resize(a||this._engine.WIDTH-r,n||this._engine.HEIGHT-s),this.x=this.width/2,this.y=this.height/2}resize(t,r){this.width=t,this.height=r,this._engine.emit("camera-resized",this)}start(t=!1){if(this._engine.push(),t){let a=path();a.rect(this.ox,this.oy,this.width,this.height),this._engine.clip(a)}let r=this.ox+this.width/2,s=this.oy+this.height/2;this._engine.translate(r,s),this._engine.scale(this.scale),this._engine.rotate(this.rotation),this._engine.translate(-this.x+this._shake.x,-this.y+this._shake.y)}end(){this._engine.pop()}lookAt(t,r){this.x=t,this.y=r}move(t,r){this.x+=t,this.y+=r}zoom(t){this.scale*=t}zoomTo(t){this.scale=t}rotate(t){this.rotation+=t}rotateTo(t){this.rotation=t}getWorldPoint(t,r,s={}){let a=Math.cos(-this.rotation),n=Math.sin(-this.rotation);return t=(t-this.width/2-this.ox)/this.scale,r=(r-this.height/2-this.oy)/this.scale,s.x=a*t-n*r+this.x,s.y=n*t+a*r+this.y,s}getCameraPoint(t,r,s={}){let a=Math.cos(-this.rotation),n=Math.sin(-this.rotation);return t=t-this.x,r=r-this.y,t=a*t-n*r,r=n*t+a*r,s.x=t*this.scale+this.width/2+this.ox,s.y=r*this.scale+this.height/2+this.oy,s}getBounds(){return[this.ox,this.oy,this.width,this.height]}viewing(t,r,s,a){let n=this.width/2-this.x,o=this.height/2-this.y,h=this.width/this.scale,u=this.height/this.scale;return this._engine.colrect(t,r,s,a,n,o,h,u)}shake(t=1,r=.3){this.shaking||(this._shake.removeListener=this._engine.listen("update",s=>{this._shake.x=this._engine.randi(-t,t),this._shake.y=this._engine.randi(-t,t),r-=s,r<=0&&this.unshake()}))}unshake(){this.shaking&&(this._shake.removeListener(),this._shake.removeListener=null,this._shake.x=this._shake.y=0)}get shaking(){return this._shake.removeListener!==null}};var I=class e{_w;_h;_c;constructor(t,r,s=[]){this._w=Math.max(1,~~t),this._h=Math.max(1,~~r),this._c=s}[Symbol.iterator](){let t=0;return{next:()=>({value:[this.indexToPointX(t),this.indexToPointY(t),this._c[t++]],done:t>this._c.length})}}clone(){return new e(this._w,this._h,this._c)}clear(){this.forEach((t,r)=>this.set(t,r,void 0))}get width(){return this._w}get height(){return this._h}set(t,r,s){this._c[this.pointToIndex(t,r)]=s}get(t,r){return this._c[this.pointToIndex(t,r)]}has(t,r){return this.get(t,r)!=null}check(t,r){return t>=0&&t<this._w&&r>=0&&r<this._h}get length(){return this._w*this._h}pointToIndex(t,r){return this.clampX(~~t)+this.clampY(~~r)*this._w}indexToPointX(t){return t%this._w}indexToPointY(t){return Math.floor(t/this._w)}forEach(t,r=!1){let s=r?this.length-1:0,a=r?-1:this.length,n=r?-1:1;for(;s!==a;){let o=this.indexToPointX(s),h=this.indexToPointY(s),u=this._c[s];if(t(o,h,u,this)===!1)break;s+=n}}fill(t){this.forEach((r,s)=>{this.set(r,s,t)})}clampX(t){return z(t,0,this._w-1)}clampY(t){return z(t,0,this._h-1)}toArray(){return this._c.slice()}toString(t=" ",r=!0){if(!r)return this._c.join(t);let s=[];return this.forEach((a,n,o)=>{s[n]=s[n]||"",s[n]+=o+t}),s.join(`
2
+ `)}},P=class e extends I{constructor(t,r,s=Uint8Array){super(t,r,null),this._c=new s(this._w*this._h)}has(t,r){return this.get(t,r)!==0}clone(){let t=new e(this._w,this._h,this._c.constructor);return this.forEach((r,s,a)=>{t.set(r,s,a)}),t}};function z(e,t,r){return e<t?t:e>r?r:e}var It=Math.sqrt,G=Math.cos,j=Math.sin,At=2*Math.PI,T=class{x;y;constructor(t=0,r=t){this.x=t,this.y=r}toString(){return`Vector (${this.x}, ${this.y})`}},x=e=>e instanceof T,i=(e=0,t=e)=>(x(e)&&(t=e.y,e=e.x),new T(e,t)),C=(e,t,r=t)=>x(t)?C(e,t.x,t.y):e.x===t&&e.y===r,q=(e,t,r=t)=>(x(t)?q(e,t.x,t.y):(e.x=t,e.y=r),e),D=(e,t,r=t)=>x(t)?D(e,t.x,t.y):(e.x+=t,e.y+=r,e),L=(e,t,r=t)=>x(t)?L(e,t.x,t.y):(e.x-=t,e.y-=r,e),w=(e,t,r=t)=>x(t)?w(e,t.x,t.y):(e.x*=t,e.y*=r,e),A=(e,t,r=t)=>x(t)?A(e,t.x,t.y):(e.x/=t||1,e.y/=r||1,e),kt=(e,t)=>{let r=G(t),s=j(t);return e.x=r*e.x-s*e.y,e.y=s*e.x+r*e.y,e},Ht=(e,t)=>{let r=S(i(t));return L(e,w(r,2*Z(e,r)))},Ot=(e,t)=>(S(e),w(e,t),e),V=e=>Math.hypot(e.x,e.y),$=e=>e.x*e.x+e.y*e.y,S=e=>{let t=V(e);return t>0&&A(e,t),e},Pt=(e,t=1)=>{let r=$(e);return r>t*t&&(A(e,It(r)),w(e,t)),e},Ct=(e,t)=>Math.hypot(t.x-e.x,t.y-e.y),Dt=(e,t)=>{let r=e.x-t.x,s=e.y-t.y;return r*r+s*s},Lt=e=>Math.atan2(e.y,e.x),St=(e,t)=>Math.atan2(t.y-e.y,t.x-e.x),Z=(e,t)=>e.x*t.x+e.y*t.y,Rt=(e,t)=>e.x*t.y-e.y*t.x,Nt=(e,t,r)=>(e.x+=(t.x-e.x)*r||0,e.y+=(t.y-e.y)*r||0,e),Yt=(e=1,t=e,r=globalThis.rand||Math.random)=>{let s=r()*At,a=r()*(t-e)+e;return i(G(s)*a,j(s)*a)},Xt=e=>(e.x=Math.abs(e.x),e.y=Math.abs(e.y),e),Ft=e=>(e.x=Math.ceil(e.x),e.y=Math.ceil(e.y),e),Ut=e=>(e.x=Math.floor(e.x),e.y=Math.floor(e.y),e),Bt=e=>(e.x=Math.round(e.x),e.y=Math.round(e.y),e),Wt=(e,t,r)=>(e.x<t.x&&(e.x=t.x),e.x>r.x&&(e.x=r.x),e.y<t.y&&(e.y=t.y),e.y>r.y&&(e.y=r.y),e),zt=(e,t,r=1)=>D(e,t.x*r,t.y*r),Gt=e=>C(e,K),K=i(0,0),jt=i(1,1),qt=i(0,-1),Vt=i(1,0),$t=i(0,1),Zt=i(-1,0);var Kt=i(.5,.5),Q=i(0,0),Qt=i(1,0),Jt=i(0,1),vt=i(1,1),R=class{sprite;pos;_o;_s;flipX=!1;flipY=!1;angle=0;opacity=1;hidden=!1;constructor(t,r,s=Q){this.sprite=t,this.pos=r||i(0),this._o=i(s),this._s=i(1,1)}set x(t){this.pos.x=t}get x(){return this.pos.x}set y(t){this.pos.y=t}get y(){return this.pos.y}set anchor(t){this._o.x=t.x,this._o.y=t.y}get anchor(){return this._o}get width(){return this.sprite.width*this._s.x}get height(){return this.sprite.height*this._s.y}get scale(){return this._s}scaleTo(t,r=t){this._s.x=t,this._s.y=r}scaleBy(t,r=t){this._s.x*=t,this._s.y*=r}getBounds(t=!0){let r=this.sprite.width*(t?this._s.x:1),s=this.sprite.height*(t?this._s.y:1),a=this.pos.x-r*this.anchor.x,n=this.pos.y-s*this.anchor.y;return[a,n,r,s]}draw(t=globalThis,r=!0){this.hidden||this.opacity<=0||(r&&t.push(),this.transform(t),this.drawImage(t),r&&t.pop())}transform(t){t.translate(this.pos.x,this.pos.y),t.rotate(t.deg2rad(this.angle)),t.scale((this.flipX?-1:1)*this._s.x,(this.flipY?-1:1)*this._s.y)}drawImage(t,r=!0){let s=this.anchor,a=-this.sprite.width*(this.flipX?1-s.x:s.x),n=-this.sprite.height*(this.flipY?1-s.y:s.y);r&&t.alpha(this.opacity),t.image(a,n,this.sprite)}};var J=(e,t)=>Math.abs(t-e)||0;var v=(e,t,r,s=Math.sin)=>e+(s(r)+1)/2*(t-e);var tt=e=>e%1||0;var et=advance=(e,t,r,s=1)=>{r&&(t.x+=r.x*s,t.y+=r.y*s),e.x+=t.x*s,e.y+=t.y*s};var rt=(e,t)=>(t+e%t)%t;var st=(e,t=0)=>{if(!t)return Math.round(e);let r=Math.pow(10,t);return Math.round(e*r)/r};var at=(e,t,r,s)=>Math.hypot(r-e,s-t);var nt=(e,t)=>Math.hypot(e,t);var k=e=>{let t=0;for(let r=0;r<e.length;r++)t+=e[r];return t};var it=e=>k(e)/e.length;var ot=(e,t,r)=>{let s=(t-e)%360;return s>180?s-=360:s<-180&&(s+=360),e+s*r};var H=Math.PI/2,te=(e,t,r,s=1,a=ht)=>new N(e,t,r,s,a),ht=e=>e,ee=e=>e*e,re=e=>-e*(e-2),se=e=>e<.5?2*e*e:-2*e*e+4*e-1,ae=e=>e*e*e-e*Math.sin(e*Math.PI),ne=e=>{let t=1-e;return 1-(t*t*t-t*Math.sin(t*Math.PI))},ie=e=>{if(e<.5){let r=2*e;return .5*(r*r*r-r*Math.sin(r*Math.PI))}let t=1-(2*e-1);return .5*(1-(t*t*t-t*Math.sin(e*Math.PI)))+.5},oe=e=>Math.sin(13*H*e)*Math.pow(2,10*(e-1)),he=e=>Math.sin(-13*H*(e+1))*Math.pow(2,-10*e)+1,ue=e=>{if(e<.5){let s=Math.sin(13*H*(2*e)),a=Math.pow(2,10*(2*e-1));return .5*s*a}let t=Math.sin(-13*H*(2*e-1+1)),r=Math.pow(2,-10*(2*e-1));return .5*(t*r+2)},ut=e=>1-Y(1-e),Y=e=>e<4/11?121*e*e/16:e<8/11?363/40*e*e-99/10*e+17/5:e<9/10?4356/361*e*e-35442/1805*e+16061/1805:54/5*e*e-513/25*e+268/25,le=e=>e<.5?.5*ut(e*2):.5*Y(e*2-1)+.5,N=class{running=!1;_o;_p;_x;_d;_w;_e;_rel;_cb=[];_t=0;_u=0;_ch=this;_cu=this;_lc;constructor(t,r,s,a,n){this._o=t,this._p=r,this._x=s,this._d=a,this._e=n,this._w=0}start(t){if(this.running)return this;this._cu.stop(!1),this._ch=this._cu=this,this.running=!0;let r=this._o[this._p]||0,s=this._rel?r+this._x:this._x;return this._lc=this._lc||t||globalThis,this._u=this._lc.listen("update",a=>{if(this._t<=this._w){this._t+=a;return}let n=this._t-this._w;this._o[this._p]=this._lc.lerp(r,s,this._e(n/this._d)),this._t+=a,n>=this._d&&(this._o[this._p]=s,this.stop())}),this}stop(t=!0){if(!this._u)return this;if(this.running=!1,this._u(),this._t=0,t)for(let r of this._cb)r(this._o);return this}restart(t=null,r=!1){return this.stop(r).restart(t)}onEnd(t){return this._cb.push(t),this}chain(t){return this._ch.onEnd(()=>{this._cu=t.start(this._lc)}),this._ch=t,this}reset(){return this._cb.length=0,this.stop()}relative(t=!0){return this._rel=t,this}delay(t){return this._w=t,this}get current(){return this._cu}get progress(){return this.running&&this._t>this._w?(this._t-this._w)/this._d:0}};var lt=4,O=1<<lt,pt=8,pe=1<<pt,f=4095,X=e=>.5*(1-Math.cos(e*Math.PI)),F=class{_p=[];_po=4;_pf=.5;_e=null;constructor(t){this._e=t||globalThis,this.noiseSeed()}noise(t,r=0,s=0){t<0&&(t=-t),r<0&&(r=-r),s<0&&(s=-s);let a=Math.floor(t),n=Math.floor(r),o=Math.floor(s),h=t-a,u=r-n,d=s-o,p,_,b=0,g=.5,l,c,M;for(let B=0;B<this._po;B++){let m=a+(n<<lt)+(o<<pt);p=X(h),_=X(u),l=this._p[m&f],l+=p*(this._p[m+1&f]-l),c=this._p[m+O&f],c+=p*(this._p[m+O+1&f]-c),l+=_*(c-l),m+=pe,c=this._p[m&f],c+=p*(this._p[m+1&f]-c),M=this._p[m+O&f],M+=p*(this._p[m+O+1&f]-M),c+=_*(M-c),l+=X(d)*(c-l),b+=l*g,g*=this._pf,a<<=1,h*=2,n<<=1,u*=2,o<<=1,d*=2,h>=1&&(a++,h--),u>=1&&(n++,u--),d>=1&&(o++,d--)}return b}noiseDetail(t,r){t>0&&(this._po=t),r>0&&(this._pf=r)}noiseSeed(t=null){t!=null&&this._e.seed(t);let r=this._e.rand||Math.random;for(let s=0;s<f+1;s++)this._p[s]=r()}};var ct=(e,t=!0,r=!1,s=globalThis)=>s.paint(e.width,e.height,a=>{s.push(),s.scale(t?-1:1,r?-1:1),s.image(t?-e.width:0,r?-e.height:0,e),s.pop()});var mt=(e,t,r=!0,s=globalThis)=>s.paint(e.width*t,e.height*t,a=>{s.push(),a.imageSmoothingEnabled=!r,s.scale(t),s.image(0,0,e),s.pop()});var ft=(e,t,r=1,s=globalThis)=>s.paint(e.width,e.height,a=>{s.push(),s.alpha(r),s.rectfill(0,0,e.width,e.height,t),a.globalCompositeOperation="destination-atop",s.alpha(1),s.image(0,0,e),s.pop()});var bt=(e,t,{borderWidth:r=0,borderColor:s=0,engine:a=globalThis}={})=>{let n=e*2+r;return a.paint(n,n,()=>{a.circfill(n/2,n/2,e,t),r>0&&(a.linewidth(r),a.stroke(s))})};var dt=(e,t,r,{borderWidth:s=0,borderColor:a=0,engine:n=globalThis}={})=>{let o=e+s*2,h=t+s*2;return n.paint(o,h,()=>{n.rectfill(s>0?s:0,s>0?s:0,e,t,r),s>0&&(n.linewidth(s),n.stroke(a))})};var _t=(e,t=0,r=1)=>Array.from(Array(e).keys().map(s=>t+r*s));var xt=(e,t=globalThis.rand||Math.random)=>{e=Array.from(e);for(let r=e.length-1;r>0;r--){let s=Math.floor(t()*(r+1)),a=e[r];e[r]=e[s],e[s]=a}return e};var gt=(e,t=globalThis.rand||Math.random)=>e[Math.floor(t()*e.length)];var yt=e=>e[0];var Tt=e=>e[e.length-1];var wt=e=>e.slice(1);globalThis.utils=Object.assign(globalThis.utils||{},U);})();
3
3
  /*! @litecanvas/utils by Luiz Bills | MIT Licensed */
package/dist/image.js CHANGED
@@ -20,6 +20,8 @@
20
20
  var index_exports = {};
21
21
  __export(index_exports, {
22
22
  flipImage: () => flip_default,
23
+ makeCircle: () => make_circle_default,
24
+ makeRectangle: () => make_rectangle_default,
23
25
  scaleImage: () => scale_default,
24
26
  tintImage: () => tint_default
25
27
  });
@@ -58,6 +60,37 @@
58
60
  });
59
61
  };
60
62
 
63
+ // src/image/make-circle.js
64
+ var make_circle_default = (radius, color, { borderWidth = 0, borderColor = 0, engine = globalThis } = {}) => {
65
+ const imageSize = radius * 2 + borderWidth;
66
+ return engine.paint(imageSize, imageSize, () => {
67
+ engine.circfill(imageSize / 2, imageSize / 2, radius, color);
68
+ if (borderWidth > 0) {
69
+ engine.linewidth(borderWidth);
70
+ engine.stroke(borderColor);
71
+ }
72
+ });
73
+ };
74
+
75
+ // src/image/make-rectangle.js
76
+ var make_rectangle_default = (width, height, color, { borderWidth = 0, borderColor = 0, engine = globalThis } = {}) => {
77
+ const imageWidth = width + borderWidth * 2;
78
+ const imageHeight = height + borderWidth * 2;
79
+ return engine.paint(imageWidth, imageHeight, () => {
80
+ engine.rectfill(
81
+ borderWidth > 0 ? borderWidth : 0,
82
+ borderWidth > 0 ? borderWidth : 0,
83
+ width,
84
+ height,
85
+ color
86
+ );
87
+ if (borderWidth > 0) {
88
+ engine.linewidth(borderWidth);
89
+ engine.stroke(borderColor);
90
+ }
91
+ });
92
+ };
93
+
61
94
  // src/image/_web.js
62
95
  globalThis.utils = Object.assign(globalThis.utils || {}, index_exports);
63
96
  })();
package/dist/image.min.js CHANGED
@@ -1 +1 @@
1
- (()=>{var o=Object.defineProperty;var l=(e,a)=>{for(var r in a)o(e,r,{get:a[r],enumerable:!0})};globalThis.utils=globalThis.utils||{};globalThis.utils.global=(e=!0)=>{for(let a in globalThis.utils)a!=="global"&&(e||globalThis[a]===void 0)&&(globalThis[a]=globalThis.utils[a])};var s={};l(s,{flipImage:()=>u,scaleImage:()=>m,tintImage:()=>i});var u=(e,a=!0,r=!1,t=globalThis)=>t.paint(e.width,e.height,n=>{t.push(),t.scale(a?-1:1,r?-1:1),t.image(a?-e.width:0,r?-e.height:0,e),t.pop()});var m=(e,a,r=!0,t=globalThis)=>t.paint(e.width*a,e.height*a,n=>{t.push(),n.imageSmoothingEnabled=!r,t.scale(a),t.image(0,0,e),t.pop()});var i=(e,a,r=1,t=globalThis)=>t.paint(e.width,e.height,n=>{t.push(),t.alpha(r),t.rectfill(0,0,e.width,e.height,a),n.globalCompositeOperation="destination-atop",t.alpha(1),t.image(0,0,e),t.pop()});globalThis.utils=Object.assign(globalThis.utils||{},s);})();
1
+ (()=>{var f=Object.defineProperty;var d=(e,a)=>{for(var r in a)f(e,r,{get:a[r],enumerable:!0})};globalThis.utils=globalThis.utils||{};globalThis.utils.global=(e=!0)=>{for(let a in globalThis.utils)a!=="global"&&(e||globalThis[a]===void 0)&&(globalThis[a]=globalThis.utils[a])};var u={};d(u,{flipImage:()=>m,makeCircle:()=>o,makeRectangle:()=>p,scaleImage:()=>i,tintImage:()=>l});var m=(e,a=!0,r=!1,t=globalThis)=>t.paint(e.width,e.height,n=>{t.push(),t.scale(a?-1:1,r?-1:1),t.image(a?-e.width:0,r?-e.height:0,e),t.pop()});var i=(e,a,r=!0,t=globalThis)=>t.paint(e.width*a,e.height*a,n=>{t.push(),n.imageSmoothingEnabled=!r,t.scale(a),t.image(0,0,e),t.pop()});var l=(e,a,r=1,t=globalThis)=>t.paint(e.width,e.height,n=>{t.push(),t.alpha(r),t.rectfill(0,0,e.width,e.height,a),n.globalCompositeOperation="destination-atop",t.alpha(1),t.image(0,0,e),t.pop()});var o=(e,a,{borderWidth:r=0,borderColor:t=0,engine:n=globalThis}={})=>{let s=e*2+r;return n.paint(s,s,()=>{n.circfill(s/2,s/2,e,a),r>0&&(n.linewidth(r),n.stroke(t))})};var p=(e,a,r,{borderWidth:t=0,borderColor:n=0,engine:s=globalThis}={})=>{let c=e+t*2,b=a+t*2;return s.paint(c,b,()=>{s.rectfill(t>0?t:0,t>0?t:0,e,a,r),t>0&&(s.linewidth(t),s.stroke(n))})};globalThis.utils=Object.assign(globalThis.utils||{},u);})();
package/dist/math.js CHANGED
@@ -23,6 +23,7 @@
23
23
  diff: () => diff_default,
24
24
  dist: () => dist_default,
25
25
  fract: () => fract_default,
26
+ lerpAngle: () => lerp_angle_default,
26
27
  mag: () => mag_default,
27
28
  mean: () => mean_default,
28
29
  mod: () => mod_default,
@@ -89,6 +90,17 @@
89
90
  return sum_default(values) / values.length;
90
91
  };
91
92
 
93
+ // src/math/lerp-angle.js
94
+ var lerp_angle_default = (start, end, amount) => {
95
+ let dif = (end - start) % 360;
96
+ if (dif > 180) {
97
+ dif -= 360;
98
+ } else if (dif < -180) {
99
+ dif += 360;
100
+ }
101
+ return start + dif * amount;
102
+ };
103
+
92
104
  // src/math/_web.js
93
105
  globalThis.utils = Object.assign(globalThis.utils || {}, index_exports);
94
106
  })();
package/dist/math.min.js CHANGED
@@ -1 +1 @@
1
- (()=>{var h=Object.defineProperty;var d=(r,t)=>{for(var o in t)h(r,o,{get:t[o],enumerable:!0})};globalThis.utils=globalThis.utils||{};globalThis.utils.global=(r=!0)=>{for(let t in globalThis.utils)t!=="global"&&(r||globalThis[t]===void 0)&&(globalThis[t]=globalThis.utils[t])};var n={};d(n,{advance:()=>a,diff:()=>c,dist:()=>f,fract:()=>u,mag:()=>y,mean:()=>i,mod:()=>p,roundd:()=>l,sum:()=>s,wave:()=>x});var c=(r,t)=>Math.abs(t-r)||0;var x=(r,t,o,e=Math.sin)=>r+(e(o)+1)/2*(t-r);var u=r=>r%1||0;var T=2*Math.PI;var a=advance=(r,t,o,e=1)=>{o&&(t.x+=o.x*e,t.y+=o.y*e),r.x+=t.x*e,r.y+=t.y*e};var p=(r,t)=>(t+r%t)%t;var l=(r,t=0)=>{if(!t)return Math.round(r);let o=Math.pow(10,t);return Math.round(r*o)/o};var f=(r,t,o,e)=>Math.hypot(o-r,e-t);var y=(r,t)=>Math.hypot(r,t);var s=r=>{let t=0;for(let o=0;o<r.length;o++)t+=r[o];return t};var i=r=>s(r)/r.length;globalThis.utils=Object.assign(globalThis.utils||{},n);})();
1
+ (()=>{var d=Object.defineProperty;var M=(e,t)=>{for(var r in t)d(e,r,{get:t[r],enumerable:!0})};globalThis.utils=globalThis.utils||{};globalThis.utils.global=(e=!0)=>{for(let t in globalThis.utils)t!=="global"&&(e||globalThis[t]===void 0)&&(globalThis[t]=globalThis.utils[t])};var n={};M(n,{advance:()=>a,diff:()=>c,dist:()=>f,fract:()=>u,lerpAngle:()=>h,mag:()=>y,mean:()=>i,mod:()=>p,roundd:()=>l,sum:()=>s,wave:()=>x});var c=(e,t)=>Math.abs(t-e)||0;var x=(e,t,r,o=Math.sin)=>e+(o(r)+1)/2*(t-e);var u=e=>e%1||0;var R=2*Math.PI;var a=advance=(e,t,r,o=1)=>{r&&(t.x+=r.x*o,t.y+=r.y*o),e.x+=t.x*o,e.y+=t.y*o};var p=(e,t)=>(t+e%t)%t;var l=(e,t=0)=>{if(!t)return Math.round(e);let r=Math.pow(10,t);return Math.round(e*r)/r};var f=(e,t,r,o)=>Math.hypot(r-e,o-t);var y=(e,t)=>Math.hypot(e,t);var s=e=>{let t=0;for(let r=0;r<e.length;r++)t+=e[r];return t};var i=e=>s(e)/e.length;var h=(e,t,r)=>{let o=(t-e)%360;return o>180?o-=360:o<-180&&(o+=360),e+o*r};globalThis.utils=Object.assign(globalThis.utils||{},n);})();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@litecanvas/utils",
3
- "version": "0.29.0",
3
+ "version": "0.30.0",
4
4
  "description": "Utilities to help build litecanvas games",
5
5
  "author": "Luiz Bills <luizbills@pm.me>",
6
6
  "license": "MIT",
@@ -1,3 +1,5 @@
1
1
  export { default as flipImage } from "./flip.js"
2
2
  export { default as scaleImage } from "./scale.js"
3
3
  export { default as tintImage } from "./tint.js"
4
+ export { default as makeCircle } from "./make-circle.js"
5
+ export { default as makeRectangle } from "./make-rectangle.js"
@@ -0,0 +1,27 @@
1
+ import "litecanvas"
2
+
3
+ /**
4
+ * Creates an image with the geometric shape of a circle with an optional border.
5
+ *
6
+ * @param {number} radius
7
+ * @param {number} color
8
+ * @param {object} [options]
9
+ * @param {number} [options.borderWidth]
10
+ * @param {number} [options.borderColor]
11
+ * @param {LitecanvasInstance} [options.engine]
12
+ * @returns {OffscreenCanvas} the shape image
13
+ */
14
+ export default (
15
+ radius,
16
+ color,
17
+ { borderWidth = 0, borderColor = 0, engine = globalThis } = {}
18
+ ) => {
19
+ const imageSize = radius * 2 + borderWidth
20
+ return engine.paint(imageSize, imageSize, () => {
21
+ engine.circfill(imageSize / 2, imageSize / 2, radius, color)
22
+ if (borderWidth > 0) {
23
+ engine.linewidth(borderWidth)
24
+ engine.stroke(borderColor)
25
+ }
26
+ })
27
+ }
@@ -0,0 +1,37 @@
1
+ import "litecanvas"
2
+
3
+ /**
4
+ * Creates an image with the geometric shape of a rectangle with an optional border.
5
+ *
6
+ * @param {number} width
7
+ * @param {number} height
8
+ * @param {number} color
9
+ * @param {object} [options]
10
+ * @param {number} [options.borderWidth]
11
+ * @param {number} [options.borderColor]
12
+ * @param {LitecanvasInstance} [options.engine]
13
+ * @returns {OffscreenCanvas} the shape image
14
+ */
15
+ export default (
16
+ width,
17
+ height,
18
+ color,
19
+ { borderWidth = 0, borderColor = 0, engine = globalThis } = {}
20
+ ) => {
21
+ const imageWidth = width + borderWidth * 2
22
+ const imageHeight = height + borderWidth * 2
23
+
24
+ return engine.paint(imageWidth, imageHeight, () => {
25
+ engine.rectfill(
26
+ borderWidth > 0 ? borderWidth : 0,
27
+ borderWidth > 0 ? borderWidth : 0,
28
+ width,
29
+ height,
30
+ color
31
+ )
32
+ if (borderWidth > 0) {
33
+ engine.linewidth(borderWidth)
34
+ engine.stroke(borderColor)
35
+ }
36
+ })
37
+ }
@@ -103,6 +103,8 @@ function draw() {
103
103
 
104
104
  Math modulus (always returns a positive number).
105
105
 
106
+ Syntax: `mod(dividend: number, divisor: number): number`
107
+
106
108
  ```js
107
109
  import { mod } from "@litecanvas/utils"
108
110
 
@@ -117,15 +119,32 @@ Computes the mean of the values in a array.
117
119
  ```js
118
120
  import { mean } from "@litecanvas/utils"
119
121
 
120
- mean(10, 5, 3) // => 6 or (10 + 5 + 3) / 3
122
+ Syntax: `mean(values: number[]): number`
123
+
124
+ mean([10, 5, 3]) // => 6 or (10 + 5 + 3) / 3
121
125
  ```
122
126
 
123
127
  ## sum
124
128
 
125
129
  Computes the sum of the values in a array.
126
130
 
131
+ Syntax: `sum(values: number[]): number`
132
+
127
133
  ```js
128
134
  import { sum } from "@litecanvas/utils"
129
135
 
130
- sum(10, 5, 3) // => 18 or (10 + 5 + 3)
136
+ sum([10, 5, 3]) // => 18 or (10 + 5 + 3)
137
+ ```
138
+
139
+ ## lerpAngle
140
+
141
+ Calculates the linear interpolation of two angles (in degrees).
142
+
143
+ Syntax: `lerpAngle(start: number, end: number, amount: number): number`
144
+
145
+ ```js
146
+ import { lerpAngle } from "@litecanvas/utils"
147
+
148
+ lerpAngle(0, 90, 0.5) // => 45
149
+ lerpAngle(0, 270, 0.5) // => -45
131
150
  ```
package/src/math/index.js CHANGED
@@ -8,3 +8,4 @@ export { default as dist } from "./dist.js"
8
8
  export { default as mag } from "./mag.js"
9
9
  export { default as mean } from "./mean.js"
10
10
  export { default as sum } from "./sum.js"
11
+ export { default as lerpAngle } from "./lerp-angle.js"
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Calculates the linear interpolation of two angles (in degrees).
3
+ *
4
+ * @param {number} start from angle
5
+ * @param {number} end to angle
6
+ * @param {number} amount usually a value between 0.0 and 1.0
7
+ * @returns {number} the interpolated value
8
+ */
9
+ export default (start, end, amount) => {
10
+ let dif = (end - start) % 360
11
+
12
+ if (dif > 180) {
13
+ dif -= 360
14
+ } else if (dif < -180) {
15
+ dif += 360
16
+ }
17
+
18
+ return start + dif * amount
19
+ }