@dcl/wearable-preview 1.0.0-2059283696.commit-5deed6e → 1.0.0-2065716845.commit-784645d

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,20 +1,20 @@
1
1
  {
2
2
  "files": {
3
- "main.css": "https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2059283696.commit-5deed6e/static/css/main.bcd9c703.chunk.css",
4
- "main.js": "https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2059283696.commit-5deed6e/static/js/main.3db9196c.chunk.js",
5
- "main.js.map": "https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2059283696.commit-5deed6e/static/js/main.3db9196c.chunk.js.map",
6
- "runtime-main.js": "https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2059283696.commit-5deed6e/static/js/runtime-main.86a7a354.js",
7
- "runtime-main.js.map": "https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2059283696.commit-5deed6e/static/js/runtime-main.86a7a354.js.map",
8
- "static/js/2.42aa6e2a.chunk.js": "https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2059283696.commit-5deed6e/static/js/2.42aa6e2a.chunk.js",
9
- "static/js/2.42aa6e2a.chunk.js.map": "https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2059283696.commit-5deed6e/static/js/2.42aa6e2a.chunk.js.map",
10
- "index.html": "https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2059283696.commit-5deed6e/index.html",
11
- "static/css/main.bcd9c703.chunk.css.map": "https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2059283696.commit-5deed6e/static/css/main.bcd9c703.chunk.css.map",
12
- "static/js/2.42aa6e2a.chunk.js.LICENSE.txt": "https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2059283696.commit-5deed6e/static/js/2.42aa6e2a.chunk.js.LICENSE.txt"
3
+ "main.css": "https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2065716845.commit-784645d/static/css/main.bcd9c703.chunk.css",
4
+ "main.js": "https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2065716845.commit-784645d/static/js/main.94f222a2.chunk.js",
5
+ "main.js.map": "https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2065716845.commit-784645d/static/js/main.94f222a2.chunk.js.map",
6
+ "runtime-main.js": "https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2065716845.commit-784645d/static/js/runtime-main.9ef38739.js",
7
+ "runtime-main.js.map": "https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2065716845.commit-784645d/static/js/runtime-main.9ef38739.js.map",
8
+ "static/js/2.42aa6e2a.chunk.js": "https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2065716845.commit-784645d/static/js/2.42aa6e2a.chunk.js",
9
+ "static/js/2.42aa6e2a.chunk.js.map": "https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2065716845.commit-784645d/static/js/2.42aa6e2a.chunk.js.map",
10
+ "index.html": "https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2065716845.commit-784645d/index.html",
11
+ "static/css/main.bcd9c703.chunk.css.map": "https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2065716845.commit-784645d/static/css/main.bcd9c703.chunk.css.map",
12
+ "static/js/2.42aa6e2a.chunk.js.LICENSE.txt": "https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2065716845.commit-784645d/static/js/2.42aa6e2a.chunk.js.LICENSE.txt"
13
13
  },
14
14
  "entrypoints": [
15
- "static/js/runtime-main.86a7a354.js",
15
+ "static/js/runtime-main.9ef38739.js",
16
16
  "static/js/2.42aa6e2a.chunk.js",
17
17
  "static/css/main.bcd9c703.chunk.css",
18
- "static/js/main.3db9196c.chunk.js"
18
+ "static/js/main.94f222a2.chunk.js"
19
19
  ]
20
20
  }
package/index.html CHANGED
@@ -1 +1 @@
1
- <!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="icon" href="https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2059283696.commit-5deed6e/favicon.ico"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" content="#000000"/><meta name="description" content="Preview wearables from Decentraland"/><link rel="apple-touch-icon" href="https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2059283696.commit-5deed6e/logo192.png"/><link rel="manifest" href="https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2059283696.commit-5deed6e/manifest.json"/><title>Decentraland | Wearable Preview</title><link href="https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2059283696.commit-5deed6e/static/css/main.bcd9c703.chunk.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div><script>!function(e){function r(r){for(var n,u,a=r[0],i=r[1],c=r[2],f=0,d=[];f<a.length;f++)u=a[f],Object.prototype.hasOwnProperty.call(o,u)&&o[u]&&d.push(o[u][0]),o[u]=0;for(n in i)Object.prototype.hasOwnProperty.call(i,n)&&(e[n]=i[n]);for(p&&p(r);d.length;)d.shift()();return l.push.apply(l,c||[]),t()}function t(){for(var e,r=0;r<l.length;r++){for(var t=l[r],n=!0,a=1;a<t.length;a++){var i=t[a];0!==o[i]&&(n=!1)}n&&(l.splice(r--,1),e=u(u.s=t[0]))}return e}var n={},o={1:0},l=[];function u(r){if(n[r])return n[r].exports;var t=n[r]={i:r,l:!1,exports:{}};return e[r].call(t.exports,t,t.exports,u),t.l=!0,t.exports}u.m=e,u.c=n,u.d=function(e,r,t){u.o(e,r)||Object.defineProperty(e,r,{enumerable:!0,get:t})},u.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},u.t=function(e,r){if(1&r&&(e=u(e)),8&r)return e;if(4&r&&"object"==typeof e&&e&&e.__esModule)return e;var t=Object.create(null);if(u.r(t),Object.defineProperty(t,"default",{enumerable:!0,value:e}),2&r&&"string"!=typeof e)for(var n in e)u.d(t,n,function(r){return e[r]}.bind(null,n));return t},u.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return u.d(r,"a",r),r},u.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},u.p="https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2059283696.commit-5deed6e/";var a=this["webpackJsonp@dcl/wearable-preview"]=this["webpackJsonp@dcl/wearable-preview"]||[],i=a.push.bind(a);a.push=r,a=a.slice();for(var c=0;c<a.length;c++)r(a[c]);var p=i;t()}([])</script><script src="https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2059283696.commit-5deed6e/static/js/2.42aa6e2a.chunk.js"></script><script src="https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2059283696.commit-5deed6e/static/js/main.3db9196c.chunk.js"></script></body></html>
1
+ <!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="icon" href="https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2065716845.commit-784645d/favicon.ico"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" content="#000000"/><meta name="description" content="Preview wearables from Decentraland"/><link rel="apple-touch-icon" href="https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2065716845.commit-784645d/logo192.png"/><link rel="manifest" href="https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2065716845.commit-784645d/manifest.json"/><title>Decentraland | Wearable Preview</title><link href="https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2065716845.commit-784645d/static/css/main.bcd9c703.chunk.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div><script>!function(e){function r(r){for(var n,u,a=r[0],i=r[1],c=r[2],f=0,s=[];f<a.length;f++)u=a[f],Object.prototype.hasOwnProperty.call(o,u)&&o[u]&&s.push(o[u][0]),o[u]=0;for(n in i)Object.prototype.hasOwnProperty.call(i,n)&&(e[n]=i[n]);for(p&&p(r);s.length;)s.shift()();return l.push.apply(l,c||[]),t()}function t(){for(var e,r=0;r<l.length;r++){for(var t=l[r],n=!0,a=1;a<t.length;a++){var i=t[a];0!==o[i]&&(n=!1)}n&&(l.splice(r--,1),e=u(u.s=t[0]))}return e}var n={},o={1:0},l=[];function u(r){if(n[r])return n[r].exports;var t=n[r]={i:r,l:!1,exports:{}};return e[r].call(t.exports,t,t.exports,u),t.l=!0,t.exports}u.m=e,u.c=n,u.d=function(e,r,t){u.o(e,r)||Object.defineProperty(e,r,{enumerable:!0,get:t})},u.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},u.t=function(e,r){if(1&r&&(e=u(e)),8&r)return e;if(4&r&&"object"==typeof e&&e&&e.__esModule)return e;var t=Object.create(null);if(u.r(t),Object.defineProperty(t,"default",{enumerable:!0,value:e}),2&r&&"string"!=typeof e)for(var n in e)u.d(t,n,function(r){return e[r]}.bind(null,n));return t},u.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return u.d(r,"a",r),r},u.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},u.p="https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2065716845.commit-784645d/";var a=this["webpackJsonp@dcl/wearable-preview"]=this["webpackJsonp@dcl/wearable-preview"]||[],i=a.push.bind(a);a.push=r,a=a.slice();for(var c=0;c<a.length;c++)r(a[c]);var p=i;t()}([])</script><script src="https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2065716845.commit-784645d/static/js/2.42aa6e2a.chunk.js"></script><script src="https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2065716845.commit-784645d/static/js/main.94f222a2.chunk.js"></script></body></html>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dcl/wearable-preview",
3
- "version": "1.0.0-2059283696.commit-5deed6e",
3
+ "version": "1.0.0-2065716845.commit-784645d",
4
4
  "description": "Static website for the wearable preview",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -9,6 +9,6 @@
9
9
  "keywords": [],
10
10
  "author": "",
11
11
  "license": "Apache-2.0",
12
- "homepage": "https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2059283696.commit-5deed6e",
13
- "commit": "5deed6e38a585e3996ce49056026ca0a0ee030ab"
12
+ "homepage": "https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2065716845.commit-784645d",
13
+ "commit": "784645db810dd3cb1dc34bf7a97a89800037187f"
14
14
  }
@@ -1,2 +1,2 @@
1
- (this["webpackJsonp@dcl/wearable-preview"]=this["webpackJsonp@dcl/wearable-preview"]||[]).push([[0],{281:function(e,t,a){},366:function(e,t,a){},369:function(e,t,a){"use strict";a.r(t);var n=a(55),r=a.n(n),o=a(275),c=a.n(o),i=(a(281),a(59)),s=a(221),u=a.n(s),l=a(27);var f,d=a(61),p=a(276),b=a(33),h=a.n(b),w=a(43),v=a(97);!function(e){e.PROD="prod",e.DEV="dev"}(f||(f={}));var y,m=a(218),g=a(219),O=a(135);function E(e){return j.apply(this,arguments)}function j(){return(j=Object(w.a)(h.a.mark((function e(t){return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt("return",new Promise((function(e){return setTimeout(e,t)})));case 1:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function k(e){return x.apply(this,arguments)}function x(){return x=Object(w.a)(h.a.mark((function e(t){var a,n,r=arguments;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return a=r.length>1&&void 0!==r[1]?r[1]:3,e.prev=1,e.next=4,fetch(t);case 4:if((n=e.sent).ok){e.next=11;break}return e.t0=Error,e.next=9,n.text();case 9:throw e.t1=e.sent,new e.t0(e.t1);case 11:return e.abrupt("return",n.json());case 14:if(e.prev=14,e.t2=e.catch(1),!(a>0)){e.next=22;break}return e.next=19,E(100);case 19:return e.abrupt("return",k(t,a-1));case 22:throw e.t2;case 23:case"end":return e.stop()}}),e,null,[[1,14]])}))),x.apply(this,arguments)}var A,S,W,C,R=(y={},Object(O.a)(y,f.DEV,"https://nft-api.decentraland.io"),Object(O.a)(y,f.PROD,"https://nft-api.decentraland.org"),y),B=function(){function e(){Object(m.a)(this,e)}return Object(g.a)(e,[{key:"fetchItem",value:function(){var e=Object(w.a)(h.a.mark((function e(t,a,n){var r,o;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,k("".concat(R[n],"/v1/items?contractAddress=").concat(t,"&itemId=").concat(a));case 2:if(r=e.sent,0!==(o=r.data).length){e.next=6;break}throw new Error('Item not found for contractAddress="'.concat(t,'" itemId="').concat(a,'"'));case 6:return e.abrupt("return",o[0]);case 7:case"end":return e.stop()}}),e)})));return function(t,a,n){return e.apply(this,arguments)}}()},{key:"fetchNFT",value:function(){var e=Object(w.a)(h.a.mark((function e(t,a,n){var r,o;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,k("".concat(R[n],"/v1/nfts?contractAddress=").concat(t,"&tokenId=").concat(a));case 2:if(r=e.sent,0!==(o=r.data).length){e.next=6;break}throw new Error('NFT not found for contractAddress="'.concat(t,'" tokenId="').concat(a,'"'));case 6:return e.abrupt("return",o[0].nft);case 7:case"end":return e.stop()}}),e)})));return function(t,a,n){return e.apply(this,arguments)}}()}]),e}(),L=new B,I=(A={},Object(O.a)(A,f.DEV,"https://peer.decentraland.zone"),Object(O.a)(A,f.PROD,"https://peer.decentraland.org"),A),T=function(){function e(){Object(m.a)(this,e)}return Object(g.a)(e,[{key:"fetchWearable",value:function(){var e=Object(w.a)(h.a.mark((function e(t,a){var n,r;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,k("".concat(I[a],"/lambdas/collections/wearables?wearableId=").concat(t));case 2:if(n=e.sent,0!==(r=n.wearables).length){e.next=6;break}throw new Error('Wearable not found for urn="'.concat(t,'"'));case 6:return e.abrupt("return",r[0]);case 7:case"end":return e.stop()}}),e)})));return function(t,a){return e.apply(this,arguments)}}()},{key:"fetchProfile",value:function(){var e=Object(w.a)(h.a.mark((function e(t,a){var n;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,k("".concat(I[a],"/lambdas/profiles?id=").concat(t));case 2:return n=e.sent,e.abrupt("return",n.length>0?n[0]:null);case 4:case"end":return e.stop()}}),e)})));return function(t,a){return e.apply(this,arguments)}}()}]),e}(),_=new T,M=a(39);function P(e){return e.startsWith("#")?e:"#"+e}function D(e){return("0"+(255*e|0).toString(16)).slice(-2)}function F(e){return D(e.r)+D(e.g)+D(e.b)}function N(e){var t=function(e){return e.startsWith("#")?e.slice(1):e}(e);return new M.e(parseInt(t.slice(0,2),16)/256,parseInt(t.slice(2,4),16)/256,parseInt(t.slice(4,6),16)/256)}function Y(e,t){return e.bodyShapes.includes(t)}function U(e){return Y(e,l.WearableBodyShape.MALE)}function H(e){return Y(e,l.WearableBodyShape.FEMALE)}function V(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:l.WearableBodyShape.MALE;switch(t){case l.WearableBodyShape.FEMALE:if(!e.data.representations.some(H))throw new Error('Could not find a BaseFemale representation for wearable="'.concat(e.id,'"'));return e.data.representations.find(H);case l.WearableBodyShape.MALE:if(!e.data.representations.some(U))throw new Error('Could not find a BaseMale representation for wearable="'.concat(e.id,'"'));return e.data.representations.find(U)}}function z(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:l.WearableBodyShape.MALE;if(X(e,t))return V(e,t);if(e.data.representations.length>0)return e.data.representations[0];throw new Error('The wearable="'.concat(e.id,'" has no representation'))}function X(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:l.WearableBodyShape.MALE;try{return V(e,t),!0}catch(a){return!1}}function Z(e){var t=e.contents.find((function(t){return t.key===e.mainFile}));if(!t)throw new Error("Could not find main file");return t.url}function G(e){return e.mainFile.endsWith("png")}function K(e,t){return e.find((function(e){return e.data.category===t}))||null}function J(e){switch(e){case l.WearableBodyShape.MALE:case l.WearableBodyShape.FEMALE:return[l.WearableCategory.EYEBROWS,l.WearableCategory.MOUTH,l.WearableCategory.EYES,l.WearableCategory.HAIR,l.WearableCategory.UPPER_BODY,l.WearableCategory.LOWER_BODY,l.WearableCategory.FEET]}}function q(e,t){switch(e){case l.WearableCategory.EYEBROWS:return t===l.WearableBodyShape.MALE?"urn:decentraland:off-chain:base-avatars:eyebrows_00":"urn:decentraland:off-chain:base-avatars:f_eyebrows_00";case l.WearableCategory.MOUTH:return t===l.WearableBodyShape.MALE?"urn:decentraland:off-chain:base-avatars:mouth_00":"urn:decentraland:off-chain:base-avatars:f_mouth_00";case l.WearableCategory.EYES:return t===l.WearableBodyShape.MALE?"urn:decentraland:off-chain:base-avatars:eyes_00":"urn:decentraland:off-chain:base-avatars:f_eyes_00";case l.WearableCategory.HAIR:return t===l.WearableBodyShape.MALE?"urn:decentraland:off-chain:base-avatars:casual_hair_01":"urn:decentraland:off-chain:base-avatars:standard_hair";case l.WearableCategory.UPPER_BODY:return t===l.WearableBodyShape.MALE?"urn:decentraland:off-chain:base-avatars:green_hoodie":"urn:decentraland:off-chain:base-avatars:f_sweater";case l.WearableCategory.LOWER_BODY:return t===l.WearableBodyShape.MALE?"urn:decentraland:off-chain:base-avatars:brown_pants":"urn:decentraland:off-chain:base-avatars:f_jeans";case l.WearableCategory.FEET:return t===l.WearableBodyShape.MALE?"urn:decentraland:off-chain:base-avatars:sneakers":"urn:decentraland:off-chain:base-avatars:bun_shoes";default:throw new Error('There is no default wearable for category="'.concat(e,'"'))}}function Q(e){return!!e}function $(e){var t=[l.WearableBodyShape.MALE,l.WearableBodyShape.FEMALE];return t.find((function(t){return e.data.representations.some((function(e){return e.bodyShapes.includes(t)}))}))||t[0]}function ee(e){return!!e&&"emoteDataV0"in e}function te(e){switch(null===e||void 0===e?void 0:e.data.category){case l.WearableCategory.UPPER_BODY:return 2;case l.WearableCategory.SKIN:return 1.75;default:return 1.25}}!function(e){e.IDLE="idle",e.CLAP="clap",e.DAB="dab",e.DANCE="dance",e.FASHION="fashion",e.FASHION_2="fashion-2",e.FASHION_3="fashion-3",e.FASHION_4="fashion-4",e.LOVE="love",e.MONEY="money"}(S||(S={})),function(e){e.STATIC="static",e.INTERACTIVE="wearable"}(W||(W={})),function(e){e.TEXTURE="texture",e.WEARABLE="wearable",e.AVATAR="avatar"}(C||(C={}));var ae,ne="default";function re(e,t){return oe.apply(this,arguments)}function oe(){return(oe=Object(w.a)(h.a.mark((function e(t,a){return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt("return",_.fetchWearable(t,a).catch((function(e){return console.log('Failed to load wearable="'.concat(t,'"'),e)})));case 1:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function ce(e,t){return ie.apply(this,arguments)}function ie(){return(ie=Object(w.a)(h.a.mark((function e(t,a){return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t!==ne){e.next=2;break}return e.abrupt("return",null);case 2:return e.abrupt("return",_.fetchProfile(t,a).then((function(e){return e&&e.avatars.length>0?e.avatars[0]:null})).catch((function(e){return console.log('Failed to load profile="'.concat(t,'"'),e)})));case 3:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function se(e){return ue.apply(this,arguments)}function ue(){return(ue=Object(w.a)(h.a.mark((function e(t){var a,n,r,o,c,i,s;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(a=t.contractAddress,n=t.itemId,r=t.tokenId,o=t.env,n||r){e.next=3;break}throw new Error("You need to provide an itemId or a tokenId");case 3:if(c=o===f.PROD?"matic":"mumbai",i="urn:decentraland:".concat(c,":collections-v2:").concat(a,":").concat(n),n||r){e.next=9;break}throw new Error("You must provide either tokenId or itemId");case 9:if(n||!r){e.next=14;break}return e.next=12,L.fetchNFT(a,r,o);case 12:s=e.sent,i=s.network!==l.Network.ETHEREUM?"urn:decentraland:".concat(c,":collections-v2:").concat(a,":").concat(s.itemId):s.image.split("contents/")[1].split("/thumbnail")[0];case 14:return e.abrupt("return",re(i,o));case 15:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function le(e,t,a){return fe.apply(this,arguments)}function fe(){return(fe=Object(w.a)(h.a.mark((function e(t,a,n){var r,o,c,i,s,u,l,f,p,b;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Promise.all([a].concat(Object(v.a)(t)).map((function(e){return re(e,n)})));case 2:r=e.sent.filter(Q).filter((function(e){return X(e,a)})),o=!1,c=0;case 5:i=[],s=Object(d.a)(J(a)),e.prev=7,s.s();case 9:if((u=s.n()).done){e.next=22;break}if(l=u.value,K(r,l)){e.next=20;break}if(!(f=q(l,a))){e.next=19;break}p=re(f,n),i.push(p),e.next=20;break;case 19:throw new Error('Could not get default URN for category="'.concat(l,'"'));case 20:e.next=9;break;case 22:e.next=27;break;case 24:e.prev=24,e.t0=e.catch(7),s.e(e.t0);case 27:return e.prev=27,s.f(),e.finish(27);case 30:return e.next=32,Promise.all(i);case 32:b=e.sent,r=[].concat(Object(v.a)(r),Object(v.a)(b.filter(Q))),o=b.every(Q),c++;case 36:if(!o&&c<3){e.next=5;break}case 37:return e.abrupt("return",r);case 38:case"end":return e.stop()}}),e,null,[[7,24,27,30]])})))).apply(this,arguments)}function de(){return pe.apply(this,arguments)}function pe(){return pe=Object(w.a)(h.a.mark((function e(){var t,a,n,r,o,c,s,u,d,p,b,w,y,m,g,O,E,j,k,x,A,R,B,L,I,T,_,M,D=arguments;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=D.length>0&&void 0!==D[0]?D[0]:{},a=t.contractAddress,n=t.tokenId,r=t.itemId,o=t.env||f.PROD,c=Promise.resolve(),a&&(c=se({contractAddress:a,tokenId:n,itemId:r,env:o})),s=t.profile?ce(t.profile,o):Promise.resolve(),e.next=8,Promise.all([c,s]);case 8:if(u=e.sent,d=Object(i.a)(u,2),p=d[0],b=d[1],w=t.bodyShape||b&&b.avatar.bodyShape||(p?$(p):l.WearableBodyShape.MALE),y=P(t.skin||b&&F(b.avatar.skin.color)||"cc9b76"),m=P(t.hair||b&&F(b.avatar.hair.color)||"000000"),g=P(t.eyes||b&&F(b.avatar.eyes.color)||"000000"),O=[].concat(Object(v.a)(b?b.avatar.wearables:[]),Object(v.a)(t.urns||[])),E=[],j=1.75,k=C.WEARABLE,x={gradient:"radial-gradient(#676370, #18141b)"},!(O.length>0||p&&ee(p)||t.profile===ne)){e.next=26;break}return k=C.AVATAR,e.next=25,le(O,w,o);case 25:E=e.sent;case 26:return p&&(j=E.length>0?j:te(p),G(z(p))&&k!==C.AVATAR&&(k=C.TEXTURE),A=l.Rarity.getGradient(p.rarity),R=Object(i.a)(A,2),B=R[0],L=R[1],I="radial-gradient(".concat(B,", ").concat(L,")"),x={image:p.thumbnail,gradient:I}),T=S.IDLE,t.emote&&Object.values(S).includes(t.emote)&&(T=t.emote),_=W.INTERACTIVE,t.camera&&Object.values(W).includes(t.camera)&&(_=t.camera),M="number"!==typeof t.autoRotateSpeed||isNaN(t.autoRotateSpeed)?.2:t.autoRotateSpeed,e.abrupt("return",{wearable:null!==p&&void 0!==p?p:void 0,wearables:E,bodyShape:w,skin:y,hair:m,eyes:g,type:k,background:x,emote:T,camera:_,autoRotateSpeed:M,offsetX:t.offsetX||0,offsetY:t.offsetY||0,offsetZ:t.offsetZ||0,zoom:t.zoom||j});case 33:case"end":return e.stop()}}),e)}))),pe.apply(this,arguments)}function be(e){var t=Object(n.useState)(!1),a=Object(i.a)(t,2),r=a[0],o=a[1],c=Object(n.useState)(null),s=Object(i.a)(c,2),u=s[0],l=s[1],f=Object(n.useState)(""),d=Object(i.a)(f,2),p=d[0],b=d[1];return Object(n.useEffect)((function(){o(!0),e().then((function(e){return l(e)})).catch((function(e){return b(e.message)})).finally((function(){return o(!1)}))}),[]),[u,r,p]}function he(e,t){var a=JSON.stringify({type:e,message:t});window.parent&&window.parent.postMessage(a,"*")}!function(e){e.LOAD="load",e.ERROR="error",e.UPDATE="update"}(ae||(ae={}));a(366);function we(e){return function(t){return t.data.category===e}}function ve(e){return function(t){return t.wearable.data.category===e||(t.wearable.data.hides||[]).includes(e)||(t.wearable.data.replaces||[]).includes(e)}}function ye(e){return!!e}function me(e){return!G(z(e))}function ge(e){return!me(e)}function Oe(e){var t=e.find((function(e){return"body_shape"===e.wearable.data.category}));if(!t)throw new Error("Could not find a bodyShape when trying to hide base body parts");var a,n=e.some((function(e){return e.wearable.data.category===l.WearableCategory.SKIN})),r=n||e.some(ve(l.WearableCategory.UPPER_BODY)),o=n||e.some(ve(l.WearableCategory.LOWER_BODY)),c=n||e.some(ve(l.WearableCategory.FEET)),i=n||e.some(ve("head")),s=Object(d.a)(t.container.meshes);try{for(s.s();!(a=s.n()).done;){var u=a.value,f=u.name.toLowerCase();f.endsWith("ubody_basemesh")&&r&&u.setEnabled(!1),f.endsWith("lbody_basemesh")&&o&&u.setEnabled(!1),f.endsWith("feet_basemesh")&&c&&u.setEnabled(!1),f.endsWith("head")&&i&&u.setEnabled(!1),f.endsWith("head_basemesh")&&i&&u.setEnabled(!1),f.endsWith("mask_eyes")&&i&&u.setEnabled(!1),f.endsWith("mask_eyebrows")&&i&&u.setEnabled(!1),f.endsWith("mask_mouth")&&i&&u.setEnabled(!1)}}catch(p){s.e(p)}finally{s.f()}return t}var Ee=[l.WearableCategory.HAIR,l.WearableCategory.FACIAL_HAIR,l.WearableCategory.MOUTH,l.WearableCategory.EYEBROWS,l.WearableCategory.EYES,l.WearableCategory.UPPER_BODY,l.WearableCategory.LOWER_BODY,l.WearableCategory.FEET];function je(e){var t=new Map,a=e.wearables.filter((function(e){return!ee(e)}));e.wearable&&!ee(e.wearable)&&(a=e.wearables.filter((function(t){if(e.wearable){var a=e.wearable.data,n=a.category,r=a.hides,o=a.replaces;if("skin"===t.data.category){if(Ee.includes(n))return!1;if(r&&r.includes("head"))return!1;if(o&&o.includes("head"))return!1}if(t.data.hides&&t.data.hides.includes(n))return!1;if(t.data.replaces&&t.data.replaces.includes(n))return!1}return!0})),a.push(e.wearable));var n,r=Object(d.a)(a);try{for(r.s();!(n=r.n()).done;){var o=n.value,c=o.data.category;X(o,e.bodyShape)&&t.set(c,o)}}catch(x){r.e(x)}finally{r.f()}var i=!1;a=a.filter((function(e){return t.get(e.data.category)===e})).reverse();var s,u=new Set,f=Object(d.a)(a);try{for(f.s();!(s=f.n()).done;){var p=s.value,b=p.data.category;if(!u.has(b)){for(var h=p.data.replaces||[],w=p.data.hides||[],y=Array.from(new Set([].concat(Object(v.a)(h),Object(v.a)(w)))),m=0,g=y;m<g.length;m++){var O=g[m];O!==b&&(t.delete(O),u.add(O))}p.data.category===l.WearableCategory.SKIN&&(i=!0)}}}catch(x){f.e(x)}finally{f.f()}if(i){var E,j=Object(d.a)(Ee);try{for(j.s();!(E=j.n()).done;){var k=E.value;t.delete(k)}}catch(x){j.e(x)}finally{j.f()}}return t}function ke(e,t){e&&(e.useAutoRotationBehavior=!0,e.autoRotationBehavior&&(e.autoRotationBehavior.idleRotationSpeed=t.autoRotateSpeed))}a(368);function xe(e,t){return Ae.apply(this,arguments)}function Ae(){return(Ae=Object(w.a)(h.a.mark((function e(t,a){var n,r,o,c;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:n=new M.h(t,!0,{preserveDrawingBuffer:!0,stencil:!0}),(r=new M.n(n)).autoClear=!0,r.clearColor=new M.f(0,0,0,0),r.preventDefaultOnPointerDown=!1,new M.i("glow",r,{mainTextureFixedSize:1024,blurKernelSize:64}).intensity=.2,(o=new M.b("camera",0,0,0,new M.s(0,0,0),r)).mode=M.d.PERSPECTIVE_CAMERA,e.t0=a.camera,e.next=e.t0===W.INTERACTIVE?12:e.t0===W.STATIC?23:25;break;case 12:e.t1=a.type,e.next=e.t1===C.WEARABLE?15:e.t1===C.AVATAR?18:20;break;case 15:return ke(o,a),o.position=new M.s(-2,2,2),e.abrupt("break",21);case 18:return o.position=new M.s(0,1,3.5),e.abrupt("break",21);case 20:console.warn('Unexpected preview.type="'.concat(a.type,'"'));case 21:return o.attachControl(t,!0),e.abrupt("break",25);case 23:return o.position=new M.s(0,1,3.5),e.abrupt("break",25);case 25:return c=new M.s(a.offsetX,a.offsetY,a.offsetZ),o.position.addInPlace(c),o.setTarget(c),o.lowerRadiusLimit=o.upperRadiusLimit=o.radius/a.zoom,new M.g("directional",new M.s(0,0,1),r).intensity=1,new M.j("top",new M.s(0,-1,0),r).intensity=1,new M.j("bottom",new M.s(0,1,0),r).intensity=1,new M.p("spot",new M.s(-2,2,2),new M.s(2,-2,-2),Math.PI/2,1e3,r).intensity=1,n.runRenderLoop((function(){return r.render()})),e.abrupt("return",r);case 39:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function Se(e,t,a){return We.apply(this,arguments)}function We(){return(We=Object(w.a)(h.a.mark((function e(t,a,n){var r,o,c;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(r=a.id,o=V(a,n),!(c=o.contents.find((function(e){return e.key.toLowerCase().endsWith("_mask.png")})))){e.next=5;break}return e.abrupt("return",new Promise((function(e,a){var n=new M.r(r,c.url,!0,!1);n.onError=function(){return a(n.errorObject)},n.onSuccess=function(){e(n.texture)},n.run(t,(function(){return e(n.texture)}),a)})));case 5:return e.abrupt("return",null);case 6:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function Ce(e,t,a){return Re.apply(this,arguments)}function Re(){return(Re=Object(w.a)(h.a.mark((function e(t,a,n){var r,o,c;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(r=a.id,o=V(a,n),!(c=o.contents.find((function(e){return e.key.toLowerCase().endsWith(".png")&&!e.key.toLowerCase().endsWith("_mask.png")})))){e.next=5;break}return e.abrupt("return",new Promise((function(e,a){var n=new M.r(r,c.url,!0,!1);n.onError=function(){return a(n.errorObject)},n.onSuccess=function(){e(n.texture)},n.run(t,(function(){return e(n.texture)}),a)})));case 5:return e.abrupt("return",null);case 6:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function Be(e,t){return Le.apply(this,arguments)}function Le(){return Le=Object(w.a)(h.a.mark((function e(t,a){var n;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=function(){var e=Object(w.a)(h.a.mark((function e(a,n){return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt("return",M.o.LoadAssetContainerAsync(a,"",t,null,n));case 1:case"end":return e.stop()}}),e)})));return function(t,a){return e.apply(this,arguments)}}(),e.prev=1,e.next=4,n(a,".glb");case 4:case 11:return e.abrupt("return",e.sent);case 7:return e.prev=7,e.t0=e.catch(1),e.next=11,n(a,".gltf");case 12:case"end":return e.stop()}}),e,null,[[1,7]])}))),Le.apply(this,arguments)}var Ie=["hair_mat"],Te=["avatarskin_mat","skin-f"];function _e(e,t){return Me.apply(this,arguments)}function Me(){return Me=Object(w.a)(h.a.mark((function e(t,a){var n,r,o,c,i,s,u,f,p,b,w,v,y=arguments;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n=y.length>2&&void 0!==y[2]?y[2]:l.WearableBodyShape.MALE,r=y.length>3?y[3]:void 0,o=y.length>4?y[4]:void 0,!G(c=V(a,n))){e.next=6;break}throw new Error('The wearable="'.concat(a.id,'" is a texture'));case 6:return i=Z(c),e.next=9,Be(t,i);case 9:s=e.sent,u=Object(d.a)(s.materials);try{for(p=function(){var e=f.value;Ie.some((function(t){return e.name.toLowerCase().includes(t)}))&&(o?e.albedoColor=M.e.FromHexString(o):(e.alpha=0,t.removeMaterial(e)));Te.some((function(t){return e.name.toLowerCase().includes(t)}))&&(r?e.albedoColor=M.e.FromHexString(r):(e.alpha=0,t.removeMaterial(e)))},u.s();!(f=u.n()).done;)p()}catch(h){u.e(h)}finally{u.f()}b=Object(d.a)(s.animationGroups);try{for(b.s();!(w=b.n()).done;)(v=w.value).stop(),v.reset(),v.dispose()}catch(h){b.e(h)}finally{b.f()}return e.abrupt("return",{container:s,wearable:a});case 15:case"end":return e.stop()}}),e)}))),Me.apply(this,arguments)}function Pe(e){var t,a=new M.k("parent",e),n=Object(d.a)(e.meshes);try{for(n.s();!(t=n.n()).done;){var r=t.value;r!==a&&r.setParent(a)}}catch(s){n.e(s)}finally{n.f()}!function(e){var t=e.getChildren().filter((function(e){return"__root__"!==e.id}));if(t.length>0){for(var a=t[0],n=a.getBoundingInfo(),r=n.boundingBox.minimumWorld.add(a.position),o=n.boundingBox.maximumWorld.add(a.position),c=1;c<t.length;c++){var i=t[c],s=(n=i.getBoundingInfo()).boundingBox.minimumWorld.add(i.position),u=n.boundingBox.maximumWorld.add(i.position);r=M.s.Minimize(r,s),o=M.s.Maximize(o,u)}e.setBoundingInfo(new M.c(r,o))}}(a);var o=a.getBoundingInfo().boundingBox.extendSize.length(),c=new M.s(1/o,1/o,1/o);a.scaling=c;var i=a.getBoundingInfo().boundingBox.center.multiply(c);a.position.subtractInPlace(i)}var De=[S.IDLE,S.MONEY,S.CLAP];function Fe(e){return De.includes(e)}var Ne={};function Ye(e){var t="https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2059283696.commit-5deed6e";t.endsWith("/")||(t+="/");var a="./emotes/".concat(e,".glb");return t.startsWith("http")?new URL(a,t).href:a}function Ue(e,t){return He.apply(this,arguments)}function He(){return(He=Object(w.a)(h.a.mark((function e(t,a){var n;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n=Ne[a]){e.next=8;break}return e.next=4,Be(t,a);case 4:if(0!==(n=e.sent).animationGroups.length){e.next=7;break}throw new Error("No animation groups found for emote with url=".concat(a));case 7:Ne[a]=n;case 8:return e.abrupt("return",n);case 9:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function Ve(e,t,a){return ze.apply(this,arguments)}function ze(){return(ze=Object(w.a)(h.a.mark((function e(t,a,n){var r,o;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(r=V(a,n.bodyShape),o=r.contents.find((function(e){return e.key===r.mainFile}))){e.next=4;break}throw new Error("Could not find a valid content in representation for wearable=".concat(a.id," and bodyShape=").concat(n.bodyShape));case 4:return e.abrupt("return",Ue(t,o.url));case 5:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function Xe(e,t,a){return Ze.apply(this,arguments)}function Ze(){return Ze=Object(w.a)(h.a.mark((function e(t,a,n){var r,o,c,i,s,u,l,f,p,b,v,y,m,g,O,E,j,k,x,A;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(u=function(){return(u=Object(w.a)(h.a.mark((function e(){return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:n.camera!==W.STATIC&&ke(t.cameras[0],n),o&&Xe(t,a,n);case 2:case"end":return e.stop()}}),e)})))).apply(this,arguments)},s=function(){return u.apply(this,arguments)},o=Fe(n.emote),!n.wearable||!ee(n.wearable)){e.next=14;break}return e.prev=4,e.next=7,Ve(t,n.wearable,n);case 7:r=e.sent,(null===(c=n.wearable.emoteDataV0)||void 0===c?void 0:c.loop)&&(o=!0),e.next=14;break;case 11:e.prev=11,e.t0=e.catch(4),console.warn("Could not load emote=".concat(n.wearable.id));case 14:if(r){e.next=19;break}return i=Ye(n.emote),e.next=18,Ue(t,i);case 18:r=e.sent;case 19:try{l=new M.a("emote",t),f=Object(d.a)(a);try{for(f.s();!(p=f.n()).done;){b=p.value,v=b.container.transformNodes.reduce((function(e,t){var a=e.get(t.id)||[];return a.push(t),e.set(t.id,a)}),new Map),y=Object(d.a)(r.animationGroups[0].targetedAnimations);try{for(y.s();!(m=y.n()).done;)if(g=m.value,O=g.animation,E=g.target,(j=v.get(E.id))&&j.length>0){k=Object(d.a)(j);try{for(k.s();!(x=k.n()).done;)A=x.value,l.addTargetedAnimation(O,A)}catch(S){k.e(S)}finally{k.f()}}}catch(S){y.e(S)}finally{y.f()}}}catch(S){f.e(S)}finally{f.f()}l.play(),l.onAnimationEndObservable.addOnce(s)}catch(C){console.warn("Could not play emote=".concat(n.emote),C)}case 20:case"end":return e.stop()}}),e,null,[[4,11]])}))),Ze.apply(this,arguments)}function Ge(e,t,a){return function(){var n=Object(w.a)(h.a.mark((function n(r){var o;return h.a.wrap((function(n){for(;;)switch(n.prev=n.next){case 0:if(!(o=t.find(we(r)))){n.next=3;break}return n.abrupt("return",Promise.all([Ce(e,o,a),Se(e,o,a)]));case 3:return n.abrupt("return",[null,null]);case 4:case"end":return n.stop()}}),n)})));return function(e){return n.apply(this,arguments)}}()}function Ke(e,t,a){return Je.apply(this,arguments)}function Je(){return(Je=Object(w.a)(h.a.mark((function e(t,a,n){var r,o,c,s,u,f;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=Ge(t,a,n),e.next=3,Promise.all([r(l.WearableCategory.EYES),r(l.WearableCategory.EYEBROWS),r(l.WearableCategory.MOUTH)]);case 3:return o=e.sent,c=Object(i.a)(o,3),s=c[0],u=c[1],f=c[2],e.abrupt("return",{eyes:s,eyebrows:u,mouth:f});case 9:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function qe(e,t,a,n,r,o){return Qe.apply(this,arguments)}function Qe(){return(Qe=Object(w.a)(h.a.mark((function e(t,a,n,r,o,c){var s,u,l,f,p,b,w,v,y,m,g,O;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:s=Object(d.a)(a.container.meshes);try{for(s.s();!(u=s.n()).done;)(l=u.value).name.toLowerCase().endsWith("mask_eyes")&&(f=Object(i.a)(n,2),p=f[0],b=f[1],p&&$e(t,"eyes",l,p,c.eyes,b,"#ffffff")),l.name.toLowerCase().endsWith("mask_eyebrows")&&(w=Object(i.a)(r,2),v=w[0],y=w[1],v&&$e(t,"eyebrows",l,v,c.hair,y,c.hair)),l.name.toLowerCase().endsWith("mask_mouth")&&(m=Object(i.a)(o,2),g=m[0],O=m[1],g&&$e(t,"mouth",l,g,c.skin,O,c.skin))}catch(h){s.e(h)}finally{s.f()}case 2:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function $e(e,t,a,n,r,o,c){var i=new M.q("".concat(t,"_standard_material"),e);i.alphaMode=M.m.PBRMATERIAL_ALPHABLEND,i.backFaceCulling=!0,n.hasAlpha=!0,i.sideOrientation=M.l.CW,i.diffuseTexture=n,i.diffuseColor=o?M.e.Black():N(c),o&&(i.emissiveTexture=o,i.emissiveColor=N(r)),a.material=i}function et(e){var t=function(e){var t,a=arguments.length>1&&void 0!==arguments[1]?arguments[1]:l.WearableBodyShape.MALE,n={},r=Object(d.a)(e);try{for(r.s();!(t=r.n()).done;){var o=t.value;try{var c,i=V(o,a),s=Object(d.a)(i.contents);try{for(s.s();!(c=s.n()).done;){var u=c.value;n[u.key]=u.url}}catch(f){s.e(f)}finally{s.f()}}catch(p){console.warn('Skipping generation of mappings for wearable="'.concat(o.id,'" since it lacks a representation for bodyShape="').concat(a,'"'));continue}}}catch(f){r.e(f)}finally{r.f()}return n}(e.wearable?[e.wearable].concat(Object(v.a)(e.wearables)):e.wearables,e.bodyShape);M.o.OnPluginActivatedObservable.add((function(e){"gltf"===e.name&&(e.preprocessUrlAsync=function(){var e=Object(w.a)(h.a.mark((function e(a){var n;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return"/content/contents/",n=a.split("/content/contents/"),e.abrupt("return",n.length>0&&n[1]?t[n[1]]:a);case 3:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}())}))}function tt(){return(tt=Object(w.a)(h.a.mark((function e(t,a){var n,r,o,c,i,s,u,f,p,b,w,v,y,m,g,O,E,j;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,xe(t,a);case 2:if(n=e.sent,et(a),r=[],a.type!==C.AVATAR){e.next=28;break}o=je(a),c=Array.from(o.values()),i=Object(d.a)(c.filter(me));try{for(i.s();!(s=i.n()).done;)u=s.value,f=_e(n,u,a.bodyShape,a.skin,a.hair).catch((function(e){console.warn(e.message)})),r.push(f)}catch(h){i.e(h)}finally{i.f()}return e.next=12,Promise.all(r);case 12:p=e.sent.filter(ye),b=Object(d.a)(p);try{for(b.s();!(w=b.n()).done;)w.value.container.addAllToScene()}catch(h){b.e(h)}finally{b.f()}return v=Oe(p),y=c.filter(ge),e.next=19,Ke(n,y,a.bodyShape);case 19:return m=e.sent,g=m.eyes,O=m.eyebrows,E=m.mouth,qe(n,v,g,O,E,a),e.next=26,Xe(n,p,a);case 26:e.next=44;break;case 28:if(a.wearable){e.next=30;break}throw new Error("No wearable to render");case 30:return j=a.wearable,e.prev=31,e.next=34,_e(n,j,a.bodyShape,a.skin,a.hair);case 34:e.sent.container.addAllToScene(),e.next=44;break;case 38:return e.prev=38,e.t0=e.catch(31),e.next=42,_e(n,j,a.bodyShape===l.WearableBodyShape.MALE?l.WearableBodyShape.FEMALE:l.WearableBodyShape.MALE,a.skin,a.hair);case 42:e.sent.container.addAllToScene();case 44:Pe(n);case 45:case"end":return e.stop()}}),e,null,[[31,38]])})))).apply(this,arguments)}var at=a(123),nt=function(){var e=Object(n.useState)(""),t=Object(i.a)(e,2),a=t[0],r=t[1],o=function(){var e=Object(n.useState)({width:void 0,height:void 0}),t=Object(i.a)(e,2),a=t[0],r=t[1];return Object(n.useEffect)((function(){function e(){r({width:window.innerWidth,height:window.innerHeight})}return window.addEventListener("resize",e),e(),function(){return window.removeEventListener("resize",e)}}),[]),a}(),c=o.width,s=o.height,b=Object(n.useState)({}),v=Object(i.a)(b,2),y=v[0],m=v[1],g=Object(n.useState)(!1),O=Object(i.a)(g,2),E=O[0],j=O[1],k=Object(n.useState)(!0),x=Object(i.a)(k,2),A=x[0],S=x[1],R=Object(n.useState)(!1),B=Object(i.a)(R,2),L=B[0],I=B[1],T=Object(n.useRef)(null),_=new URLSearchParams(window.location.search),M=_.get("contract"),P=_.get("token"),D=_.get("item"),F=_.get("skin"),N=_.get("hair"),Y=_.get("eyes"),U=_.get("emote"),H=_.get("camera"),V=_.has("transparentBackground"),z=_.get("autoRotateSpeed"),X=z?parseFloat(z):null,Z=_.get("offsetX"),G=Z?parseFloat(Z):null,K=_.get("offsetY"),J=K?parseFloat(K):null,q=_.get("offsetZ"),Q=q?parseFloat(q):null,$=function(e){var t=e?parseFloat(e):null;return null===t||isNaN(t)?null:1.8*Math.min(Math.max(t,0),100)/100+1}(_.get("zoom")),ee=_.get("bodyShape")||_.get("shape"),te="female"===ee?l.WearableBodyShape.FEMALE:"male"===ee?l.WearableBodyShape.MALE:null,ne=_.getAll("urn"),re=_.get("profile"),oe=Object.values(f).reduce((function(e,t){return t===_.get("env")?t:e}),f.PROD),ce=Object(n.useState)({}),ie=Object(i.a)(ce,2),se=ie[0],ue=ie[1],le=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},a=be(Object(w.a)(h.a.mark((function t(){return h.a.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.abrupt("return",de(e));case 1:case"end":return t.stop()}}),t)})))),r=Object(i.a)(a,3),o=r[0],c=r[1],s=r[2];return[Object(n.useMemo)((function(){var e=Object.keys(t).filter((function(e){return"undefined"!==typeof t[e]&&null!==t[e]}));if(o&&e.length>0){var a,n=Object(p.a)({},o),r=Object(d.a)(e);try{for(r.s();!(a=r.n()).done;){var c=a.value,i=t[c];i&&(n[c]=i)}}catch(s){r.e(s)}finally{r.f()}return n}return o}),[o,t]),c,s]}({contractAddress:M,tokenId:P,itemId:D,bodyShape:te,urns:ne,env:oe,profile:re,skin:F,hair:N,eyes:Y,zoom:$,emote:U,camera:H,autoRotateSpeed:X,offsetX:G,offsetY:J,offsetZ:Q},se),fe=Object(i.a)(le,3),pe=fe[0],we=fe[1],ve=fe[2],ye=Object(n.useState)(""),me=Object(i.a)(ye,2),ge=me[0],Oe=me[1],Ee=Object(n.useState)(!0),je=Object(i.a)(Ee,2),ke=je[0],xe=je[1],Ae=Object(n.useState)(!1),Se=Object(i.a)(Ae,2),We=Se[0],Ce=Se[1],Re=a||ve,Be=(A||we)&&!Re,Le=!!ge&&!ke&&!Be,Ie=ke&&!Be;return Object(n.useEffect)((function(){T.current&&pe&&(m({backgroundImage:V?void 0:pe.background.gradient,opacity:1}),pe.background.image&&Oe(pe.background.image),pe.type===C.TEXTURE?(xe(!1),S(!1),I(!0)):function(e,t){return tt.apply(this,arguments)}(T.current,pe).catch((function(e){return r(e.message)})).finally((function(){S(!1),I(!0)})))}),[T.current,pe]),Object(n.useEffect)((function(){We||(L?(he(ae.LOAD),Ce(!0)):Re&&(he(ae.ERROR,Re),Ce(!0)))}),[L,Re,We]),Object(n.useEffect)((function(){var e=window.onmessage;return window.onmessage=function(e){if(e.data&&e.data.type===ae.UPDATE){var t=e.data;t.options&&"object"===typeof t.options&&ue(t.options)}},function(){window.onmessage=e}}),[]),Object(at.jsxs)("div",{className:u()("Preview",{"is-dragging":E,"is-loading":Be,"is-loaded":L,"is-3d":ke&&(null===pe||void 0===pe?void 0:pe.camera)===W.INTERACTIVE,"has-error":!!Re}),style:y,children:[Object(at.jsx)("img",{src:ge,className:u()("thumbnail",{"is-visible":Le}),alt:"preview"}),Object(at.jsx)("canvas",{id:"wearable-preview",className:u()({"is-visible":Ie}),width:c,height:s,ref:T,onMouseDown:function(){return j(ke&&!Re)},onMouseUp:function(){return j(!1)}}),Re&&Object(at.jsx)("div",{className:"error",children:Re})]})},rt=r.a.memo(nt);c.a.render(Object(at.jsx)(r.a.StrictMode,{children:Object(at.jsx)(rt,{})}),document.getElementById("root"))}},[[369,1,2]]]);
2
- //# sourceMappingURL=main.3db9196c.chunk.js.map
1
+ (this["webpackJsonp@dcl/wearable-preview"]=this["webpackJsonp@dcl/wearable-preview"]||[]).push([[0],{281:function(e,t,a){},366:function(e,t,a){},369:function(e,t,a){"use strict";a.r(t);var n=a(55),r=a.n(n),o=a(275),c=a.n(o),i=(a(281),a(59)),s=a(221),u=a.n(s),l=a(27);var f,d=a(61),p=a(276),b=a(33),h=a.n(b),v=a(43),w=a(97);!function(e){e.PROD="prod",e.DEV="dev"}(f||(f={}));var y,m=a(218),g=a(219),O=a(135);function E(e){return j.apply(this,arguments)}function j(){return(j=Object(v.a)(h.a.mark((function e(t){return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt("return",new Promise((function(e){return setTimeout(e,t)})));case 1:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function k(e){return x.apply(this,arguments)}function x(){return x=Object(v.a)(h.a.mark((function e(t){var a,n,r=arguments;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return a=r.length>1&&void 0!==r[1]?r[1]:3,e.prev=1,e.next=4,fetch(t);case 4:if((n=e.sent).ok){e.next=11;break}return e.t0=Error,e.next=9,n.text();case 9:throw e.t1=e.sent,new e.t0(e.t1);case 11:return e.abrupt("return",n.json());case 14:if(e.prev=14,e.t2=e.catch(1),!(a>0)){e.next=22;break}return e.next=19,E(100);case 19:return e.abrupt("return",k(t,a-1));case 22:throw e.t2;case 23:case"end":return e.stop()}}),e,null,[[1,14]])}))),x.apply(this,arguments)}var A,S,W,C,R=(y={},Object(O.a)(y,f.DEV,"https://nft-api.decentraland.io"),Object(O.a)(y,f.PROD,"https://nft-api.decentraland.org"),y),B=function(){function e(){Object(m.a)(this,e)}return Object(g.a)(e,[{key:"fetchItem",value:function(){var e=Object(v.a)(h.a.mark((function e(t,a,n){var r,o;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,k("".concat(R[n],"/v1/items?contractAddress=").concat(t,"&itemId=").concat(a));case 2:if(r=e.sent,0!==(o=r.data).length){e.next=6;break}throw new Error('Item not found for contractAddress="'.concat(t,'" itemId="').concat(a,'"'));case 6:return e.abrupt("return",o[0]);case 7:case"end":return e.stop()}}),e)})));return function(t,a,n){return e.apply(this,arguments)}}()},{key:"fetchNFT",value:function(){var e=Object(v.a)(h.a.mark((function e(t,a,n){var r,o;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,k("".concat(R[n],"/v1/nfts?contractAddress=").concat(t,"&tokenId=").concat(a));case 2:if(r=e.sent,0!==(o=r.data).length){e.next=6;break}throw new Error('NFT not found for contractAddress="'.concat(t,'" tokenId="').concat(a,'"'));case 6:return e.abrupt("return",o[0].nft);case 7:case"end":return e.stop()}}),e)})));return function(t,a,n){return e.apply(this,arguments)}}()}]),e}(),L=new B,I=(A={},Object(O.a)(A,f.DEV,"https://peer.decentraland.zone"),Object(O.a)(A,f.PROD,"https://peer.decentraland.org"),A),_=function(){function e(){Object(m.a)(this,e)}return Object(g.a)(e,[{key:"fetchWearable",value:function(){var e=Object(v.a)(h.a.mark((function e(t,a){var n,r;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,k("".concat(I[a],"/lambdas/collections/wearables?wearableId=").concat(t));case 2:if(n=e.sent,0!==(r=n.wearables).length){e.next=6;break}throw new Error('Wearable not found for urn="'.concat(t,'"'));case 6:return e.abrupt("return",r[0]);case 7:case"end":return e.stop()}}),e)})));return function(t,a){return e.apply(this,arguments)}}()},{key:"fetchProfile",value:function(){var e=Object(v.a)(h.a.mark((function e(t,a){var n;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,k("".concat(I[a],"/lambdas/profiles?id=").concat(t));case 2:return n=e.sent,e.abrupt("return",n.length>0?n[0]:null);case 4:case"end":return e.stop()}}),e)})));return function(t,a){return e.apply(this,arguments)}}()}]),e}(),T=new _,M=a(39);function P(e){return e.startsWith("#")?e:"#"+e}function D(e){return("0"+(255*e|0).toString(16)).slice(-2)}function F(e){return D(e.r)+D(e.g)+D(e.b)}function N(e){var t=function(e){return e.startsWith("#")?e.slice(1):e}(e);return new M.e(parseInt(t.slice(0,2),16)/256,parseInt(t.slice(2,4),16)/256,parseInt(t.slice(4,6),16)/256)}function Y(e,t){return e.bodyShapes.includes(t)}function U(e){return Y(e,l.WearableBodyShape.MALE)}function H(e){return Y(e,l.WearableBodyShape.FEMALE)}function V(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:l.WearableBodyShape.MALE;switch(t){case l.WearableBodyShape.FEMALE:if(!e.data.representations.some(H))throw new Error('Could not find a BaseFemale representation for wearable="'.concat(e.id,'"'));return e.data.representations.find(H);case l.WearableBodyShape.MALE:if(!e.data.representations.some(U))throw new Error('Could not find a BaseMale representation for wearable="'.concat(e.id,'"'));return e.data.representations.find(U)}}function z(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:l.WearableBodyShape.MALE;if(X(e,t))return V(e,t);if(e.data.representations.length>0)return e.data.representations[0];throw new Error('The wearable="'.concat(e.id,'" has no representation'))}function X(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:l.WearableBodyShape.MALE;try{return V(e,t),!0}catch(a){return!1}}function Z(e){var t=e.contents.find((function(t){return t.key===e.mainFile}));if(!t)throw new Error("Could not find main file");return t.url}function G(e){return e.mainFile.endsWith("png")}function K(e,t){return e.find((function(e){return e.data.category===t}))||null}function J(e){switch(e){case l.WearableBodyShape.MALE:case l.WearableBodyShape.FEMALE:return[l.WearableCategory.EYEBROWS,l.WearableCategory.MOUTH,l.WearableCategory.EYES,l.WearableCategory.HAIR,l.WearableCategory.UPPER_BODY,l.WearableCategory.LOWER_BODY,l.WearableCategory.FEET]}}function q(e,t){switch(e){case l.WearableCategory.EYEBROWS:return t===l.WearableBodyShape.MALE?"urn:decentraland:off-chain:base-avatars:eyebrows_00":"urn:decentraland:off-chain:base-avatars:f_eyebrows_00";case l.WearableCategory.MOUTH:return t===l.WearableBodyShape.MALE?"urn:decentraland:off-chain:base-avatars:mouth_00":"urn:decentraland:off-chain:base-avatars:f_mouth_00";case l.WearableCategory.EYES:return t===l.WearableBodyShape.MALE?"urn:decentraland:off-chain:base-avatars:eyes_00":"urn:decentraland:off-chain:base-avatars:f_eyes_00";case l.WearableCategory.HAIR:return t===l.WearableBodyShape.MALE?"urn:decentraland:off-chain:base-avatars:casual_hair_01":"urn:decentraland:off-chain:base-avatars:standard_hair";case l.WearableCategory.UPPER_BODY:return t===l.WearableBodyShape.MALE?"urn:decentraland:off-chain:base-avatars:green_hoodie":"urn:decentraland:off-chain:base-avatars:f_sweater";case l.WearableCategory.LOWER_BODY:return t===l.WearableBodyShape.MALE?"urn:decentraland:off-chain:base-avatars:brown_pants":"urn:decentraland:off-chain:base-avatars:f_jeans";case l.WearableCategory.FEET:return t===l.WearableBodyShape.MALE?"urn:decentraland:off-chain:base-avatars:sneakers":"urn:decentraland:off-chain:base-avatars:bun_shoes";default:throw new Error('There is no default wearable for category="'.concat(e,'"'))}}function Q(e){return!!e}function $(e){var t=[l.WearableBodyShape.MALE,l.WearableBodyShape.FEMALE];return t.find((function(t){return e.data.representations.some((function(e){return e.bodyShapes.includes(t)}))}))||t[0]}function ee(e){return!!e&&"emoteDataV0"in e}function te(e){switch(null===e||void 0===e?void 0:e.data.category){case l.WearableCategory.UPPER_BODY:return 2;case l.WearableCategory.SKIN:return 1.75;default:return 1.25}}!function(e){e.IDLE="idle",e.CLAP="clap",e.DAB="dab",e.DANCE="dance",e.FASHION="fashion",e.FASHION_2="fashion-2",e.FASHION_3="fashion-3",e.FASHION_4="fashion-4",e.LOVE="love",e.MONEY="money"}(S||(S={})),function(e){e.STATIC="static",e.INTERACTIVE="wearable"}(W||(W={})),function(e){e.TEXTURE="texture",e.WEARABLE="wearable",e.AVATAR="avatar"}(C||(C={}));var ae,ne="default";function re(e,t){return oe.apply(this,arguments)}function oe(){return(oe=Object(v.a)(h.a.mark((function e(t,a){return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt("return",T.fetchWearable(t,a).catch((function(e){return console.log('Failed to load wearable="'.concat(t,'"'),e)})));case 1:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function ce(e,t){return ie.apply(this,arguments)}function ie(){return(ie=Object(v.a)(h.a.mark((function e(t,a){return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t!==ne){e.next=2;break}return e.abrupt("return",null);case 2:return e.abrupt("return",T.fetchProfile(t,a).then((function(e){return e&&e.avatars.length>0?e.avatars[0]:null})).catch((function(e){return console.log('Failed to load profile="'.concat(t,'"'),e)})));case 3:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function se(e){return ue.apply(this,arguments)}function ue(){return(ue=Object(v.a)(h.a.mark((function e(t){var a,n,r,o,c,i,s;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(a=t.contractAddress,n=t.itemId,r=t.tokenId,o=t.env,n||r){e.next=3;break}throw new Error("You need to provide an itemId or a tokenId");case 3:if(c=o===f.PROD?"matic":"mumbai",i="urn:decentraland:".concat(c,":collections-v2:").concat(a,":").concat(n),n||r){e.next=9;break}throw new Error("You must provide either tokenId or itemId");case 9:if(n||!r){e.next=14;break}return e.next=12,L.fetchNFT(a,r,o);case 12:s=e.sent,i=s.network!==l.Network.ETHEREUM?"urn:decentraland:".concat(c,":collections-v2:").concat(a,":").concat(s.itemId):s.image.split("contents/")[1].split("/thumbnail")[0];case 14:return e.abrupt("return",re(i,o));case 15:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function le(e,t,a){return fe.apply(this,arguments)}function fe(){return(fe=Object(v.a)(h.a.mark((function e(t,a,n){var r,o,c,i,s,u,l,f,p,b;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Promise.all([a].concat(Object(w.a)(t)).map((function(e){return re(e,n)})));case 2:r=e.sent.filter(Q).filter((function(e){return X(e,a)})),o=!1,c=0;case 5:i=[],s=Object(d.a)(J(a)),e.prev=7,s.s();case 9:if((u=s.n()).done){e.next=22;break}if(l=u.value,K(r,l)){e.next=20;break}if(!(f=q(l,a))){e.next=19;break}p=re(f,n),i.push(p),e.next=20;break;case 19:throw new Error('Could not get default URN for category="'.concat(l,'"'));case 20:e.next=9;break;case 22:e.next=27;break;case 24:e.prev=24,e.t0=e.catch(7),s.e(e.t0);case 27:return e.prev=27,s.f(),e.finish(27);case 30:return e.next=32,Promise.all(i);case 32:b=e.sent,r=[].concat(Object(w.a)(r),Object(w.a)(b.filter(Q))),o=b.every(Q),c++;case 36:if(!o&&c<3){e.next=5;break}case 37:return e.abrupt("return",r);case 38:case"end":return e.stop()}}),e,null,[[7,24,27,30]])})))).apply(this,arguments)}function de(){return pe.apply(this,arguments)}function pe(){return pe=Object(v.a)(h.a.mark((function e(){var t,a,n,r,o,c,s,u,d,p,b,v,y,m,g,O,E,j,k,x,A,R,B,L,I,_,T,M,D=arguments;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=D.length>0&&void 0!==D[0]?D[0]:{},a=t.contractAddress,n=t.tokenId,r=t.itemId,o=t.env||f.PROD,c=Promise.resolve(),a&&(c=se({contractAddress:a,tokenId:n,itemId:r,env:o})),s=t.profile?ce(t.profile,o):Promise.resolve(),e.next=8,Promise.all([c,s]);case 8:if(u=e.sent,d=Object(i.a)(u,2),p=d[0],b=d[1],v=t.bodyShape||b&&b.avatar.bodyShape||(p?$(p):l.WearableBodyShape.MALE),y=P(t.skin||b&&F(b.avatar.skin.color)||"cc9b76"),m=P(t.hair||b&&F(b.avatar.hair.color)||"000000"),g=P(t.eyes||b&&F(b.avatar.eyes.color)||"000000"),O=[].concat(Object(w.a)(b?b.avatar.wearables:[]),Object(w.a)(t.urns||[])),E=[],j=1.75,k=C.WEARABLE,x={gradient:"radial-gradient(#676370, #18141b)"},!(O.length>0||p&&ee(p)||t.profile===ne)){e.next=26;break}return k=C.AVATAR,e.next=25,le(O,v,o);case 25:E=e.sent;case 26:return p&&(j=E.length>0?j:te(p),G(z(p))&&k!==C.AVATAR&&(k=C.TEXTURE),A=l.Rarity.getGradient(p.rarity),R=Object(i.a)(A,2),B=R[0],L=R[1],I="radial-gradient(".concat(B,", ").concat(L,")"),x={image:p.thumbnail,gradient:I}),_=S.IDLE,t.emote&&Object.values(S).includes(t.emote)&&(_=t.emote),T=W.INTERACTIVE,t.camera&&Object.values(W).includes(t.camera)&&(T=t.camera),M="number"!==typeof t.autoRotateSpeed||isNaN(t.autoRotateSpeed)?.2:t.autoRotateSpeed,e.abrupt("return",{wearable:null!==p&&void 0!==p?p:void 0,wearables:E,bodyShape:v,skin:y,hair:m,eyes:g,type:k,background:x,emote:_,camera:T,autoRotateSpeed:M,offsetX:t.offsetX||0,offsetY:t.offsetY||0,offsetZ:t.offsetZ||0,zoom:t.zoom||j});case 33:case"end":return e.stop()}}),e)}))),pe.apply(this,arguments)}function be(e){var t=Object(n.useState)(!1),a=Object(i.a)(t,2),r=a[0],o=a[1],c=Object(n.useState)(null),s=Object(i.a)(c,2),u=s[0],l=s[1],f=Object(n.useState)(""),d=Object(i.a)(f,2),p=d[0],b=d[1];return Object(n.useEffect)((function(){o(!0),e().then((function(e){return l(e)})).catch((function(e){return b(e.message)})).finally((function(){return o(!1)}))}),[]),[u,r,p]}function he(e,t){var a=JSON.stringify({type:e,message:t});window.parent&&window.parent.postMessage(a,"*")}!function(e){e.LOAD="load",e.ERROR="error",e.UPDATE="update"}(ae||(ae={}));a(366);function ve(e){return function(t){return t.data.category===e}}function we(e){return function(t){return t.wearable.data.category===e||(t.wearable.data.hides||[]).includes(e)||(t.wearable.data.replaces||[]).includes(e)}}function ye(e){return!!e}function me(e){return!G(z(e))}function ge(e){return!me(e)}function Oe(e){var t=e.find((function(e){return"body_shape"===e.wearable.data.category}));if(!t)throw new Error("Could not find a bodyShape when trying to hide base body parts");var a,n=e.some((function(e){return e.wearable.data.category===l.WearableCategory.SKIN})),r=n||e.some(we(l.WearableCategory.UPPER_BODY)),o=n||e.some(we(l.WearableCategory.LOWER_BODY)),c=n||e.some(we(l.WearableCategory.FEET)),i=n||e.some(we("head")),s=Object(d.a)(t.container.meshes);try{for(s.s();!(a=s.n()).done;){var u=a.value,f=u.name.toLowerCase();f.endsWith("ubody_basemesh")&&r&&u.setEnabled(!1),f.endsWith("lbody_basemesh")&&o&&u.setEnabled(!1),f.endsWith("feet_basemesh")&&c&&u.setEnabled(!1),f.endsWith("head")&&i&&u.setEnabled(!1),f.endsWith("head_basemesh")&&i&&u.setEnabled(!1),f.endsWith("mask_eyes")&&i&&u.setEnabled(!1),f.endsWith("mask_eyebrows")&&i&&u.setEnabled(!1),f.endsWith("mask_mouth")&&i&&u.setEnabled(!1)}}catch(p){s.e(p)}finally{s.f()}return t}var Ee=[l.WearableCategory.HAIR,l.WearableCategory.FACIAL_HAIR,l.WearableCategory.MOUTH,l.WearableCategory.EYEBROWS,l.WearableCategory.EYES,l.WearableCategory.UPPER_BODY,l.WearableCategory.LOWER_BODY,l.WearableCategory.FEET];function je(e){var t=new Map,a=e.wearables.filter((function(e){return!ee(e)}));e.wearable&&!ee(e.wearable)&&(a=e.wearables.filter((function(t){if(e.wearable){var a=e.wearable.data,n=a.category,r=a.hides,o=a.replaces;if("skin"===t.data.category){if(Ee.includes(n))return!1;if(r&&r.includes("head"))return!1;if(o&&o.includes("head"))return!1}if(t.data.hides&&t.data.hides.includes(n))return!1;if(t.data.replaces&&t.data.replaces.includes(n))return!1}return!0})),a.push(e.wearable));var n,r=Object(d.a)(a);try{for(r.s();!(n=r.n()).done;){var o=n.value,c=o.data.category;X(o,e.bodyShape)&&t.set(c,o)}}catch(x){r.e(x)}finally{r.f()}var i=!1;a=a.filter((function(e){return t.get(e.data.category)===e})).reverse();var s,u=new Set,f=Object(d.a)(a);try{for(f.s();!(s=f.n()).done;){var p=s.value,b=p.data.category;if(!u.has(b)){for(var h=p.data.replaces||[],v=p.data.hides||[],y=Array.from(new Set([].concat(Object(w.a)(h),Object(w.a)(v)))),m=0,g=y;m<g.length;m++){var O=g[m];O!==b&&(t.delete(O),u.add(O))}p.data.category===l.WearableCategory.SKIN&&(i=!0)}}}catch(x){f.e(x)}finally{f.f()}if(i){var E,j=Object(d.a)(Ee);try{for(j.s();!(E=j.n()).done;){var k=E.value;t.delete(k)}}catch(x){j.e(x)}finally{j.f()}}return t}function ke(e,t){e&&(e.useAutoRotationBehavior=!0,e.autoRotationBehavior&&(e.autoRotationBehavior.idleRotationSpeed=t.autoRotateSpeed))}a(368);function xe(e,t){return Ae.apply(this,arguments)}function Ae(){return(Ae=Object(v.a)(h.a.mark((function e(t,a){var n,r,o,c;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:n=new M.h(t,!0,{preserveDrawingBuffer:!0,stencil:!0}),(r=new M.n(n)).autoClear=!0,r.clearColor=new M.f(0,0,0,0),r.preventDefaultOnPointerDown=!1,new M.i("glow",r,{mainTextureFixedSize:1024,blurKernelSize:64}).intensity=.2,(o=new M.b("camera",0,0,0,new M.s(0,0,0),r)).mode=M.d.PERSPECTIVE_CAMERA,e.t0=a.camera,e.next=e.t0===W.INTERACTIVE?12:e.t0===W.STATIC?23:25;break;case 12:e.t1=a.type,e.next=e.t1===C.WEARABLE?15:e.t1===C.AVATAR?18:20;break;case 15:return ke(o,a),o.position=new M.s(-2,2,2),e.abrupt("break",21);case 18:return o.position=new M.s(0,1,3.5),e.abrupt("break",21);case 20:console.warn('Unexpected preview.type="'.concat(a.type,'"'));case 21:return o.attachControl(t,!0),e.abrupt("break",25);case 23:return o.position=new M.s(0,1,3.5),e.abrupt("break",25);case 25:return c=new M.s(a.offsetX,a.offsetY,a.offsetZ),o.position.addInPlace(c),o.setTarget(c),o.lowerRadiusLimit=o.upperRadiusLimit=o.radius/a.zoom,new M.g("directional",new M.s(0,0,1),r).intensity=1,new M.j("top",new M.s(0,-1,0),r).intensity=1,new M.j("bottom",new M.s(0,1,0),r).intensity=1,new M.p("spot",new M.s(-2,2,2),new M.s(2,-2,-2),Math.PI/2,1e3,r).intensity=1,n.runRenderLoop((function(){return r.render()})),e.abrupt("return",r);case 39:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function Se(e,t,a){return We.apply(this,arguments)}function We(){return(We=Object(v.a)(h.a.mark((function e(t,a,n){var r,o,c;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(r=a.id,o=V(a,n),!(c=o.contents.find((function(e){return e.key.toLowerCase().endsWith("_mask.png")})))){e.next=5;break}return e.abrupt("return",new Promise((function(e,a){var n=new M.r(r,c.url,!0,!1);n.onError=function(){return a(n.errorObject)},n.onSuccess=function(){e(n.texture)},n.run(t,(function(){return e(n.texture)}),a)})));case 5:return e.abrupt("return",null);case 6:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function Ce(e,t,a){return Re.apply(this,arguments)}function Re(){return(Re=Object(v.a)(h.a.mark((function e(t,a,n){var r,o,c;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(r=a.id,o=V(a,n),!(c=o.contents.find((function(e){return e.key.toLowerCase().endsWith(".png")&&!e.key.toLowerCase().endsWith("_mask.png")})))){e.next=5;break}return e.abrupt("return",new Promise((function(e,a){var n=new M.r(r,c.url,!0,!1);n.onError=function(){return a(n.errorObject)},n.onSuccess=function(){e(n.texture)},n.run(t,(function(){return e(n.texture)}),a)})));case 5:return e.abrupt("return",null);case 6:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function Be(e,t){return Le.apply(this,arguments)}function Le(){return Le=Object(v.a)(h.a.mark((function e(t,a){var n;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=function(){var e=Object(v.a)(h.a.mark((function e(a,n){return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt("return",M.o.LoadAssetContainerAsync(a,"",t,null,n));case 1:case"end":return e.stop()}}),e)})));return function(t,a){return e.apply(this,arguments)}}(),e.prev=1,e.next=4,n(a,".glb");case 4:case 11:return e.abrupt("return",e.sent);case 7:return e.prev=7,e.t0=e.catch(1),e.next=11,n(a,".gltf");case 12:case"end":return e.stop()}}),e,null,[[1,7]])}))),Le.apply(this,arguments)}var Ie=["hair_mat"],_e=["avatarskin_mat","skin-f","skin_f"];function Te(e,t){return Me.apply(this,arguments)}function Me(){return Me=Object(v.a)(h.a.mark((function e(t,a){var n,r,o,c,i,s,u,f,p,b,v,w,y=arguments;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n=y.length>2&&void 0!==y[2]?y[2]:l.WearableBodyShape.MALE,r=y.length>3?y[3]:void 0,o=y.length>4?y[4]:void 0,!G(c=V(a,n))){e.next=6;break}throw new Error('The wearable="'.concat(a.id,'" is a texture'));case 6:return i=Z(c),e.next=9,Be(t,i);case 9:s=e.sent,u=Object(d.a)(s.materials);try{for(p=function(){var e=f.value;if(Ie.some((function(t){return e.name.toLowerCase().includes(t)})))if(o){var a=e;a.albedoColor=M.e.FromHexString(o),a.alpha=1}else e.alpha=0,t.removeMaterial(e);if(_e.some((function(t){return e.name.toLowerCase().includes(t)})))if(r){var n=e;n.albedoColor=M.e.FromHexString(r),n.alpha=1}else e.alpha=0,t.removeMaterial(e)},u.s();!(f=u.n()).done;)p()}catch(h){u.e(h)}finally{u.f()}b=Object(d.a)(s.animationGroups);try{for(b.s();!(v=b.n()).done;)(w=v.value).stop(),w.reset(),w.dispose()}catch(h){b.e(h)}finally{b.f()}return e.abrupt("return",{container:s,wearable:a});case 15:case"end":return e.stop()}}),e)}))),Me.apply(this,arguments)}function Pe(e){var t,a=new M.k("parent",e),n=Object(d.a)(e.meshes);try{for(n.s();!(t=n.n()).done;){var r=t.value;r!==a&&r.setParent(a)}}catch(s){n.e(s)}finally{n.f()}!function(e){var t=e.getChildren().filter((function(e){return"__root__"!==e.id}));if(t.length>0){for(var a=t[0],n=a.getBoundingInfo(),r=n.boundingBox.minimumWorld.add(a.position),o=n.boundingBox.maximumWorld.add(a.position),c=1;c<t.length;c++){var i=t[c],s=(n=i.getBoundingInfo()).boundingBox.minimumWorld.add(i.position),u=n.boundingBox.maximumWorld.add(i.position);r=M.s.Minimize(r,s),o=M.s.Maximize(o,u)}e.setBoundingInfo(new M.c(r,o))}}(a);var o=a.getBoundingInfo().boundingBox.extendSize.length(),c=new M.s(1/o,1/o,1/o);a.scaling=c;var i=a.getBoundingInfo().boundingBox.center.multiply(c);a.position.subtractInPlace(i)}var De=[S.IDLE,S.MONEY,S.CLAP];function Fe(e){return De.includes(e)}var Ne={};function Ye(e){var t="https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2065716845.commit-784645d";t.endsWith("/")||(t+="/");var a="./emotes/".concat(e,".glb");return t.startsWith("http")?new URL(a,t).href:a}function Ue(e,t){return He.apply(this,arguments)}function He(){return(He=Object(v.a)(h.a.mark((function e(t,a){var n;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n=Ne[a]){e.next=8;break}return e.next=4,Be(t,a);case 4:if(0!==(n=e.sent).animationGroups.length){e.next=7;break}throw new Error("No animation groups found for emote with url=".concat(a));case 7:Ne[a]=n;case 8:return e.abrupt("return",n);case 9:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function Ve(e,t,a){return ze.apply(this,arguments)}function ze(){return(ze=Object(v.a)(h.a.mark((function e(t,a,n){var r,o;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(r=V(a,n.bodyShape),o=r.contents.find((function(e){return e.key===r.mainFile}))){e.next=4;break}throw new Error("Could not find a valid content in representation for wearable=".concat(a.id," and bodyShape=").concat(n.bodyShape));case 4:return e.abrupt("return",Ue(t,o.url));case 5:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function Xe(e,t,a){return Ze.apply(this,arguments)}function Ze(){return Ze=Object(v.a)(h.a.mark((function e(t,a,n){var r,o,c,i,s,u,l,f,p,b,w,y,m,g,O,E,j,k,x,A;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(u=function(){return(u=Object(v.a)(h.a.mark((function e(){return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:n.camera!==W.STATIC&&ke(t.cameras[0],n),o&&Xe(t,a,n);case 2:case"end":return e.stop()}}),e)})))).apply(this,arguments)},s=function(){return u.apply(this,arguments)},o=Fe(n.emote),!n.wearable||!ee(n.wearable)){e.next=14;break}return e.prev=4,e.next=7,Ve(t,n.wearable,n);case 7:r=e.sent,o=!!(null===(c=n.wearable.emoteDataV0)||void 0===c?void 0:c.loop),e.next=14;break;case 11:e.prev=11,e.t0=e.catch(4),console.warn("Could not load emote=".concat(n.wearable.id));case 14:if(r){e.next=19;break}return i=Ye(n.emote),e.next=18,Ue(t,i);case 18:r=e.sent;case 19:try{l=new M.a("emote",t),f=Object(d.a)(a);try{for(f.s();!(p=f.n()).done;){b=p.value,w=b.container.transformNodes.reduce((function(e,t){var a=e.get(t.id)||[];return a.push(t),e.set(t.id,a)}),new Map),y=Object(d.a)(r.animationGroups[0].targetedAnimations);try{for(y.s();!(m=y.n()).done;)if(g=m.value,O=g.animation,E=g.target,(j=w.get(E.id))&&j.length>0){k=Object(d.a)(j);try{for(k.s();!(x=k.n()).done;)A=x.value,l.addTargetedAnimation(O,A)}catch(S){k.e(S)}finally{k.f()}}}catch(S){y.e(S)}finally{y.f()}}}catch(S){f.e(S)}finally{f.f()}l.play(),l.onAnimationEndObservable.addOnce(s)}catch(C){console.warn("Could not play emote=".concat(n.emote),C)}case 20:case"end":return e.stop()}}),e,null,[[4,11]])}))),Ze.apply(this,arguments)}function Ge(e,t,a){return function(){var n=Object(v.a)(h.a.mark((function n(r){var o;return h.a.wrap((function(n){for(;;)switch(n.prev=n.next){case 0:if(!(o=t.find(ve(r)))){n.next=3;break}return n.abrupt("return",Promise.all([Ce(e,o,a),Se(e,o,a)]));case 3:return n.abrupt("return",[null,null]);case 4:case"end":return n.stop()}}),n)})));return function(e){return n.apply(this,arguments)}}()}function Ke(e,t,a){return Je.apply(this,arguments)}function Je(){return(Je=Object(v.a)(h.a.mark((function e(t,a,n){var r,o,c,s,u,f;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=Ge(t,a,n),e.next=3,Promise.all([r(l.WearableCategory.EYES),r(l.WearableCategory.EYEBROWS),r(l.WearableCategory.MOUTH)]);case 3:return o=e.sent,c=Object(i.a)(o,3),s=c[0],u=c[1],f=c[2],e.abrupt("return",{eyes:s,eyebrows:u,mouth:f});case 9:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function qe(e,t,a,n,r,o){return Qe.apply(this,arguments)}function Qe(){return(Qe=Object(v.a)(h.a.mark((function e(t,a,n,r,o,c){var s,u,l,f,p,b,v,w,y,m,g,O;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:s=Object(d.a)(a.container.meshes);try{for(s.s();!(u=s.n()).done;)(l=u.value).name.toLowerCase().endsWith("mask_eyes")&&(f=Object(i.a)(n,2),p=f[0],b=f[1],p&&$e(t,"eyes",l,p,c.eyes,b,"#ffffff")),l.name.toLowerCase().endsWith("mask_eyebrows")&&(v=Object(i.a)(r,2),w=v[0],y=v[1],w&&$e(t,"eyebrows",l,w,c.hair,y,c.hair)),l.name.toLowerCase().endsWith("mask_mouth")&&(m=Object(i.a)(o,2),g=m[0],O=m[1],g&&$e(t,"mouth",l,g,c.skin,O,c.skin))}catch(h){s.e(h)}finally{s.f()}case 2:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function $e(e,t,a,n,r,o,c){var i=new M.q("".concat(t,"_standard_material"),e);i.alphaMode=M.m.PBRMATERIAL_ALPHABLEND,i.backFaceCulling=!0,n.hasAlpha=!0,i.sideOrientation=M.l.CW,i.diffuseTexture=n,i.diffuseColor=o?M.e.Black():N(c),o&&(i.emissiveTexture=o,i.emissiveColor=N(r)),a.material=i}function et(e){var t=function(e){var t,a=arguments.length>1&&void 0!==arguments[1]?arguments[1]:l.WearableBodyShape.MALE,n={},r=Object(d.a)(e);try{for(r.s();!(t=r.n()).done;){var o=t.value;try{var c,i=V(o,a),s=Object(d.a)(i.contents);try{for(s.s();!(c=s.n()).done;){var u=c.value;n[u.key]=u.url}}catch(f){s.e(f)}finally{s.f()}}catch(p){console.warn('Skipping generation of mappings for wearable="'.concat(o.id,'" since it lacks a representation for bodyShape="').concat(a,'"'));continue}}}catch(f){r.e(f)}finally{r.f()}return n}(e.wearable?[e.wearable].concat(Object(w.a)(e.wearables)):e.wearables,e.bodyShape);M.o.OnPluginActivatedObservable.add((function(e){"gltf"===e.name&&(e.preprocessUrlAsync=function(){var e=Object(v.a)(h.a.mark((function e(a){var n;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return"/content/contents/",n=a.split("/content/contents/"),e.abrupt("return",n.length>0&&n[1]?t[n[1]]:a);case 3:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}())}))}function tt(){return(tt=Object(v.a)(h.a.mark((function e(t,a){var n,r,o,c,i,s,u,f,p,b,v,w,y,m,g,O,E,j;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,xe(t,a);case 2:if(n=e.sent,et(a),r=[],a.type!==C.AVATAR){e.next=28;break}o=je(a),c=Array.from(o.values()),i=Object(d.a)(c.filter(me));try{for(i.s();!(s=i.n()).done;)u=s.value,f=Te(n,u,a.bodyShape,a.skin,a.hair).catch((function(e){console.warn(e.message)})),r.push(f)}catch(h){i.e(h)}finally{i.f()}return e.next=12,Promise.all(r);case 12:p=e.sent.filter(ye),b=Object(d.a)(p);try{for(b.s();!(v=b.n()).done;)v.value.container.addAllToScene()}catch(h){b.e(h)}finally{b.f()}return w=Oe(p),y=c.filter(ge),e.next=19,Ke(n,y,a.bodyShape);case 19:return m=e.sent,g=m.eyes,O=m.eyebrows,E=m.mouth,qe(n,w,g,O,E,a),e.next=26,Xe(n,p,a);case 26:e.next=44;break;case 28:if(a.wearable){e.next=30;break}throw new Error("No wearable to render");case 30:return j=a.wearable,e.prev=31,e.next=34,Te(n,j,a.bodyShape,a.skin,a.hair);case 34:e.sent.container.addAllToScene(),e.next=44;break;case 38:return e.prev=38,e.t0=e.catch(31),e.next=42,Te(n,j,a.bodyShape===l.WearableBodyShape.MALE?l.WearableBodyShape.FEMALE:l.WearableBodyShape.MALE,a.skin,a.hair);case 42:e.sent.container.addAllToScene();case 44:Pe(n);case 45:case"end":return e.stop()}}),e,null,[[31,38]])})))).apply(this,arguments)}var at=a(123),nt=function(){var e=Object(n.useState)(""),t=Object(i.a)(e,2),a=t[0],r=t[1],o=function(){var e=Object(n.useState)({width:void 0,height:void 0}),t=Object(i.a)(e,2),a=t[0],r=t[1];return Object(n.useEffect)((function(){function e(){r({width:window.innerWidth,height:window.innerHeight})}return window.addEventListener("resize",e),e(),function(){return window.removeEventListener("resize",e)}}),[]),a}(),c=o.width,s=o.height,b=Object(n.useState)({}),w=Object(i.a)(b,2),y=w[0],m=w[1],g=Object(n.useState)(!1),O=Object(i.a)(g,2),E=O[0],j=O[1],k=Object(n.useState)(!0),x=Object(i.a)(k,2),A=x[0],S=x[1],R=Object(n.useState)(!1),B=Object(i.a)(R,2),L=B[0],I=B[1],_=Object(n.useRef)(null),T=new URLSearchParams(window.location.search),M=T.get("contract"),P=T.get("token"),D=T.get("item"),F=T.get("skin"),N=T.get("hair"),Y=T.get("eyes"),U=T.get("emote"),H=T.get("camera"),V=T.has("transparentBackground"),z=T.get("autoRotateSpeed"),X=z?parseFloat(z):null,Z=T.get("offsetX"),G=Z?parseFloat(Z):null,K=T.get("offsetY"),J=K?parseFloat(K):null,q=T.get("offsetZ"),Q=q?parseFloat(q):null,$=function(e){var t=e?parseFloat(e):null;return null===t||isNaN(t)?null:1.8*Math.min(Math.max(t,0),100)/100+1}(T.get("zoom")),ee=T.get("bodyShape")||T.get("shape"),te="female"===ee?l.WearableBodyShape.FEMALE:"male"===ee?l.WearableBodyShape.MALE:null,ne=T.getAll("urn"),re=T.get("profile"),oe=Object.values(f).reduce((function(e,t){return t===T.get("env")?t:e}),f.PROD),ce=Object(n.useState)({}),ie=Object(i.a)(ce,2),se=ie[0],ue=ie[1],le=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},a=be(Object(v.a)(h.a.mark((function t(){return h.a.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.abrupt("return",de(e));case 1:case"end":return t.stop()}}),t)})))),r=Object(i.a)(a,3),o=r[0],c=r[1],s=r[2];return[Object(n.useMemo)((function(){var e=Object.keys(t).filter((function(e){return"undefined"!==typeof t[e]&&null!==t[e]}));if(o&&e.length>0){var a,n=Object(p.a)({},o),r=Object(d.a)(e);try{for(r.s();!(a=r.n()).done;){var c=a.value,i=t[c];i&&(n[c]=i)}}catch(s){r.e(s)}finally{r.f()}return n}return o}),[o,t]),c,s]}({contractAddress:M,tokenId:P,itemId:D,bodyShape:te,urns:ne,env:oe,profile:re,skin:F,hair:N,eyes:Y,zoom:$,emote:U,camera:H,autoRotateSpeed:X,offsetX:G,offsetY:J,offsetZ:Q},se),fe=Object(i.a)(le,3),pe=fe[0],ve=fe[1],we=fe[2],ye=Object(n.useState)(""),me=Object(i.a)(ye,2),ge=me[0],Oe=me[1],Ee=Object(n.useState)(!0),je=Object(i.a)(Ee,2),ke=je[0],xe=je[1],Ae=Object(n.useState)(!1),Se=Object(i.a)(Ae,2),We=Se[0],Ce=Se[1],Re=a||we,Be=(A||ve)&&!Re,Le=!!ge&&!ke&&!Be,Ie=ke&&!Be;return Object(n.useEffect)((function(){_.current&&pe&&(m({backgroundImage:V?void 0:pe.background.gradient,opacity:1}),pe.background.image&&Oe(pe.background.image),pe.type===C.TEXTURE?(xe(!1),S(!1),I(!0)):function(e,t){return tt.apply(this,arguments)}(_.current,pe).catch((function(e){return r(e.message)})).finally((function(){S(!1),I(!0)})))}),[_.current,pe]),Object(n.useEffect)((function(){We||(L?(he(ae.LOAD),Ce(!0)):Re&&(he(ae.ERROR,Re),Ce(!0)))}),[L,Re,We]),Object(n.useEffect)((function(){var e=window.onmessage;return window.onmessage=function(e){if(e.data&&e.data.type===ae.UPDATE){var t=e.data;t.options&&"object"===typeof t.options&&ue(t.options)}},function(){window.onmessage=e}}),[]),Object(at.jsxs)("div",{className:u()("Preview",{"is-dragging":E,"is-loading":Be,"is-loaded":L,"is-3d":ke&&(null===pe||void 0===pe?void 0:pe.camera)===W.INTERACTIVE,"has-error":!!Re}),style:y,children:[Object(at.jsx)("img",{src:ge,className:u()("thumbnail",{"is-visible":Le}),alt:"preview"}),Object(at.jsx)("canvas",{id:"wearable-preview",className:u()({"is-visible":Ie}),width:c,height:s,ref:_,onMouseDown:function(){return j(ke&&!Re)},onMouseUp:function(){return j(!1)}}),Re&&Object(at.jsx)("div",{className:"error",children:Re})]})},rt=r.a.memo(nt);c.a.render(Object(at.jsx)(r.a.StrictMode,{children:Object(at.jsx)(rt,{})}),document.getElementById("root"))}},[[369,1,2]]]);
2
+ //# sourceMappingURL=main.94f222a2.chunk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["types/env.ts","lib/sleep.ts","lib/json.ts","lib/api/nft.ts","lib/avatar.ts","lib/api/peer.ts","lib/color.ts","lib/representation.ts","lib/wearable.ts","lib/zoom.ts","lib/message.ts","hooks/useFetch.ts","lib/babylon/utils.ts","lib/babylon/body.ts","lib/babylon/slots.ts","lib/babylon/camera.ts","lib/babylon/scene.ts","lib/babylon/emotes.ts","lib/babylon/face.ts","lib/babylon/mappings.ts","lib/babylon/render.ts","components/Preview/Preview.tsx","hooks/useWindowSize.ts","hooks/useAvatar.ts","index.tsx"],"names":["Env","sleep","ms","a","Promise","resolve","setTimeout","json","url","attempts","fetch","resp","ok","Error","text","AvatarEmote","AvatarCamera","AvatarPreviewType","nftApiByEnv","DEV","PROD","NFTApi","contractAddress","itemId","env","data","length","tokenId","nft","nftApi","peerByEnv","PeerApi","urn","wearables","profile","profiles","peerApi","formatHex","color","startsWith","numberToHex","value","toString","slice","colorToHex","r","g","b","hexToColor","hex","parsed","parseHex","Color3","parseInt","is","representation","bodyShape","bodyShapes","includes","isMale","WearableBodyShape","MALE","isFemale","FEMALE","getRepresentation","wearable","shape","representations","some","id","find","getRepresentationOrDefault","hasRepresentation","error","getContentUrl","content","contents","key","mainFile","isTexture","endsWith","getWearableByCategory","category","getDefaultCategories","WearableCategory","EYEBROWS","MOUTH","EYES","HAIR","UPPER_BODY","LOWER_BODY","FEET","getDefaultWearableUrn","isWearable","getWearableBodyShape","wearabe","isEmote","getZoom","SKIN","MessageType","DEFAULT_PROFILE","fetchWearable","catch","console","log","fetchProfile","then","avatars","fetchWearableFromContract","options","network","fetchNFT","Network","ETHEREUM","image","split","fetchAvatar","urns","all","map","filter","success","promises","defaultWearable","push","defaultWearables","every","createAvatarPreview","wearablePromise","profilePromise","avatar","skin","hair","eyes","zoom","type","WEARABLE","background","gradient","AVATAR","TEXTURE","Rarity","getGradient","rarity","light","dark","thumbnail","emote","IDLE","Object","values","camera","INTERACTIVE","autoRotateSpeed","isNaN","undefined","offsetX","offsetY","offsetZ","useFetch","fetcher","useState","isLoading","setIsLoading","result","setResult","setError","useEffect","message","finally","sendMessage","event","JSON","stringify","window","parent","postMessage","isCategory","isHidden","asset","hides","replaces","isSuccesful","isModel","isFacialFeature","getBodyShape","assets","part","hasSkin","hideUpperBody","hideLowerBody","hideFeet","hideHead","container","meshes","mesh","name","toLowerCase","setEnabled","categoriesHiddenBySkin","FACIAL_HAIR","getSlots","preview","slots","Map","slot","set","get","reverse","alreadyRemoved","Set","has","replaced","hidden","toRemove","Array","from","delete","add","startAutoRotateBehavior","useAutoRotationBehavior","autoRotationBehavior","idleRotationSpeed","createScene","canvas","engine","Engine","preserveDrawingBuffer","stencil","root","Scene","autoClear","clearColor","Color4","preventDefaultOnPointerDown","GlowLayer","mainTextureFixedSize","blurKernelSize","intensity","ArcRotateCamera","Vector3","mode","Camera","PERSPECTIVE_CAMERA","STATIC","position","warn","attachControl","offset","addInPlace","setTarget","lowerRadiusLimit","upperRadiusLimit","radius","DirectionalLight","HemisphericLight","SpotLight","Math","PI","runRenderLoop","render","loadMask","scene","file","reject","task","TextureAssetTask","onError","errorObject","onSuccess","texture","run","loadTexture","loadAssetContainer","load","extension","SceneLoader","LoadAssetContainerAsync","hairMaterials","skinMaterials","loadWearable","materials","material","mat","pbr","albedoColor","FromHexString","alpha","removeMaterial","animationGroups","animationGroup","stop","reset","dispose","center","Mesh","setParent","children","getChildren","child","boundingInfo","getBoundingInfo","min","boundingBox","minimumWorld","max","maximumWorld","i","siblingMin","siblingMax","Minimize","Maximize","setBoundingInfo","BoundingInfo","refreshBoundingInfo","size","extendSize","scale","scaling","multiply","subtractInPlace","loopedEmotes","MONEY","CLAP","isLooped","cache","buildEmoteUrl","baseUrl","process","path","URL","href","loadEmoteFromUrl","loadEmoteFromWearable","playEmote","onAnimationEnd","cameras","loop","emoteDataV0","emoteUrl","emoteAnimationGroup","AnimationGroup","nodes","transformNodes","reduce","node","list","targetedAnimations","targetedAnimation","animation","target","newTargets","newTarget","addTargetedAnimation","play","onAnimationEndObservable","addOnce","getCategoryLoader","features","feature","getFacialFeatures","loadCategory","eyebrows","mouth","applyFacialFeatures","mask","applyTextureAndMask","maskColor","newMaterial","StandardMaterial","alphaMode","PBRMaterial","PBRMATERIAL_ALPHABLEND","backFaceCulling","hasAlpha","sideOrientation","Orientation","CW","diffuseTexture","diffuseColor","Black","emissiveTexture","emissiveColor","setupMappings","mappings","createMappings","OnPluginActivatedObservable","plugin","preprocessUrlAsync","parts","promise","addAllToScene","Preview","previewError","setPreviewError","width","height","windowSize","setWindowSize","handleResize","innerWidth","innerHeight","addEventListener","removeEventListener","useWindowSize","style","setStyle","isDragging","setIsDragging","isLoadingModel","setIsLoadingModel","isLoaded","setIsLoaded","canvasRef","useRef","params","URLSearchParams","location","search","transparentBackground","autoRotateSpeedParam","parseFloat","offsetXParam","offsetYParam","offsetZParam","rawZoom","parsedZoom","parseZoom","bodyShapeParam","getAll","selected","overrides","setOverrides","useMemo","keysToOverride","keys","newAvatar","useAvatar","isLoadingAvatar","avatarError","setImage","is3D","setIs3D","isMessageSent","setIsMessageSent","showImage","showCanvas","current","backgroundImage","opacity","LOAD","ERROR","previous","onmessage","UPDATE","className","classNames","src","alt","ref","onMouseDown","onMouseUp","React","memo","ReactDOM","StrictMode","document","getElementById"],"mappings":"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","file":"static/js/main.94f222a2.chunk.js","sourcesContent":["export enum Env {\n PROD = 'prod',\n DEV = 'dev',\n}\n","export async function sleep(ms: number) {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n","import { sleep } from './sleep'\n\nexport async function json<T>(url: string, attempts = 3): Promise<T> {\n try {\n const resp = await fetch(url)\n if (!resp.ok) {\n throw new Error(await resp.text())\n }\n return resp.json() as Promise<T>\n } catch (error) {\n if (attempts > 0) {\n await sleep(100)\n return json(url, attempts - 1)\n } else {\n throw error\n }\n }\n}\n","import { Item, NFT } from '@dcl/schemas'\nimport { Env } from '../../types/env'\nimport { json } from '../json'\n\nexport const nftApiByEnv: Record<Env, string> = {\n [Env.DEV]: 'https://nft-api.decentraland.io',\n [Env.PROD]: 'https://nft-api.decentraland.org',\n}\n\nclass NFTApi {\n async fetchItem(contractAddress: string, itemId: string, env: Env) {\n const { data } = await json<{ data: Item[] }>(`${nftApiByEnv[env]}/v1/items?contractAddress=${contractAddress}&itemId=${itemId}`)\n if (data.length === 0) {\n throw new Error(`Item not found for contractAddress=\"${contractAddress}\" itemId=\"${itemId}\"`)\n }\n return data[0]\n }\n async fetchNFT(contractAddress: string, tokenId: string, env: Env) {\n const { data } = await json<{ data: { nft: NFT }[] }>(\n `${nftApiByEnv[env]}/v1/nfts?contractAddress=${contractAddress}&tokenId=${tokenId}`\n )\n if (data.length === 0) {\n throw new Error(`NFT not found for contractAddress=\"${contractAddress}\" tokenId=\"${tokenId}\"`)\n }\n return data[0].nft\n }\n}\n\nexport const nftApi = new NFTApi()\n","import { Network, Rarity, WearableBodyShape } from '@dcl/schemas'\nimport { Env } from '../types/env'\nimport { nftApi } from './api/nft'\nimport { peerApi } from './api/peer'\nimport { colorToHex, formatHex } from './color'\nimport { getRepresentationOrDefault, hasRepresentation, isTexture } from './representation'\nimport {\n getDefaultCategories,\n getDefaultWearableUrn,\n getWearableBodyShape,\n getWearableByCategory,\n isEmote,\n isWearable,\n Wearable,\n} from './wearable'\nimport { getZoom } from './zoom'\n\nexport type AvatarPreview = {\n wearable?: Wearable\n wearables: Wearable[]\n bodyShape: WearableBodyShape\n skin: string\n hair: string\n eyes: string\n zoom: number\n type: AvatarPreviewType\n background: AvatarBackground\n emote: AvatarEmote\n camera: AvatarCamera\n autoRotateSpeed: number\n offsetX: number\n offsetY: number\n offsetZ: number\n}\n\nexport type AvatarPreviewOptions = {\n contractAddress?: string | null\n tokenId?: string | null\n itemId?: string | null\n profile?: string | null\n bodyShape?: WearableBodyShape | null\n skin?: string | null\n hair?: string | null\n eyes?: string | null\n urns?: string[] | null\n zoom?: number | null\n emote?: AvatarEmote | null\n camera?: AvatarCamera | null\n autoRotateSpeed?: number | null\n offsetX?: number | null\n offsetY?: number | null\n offsetZ?: number | null\n env?: Env | null\n}\n\nexport type AvatarBackground = {\n image?: string\n gradient: string\n}\n\nexport enum AvatarEmote {\n IDLE = 'idle',\n CLAP = 'clap',\n DAB = 'dab',\n DANCE = 'dance',\n FASHION = 'fashion',\n FASHION_2 = 'fashion-2',\n FASHION_3 = 'fashion-3',\n FASHION_4 = 'fashion-4',\n LOVE = 'love',\n MONEY = 'money',\n}\n\nexport enum AvatarCamera {\n STATIC = 'static',\n INTERACTIVE = 'wearable',\n}\n\nexport enum AvatarPreviewType {\n TEXTURE = 'texture',\n WEARABLE = 'wearable',\n AVATAR = 'avatar',\n}\n\nconst DEFAULT_PROFILE = 'default'\n\nasync function fetchWearable(urn: string, env: Env) {\n return peerApi.fetchWearable(urn, env).catch((error: Error) => console.log(`Failed to load wearable=\"${urn}\"`, error))\n}\n\nasync function fetchProfile(profile: string, env: Env) {\n if (profile === DEFAULT_PROFILE) {\n return null\n }\n return peerApi\n .fetchProfile(profile, env)\n .then((profile) => (profile && profile.avatars.length > 0 ? profile.avatars[0] : null))\n .catch((error: Error) => console.log(`Failed to load profile=\"${profile}\"`, error))\n}\n\nasync function fetchWearableFromContract(options: { contractAddress: string; itemId?: string | null; tokenId?: string | null; env: Env }) {\n const { contractAddress, itemId, tokenId, env } = options\n if (!itemId && !tokenId) {\n throw new Error(`You need to provide an itemId or a tokenId`)\n }\n\n const network = env === Env.PROD ? 'matic' : 'mumbai'\n let urn = `urn:decentraland:${network}:collections-v2:${contractAddress}:${itemId}`\n if (!itemId && !tokenId) {\n throw new Error(`You must provide either tokenId or itemId`)\n } else if (!itemId && tokenId) {\n const nft = await nftApi.fetchNFT(contractAddress, tokenId, env)\n urn =\n nft.network !== Network.ETHEREUM\n ? `urn:decentraland:${network}:collections-v2:${contractAddress}:${nft.itemId}`\n : nft.image.split('contents/')[1].split('/thumbnail')[0] // since the Ethereum collections have a different URN, we extract it from the image path\n }\n return fetchWearable(urn, env)\n}\n\nasync function fetchAvatar(urns: string[], bodyShape: WearableBodyShape, env: Env) {\n let wearables = (await Promise.all([bodyShape, ...urns].map((urn) => fetchWearable(urn, env))))\n .filter(isWearable) // filter out wearables that failed to load\n .filter((wearable) => hasRepresentation(wearable, bodyShape)) // filter out wearables that don't have a representation for the body shape\n // fill default categories\n let success = false\n let attempts = 0\n do {\n const promises: Promise<Wearable | void>[] = []\n for (const category of getDefaultCategories(bodyShape)) {\n const wearable = getWearableByCategory(wearables, category)\n if (!wearable) {\n const urn = getDefaultWearableUrn(category, bodyShape)\n if (urn) {\n const defaultWearable = fetchWearable(urn, env)\n promises.push(defaultWearable)\n } else {\n throw new Error(`Could not get default URN for category=\"${category}\"`)\n }\n }\n }\n const defaultWearables = await Promise.all(promises)\n wearables = [...wearables, ...defaultWearables.filter(isWearable)]\n // make sure all the default wearables were loaded successfully, otherwise retry up to 3 times\n success = defaultWearables.every(isWearable)\n attempts++\n } while (!success && attempts < 3)\n return wearables\n}\n\nexport async function createAvatarPreview(options: AvatarPreviewOptions = {}): Promise<AvatarPreview> {\n const { contractAddress, tokenId, itemId } = options\n const env = options.env || Env.PROD\n\n // load wearable to preview\n let wearablePromise: Promise<Wearable | void> = Promise.resolve()\n if (contractAddress) {\n wearablePromise = fetchWearableFromContract({ contractAddress, tokenId, itemId, env })\n }\n\n // load profile\n const profilePromise = options.profile ? fetchProfile(options.profile, env) : Promise.resolve()\n\n // await promises\n const [wearable, profile] = await Promise.all([wearablePromise, profilePromise] as const)\n\n // use body shape from options, default to the profile one, if no profile default to the wearable bodyShape, if none, default to male\n const bodyShape =\n options.bodyShape ||\n (profile && (profile.avatar.bodyShape as WearableBodyShape)) ||\n (wearable ? getWearableBodyShape(wearable!) : WearableBodyShape.MALE)\n\n // use colors from options, default to profile, if none, use default values\n const skin = formatHex(options.skin || (profile && colorToHex(profile.avatar.skin.color)) || 'cc9b76')\n const hair = formatHex(options.hair || (profile && colorToHex(profile.avatar.hair.color)) || '000000')\n const eyes = formatHex(options.eyes || (profile && colorToHex(profile.avatar.eyes.color)) || '000000')\n\n // merge urns from profile (if any) and extra urns\n const urns = [...(profile ? profile.avatar.wearables : []), ...(options.urns || [])]\n\n let wearables: Wearable[] = []\n let zoom = 1.75\n let type = AvatarPreviewType.WEARABLE\n let background: AvatarBackground = {\n gradient: `radial-gradient(#676370, #18141b)`,\n }\n\n // if loading multiple wearables, or if wearable is emote, render full avatar\n if (urns.length > 0 || (wearable && isEmote(wearable)) || options.profile === DEFAULT_PROFILE) {\n type = AvatarPreviewType.AVATAR\n wearables = await fetchAvatar(urns, bodyShape, env)\n }\n\n if (wearable) {\n zoom = wearables.length > 0 ? zoom : getZoom(wearable)\n const representation = getRepresentationOrDefault(wearable)\n if (isTexture(representation) && type !== AvatarPreviewType.AVATAR) {\n type = AvatarPreviewType.TEXTURE\n }\n const [light, dark] = Rarity.getGradient(wearable.rarity)\n const gradient = `radial-gradient(${light}, ${dark})`\n background = {\n image: wearable.thumbnail,\n gradient,\n }\n }\n\n let emote = AvatarEmote.IDLE\n if (options.emote && Object.values(AvatarEmote).includes(options.emote)) {\n emote = options.emote\n }\n\n let camera = AvatarCamera.INTERACTIVE\n if (options.camera && Object.values(AvatarCamera).includes(options.camera)) {\n camera = options.camera\n }\n const autoRotateSpeed = typeof options.autoRotateSpeed === 'number' && !isNaN(options.autoRotateSpeed) ? options.autoRotateSpeed : 0.2\n\n return {\n wearable: wearable ?? undefined,\n wearables,\n bodyShape,\n skin,\n hair,\n eyes,\n type,\n background,\n emote,\n camera,\n autoRotateSpeed,\n offsetX: options.offsetX || 0,\n offsetY: options.offsetY || 0,\n offsetZ: options.offsetZ || 0,\n zoom: options.zoom || zoom,\n }\n}\n","import { Profile } from '@dcl/schemas'\nimport { Env } from '../../types/env'\nimport { json } from '../json'\nimport { Wearable } from '../wearable'\n\nexport const peerByEnv: Record<Env, string> = {\n [Env.DEV]: 'https://peer.decentraland.zone',\n [Env.PROD]: 'https://peer.decentraland.org',\n}\n\nclass PeerApi {\n async fetchWearable(urn: string, env: Env) {\n const { wearables } = await json<{ wearables: Wearable[] }>(`${peerByEnv[env]}/lambdas/collections/wearables?wearableId=${urn}`)\n if (wearables.length === 0) {\n throw new Error(`Wearable not found for urn=\"${urn}\"`)\n }\n return wearables[0]\n }\n async fetchProfile(profile: string, env: Env) {\n const profiles = await json<Profile[]>(`${peerByEnv[env]}/lambdas/profiles?id=${profile}`)\n return profiles.length > 0 ? profiles[0] : null\n }\n}\n\nexport const peerApi = new PeerApi()\n","import { Color3 } from '@babylonjs/core'\nimport { Color3 as RGB } from '@dcl/schemas'\n\nexport function formatHex(color: string) {\n return color.startsWith('#') ? color : '#' + color\n}\n\nexport function parseHex(color: string) {\n return color.startsWith('#') ? color.slice(1) : color\n}\n\nexport function numberToHex(value: number) {\n const hex = ((value * 255) | 0).toString(16)\n return ('0' + hex).slice(-2)\n}\n\nexport function colorToHex(color: RGB) {\n return numberToHex(color.r) + numberToHex(color.g) + numberToHex(color.b)\n}\n\nexport function hexToColor(hex: string) {\n const parsed = parseHex(hex)\n const color = new Color3(\n parseInt(parsed.slice(0, 2), 16) / 256,\n parseInt(parsed.slice(2, 4), 16) / 256,\n parseInt(parsed.slice(4, 6), 16) / 256\n )\n return color\n}\n","import { WearableBodyShape, WearableRepresentation as WearableRepresentationBroken } from '@dcl/schemas'\nimport { Wearable } from './wearable'\n\nexport type WearableRepresentation = Omit<WearableRepresentationBroken, 'contents'> & { contents: { key: string; url: string }[] }\n\nexport function is(representation: WearableRepresentation, bodyShape: WearableBodyShape) {\n return representation.bodyShapes.includes(bodyShape)\n}\n\nexport function isMale(representation: WearableRepresentation) {\n return is(representation, WearableBodyShape.MALE)\n}\n\nexport function isFemale(representation: WearableRepresentation) {\n return is(representation, WearableBodyShape.FEMALE)\n}\n\nexport function getRepresentation(wearable: Wearable, shape = WearableBodyShape.MALE) {\n switch (shape) {\n case WearableBodyShape.FEMALE: {\n if (!wearable.data.representations.some(isFemale)) {\n throw new Error(`Could not find a BaseFemale representation for wearable=\"${wearable.id}\"`)\n }\n return wearable.data.representations.find(isFemale)!\n }\n case WearableBodyShape.MALE: {\n if (!wearable.data.representations.some(isMale)) {\n throw new Error(`Could not find a BaseMale representation for wearable=\"${wearable.id}\"`)\n }\n return wearable.data.representations.find(isMale)!\n }\n }\n}\n\nexport function getRepresentationOrDefault(wearable: Wearable, shape = WearableBodyShape.MALE) {\n if (hasRepresentation(wearable, shape)) {\n return getRepresentation(wearable, shape)\n }\n if (wearable.data.representations.length > 0) {\n return wearable.data.representations[0]\n }\n throw new Error(`The wearable=\"${wearable.id}\" has no representation`)\n}\n\nexport function hasRepresentation(wearable: Wearable, shape = WearableBodyShape.MALE) {\n try {\n getRepresentation(wearable, shape)\n return true\n } catch (error) {\n return false\n }\n}\n\nexport function getContentUrl(representation: WearableRepresentation) {\n const content = representation.contents.find((content) => content.key === representation.mainFile)\n if (!content) {\n throw new Error(`Could not find main file`)\n }\n return content.url\n}\n\nexport function isTexture(representation: WearableRepresentation) {\n return representation.mainFile.endsWith('png')\n}\n","import { Wearable as WearableBroken, WearableBodyShape, WearableCategory } from '@dcl/schemas'\nimport { WearableRepresentation } from './representation'\n\nexport type Wearable = Omit<WearableBroken, 'data' | 'names'> & {\n name: string\n data: Omit<WearableBroken['data'], 'representations'> & {\n representations: WearableRepresentation[]\n }\n emoteDataV0?: {\n loop: boolean\n }\n}\n\nexport function getWearableByCategory(wearables: Wearable[], category: WearableCategory) {\n return wearables.find((wearable) => wearable.data.category === category) || null\n}\n\nexport function getDefaultCategories(shape: WearableBodyShape) {\n switch (shape) {\n case WearableBodyShape.MALE:\n return [\n WearableCategory.EYEBROWS,\n WearableCategory.MOUTH,\n WearableCategory.EYES,\n WearableCategory.HAIR,\n WearableCategory.UPPER_BODY,\n WearableCategory.LOWER_BODY,\n WearableCategory.FEET,\n ]\n case WearableBodyShape.FEMALE:\n return [\n WearableCategory.EYEBROWS,\n WearableCategory.MOUTH,\n WearableCategory.EYES,\n WearableCategory.HAIR,\n WearableCategory.UPPER_BODY,\n WearableCategory.LOWER_BODY,\n WearableCategory.FEET,\n ]\n }\n}\n\nexport function getDefaultWearableUrn(category: WearableCategory, shape: WearableBodyShape) {\n switch (category) {\n case WearableCategory.EYEBROWS:\n return shape === WearableBodyShape.MALE\n ? 'urn:decentraland:off-chain:base-avatars:eyebrows_00'\n : 'urn:decentraland:off-chain:base-avatars:f_eyebrows_00'\n case WearableCategory.MOUTH:\n return shape === WearableBodyShape.MALE\n ? 'urn:decentraland:off-chain:base-avatars:mouth_00'\n : 'urn:decentraland:off-chain:base-avatars:f_mouth_00'\n case WearableCategory.EYES:\n return shape === WearableBodyShape.MALE\n ? 'urn:decentraland:off-chain:base-avatars:eyes_00'\n : 'urn:decentraland:off-chain:base-avatars:f_eyes_00'\n case WearableCategory.HAIR:\n return shape === WearableBodyShape.MALE\n ? 'urn:decentraland:off-chain:base-avatars:casual_hair_01'\n : 'urn:decentraland:off-chain:base-avatars:standard_hair'\n case WearableCategory.UPPER_BODY:\n return shape === WearableBodyShape.MALE\n ? 'urn:decentraland:off-chain:base-avatars:green_hoodie'\n : 'urn:decentraland:off-chain:base-avatars:f_sweater'\n case WearableCategory.LOWER_BODY:\n return shape === WearableBodyShape.MALE\n ? 'urn:decentraland:off-chain:base-avatars:brown_pants'\n : 'urn:decentraland:off-chain:base-avatars:f_jeans'\n case WearableCategory.FEET:\n return shape === WearableBodyShape.MALE\n ? 'urn:decentraland:off-chain:base-avatars:sneakers'\n : 'urn:decentraland:off-chain:base-avatars:bun_shoes'\n default:\n throw new Error(`There is no default wearable for category=\"${category}\"`)\n }\n}\n\nexport function isWearable(value: Wearable | void): value is Wearable {\n return !!value\n}\n\nexport function getWearableBodyShape(wearabe: Wearable): WearableBodyShape {\n const bodyShapes = [WearableBodyShape.MALE, WearableBodyShape.FEMALE]\n return (\n bodyShapes.find((bodyShape) => wearabe.data.representations.some((representation) => representation.bodyShapes.includes(bodyShape))) ||\n bodyShapes[0]\n )\n}\n\nexport function isEmote(wearable: Wearable) {\n return !!wearable && `emoteDataV0` in wearable\n}\n","import { WearableCategory } from '@dcl/schemas'\nimport { Wearable } from './wearable'\n\nexport function parseZoom(rawZoom: string | null) {\n const parsedZoom = rawZoom ? parseFloat(rawZoom) : null\n const zoom = parsedZoom === null || isNaN(parsedZoom) ? null : (Math.min(Math.max(parsedZoom, 0), 100) * 1.8) / 100 + 1\n return zoom\n}\n\n/**\n * Returns the right zoom for a given category\n * @param category\n * @returns\n */\nexport function getZoom(wearable?: Wearable | void) {\n const category = wearable?.data.category\n switch (category) {\n case WearableCategory.UPPER_BODY:\n return 2\n case WearableCategory.SKIN:\n return 1.75\n default:\n return 1.25\n }\n}\n","export enum MessageType {\n LOAD = 'load',\n ERROR = 'error',\n UPDATE = 'update',\n}\n\nexport function sendMessage(type: MessageType, message?: string) {\n const event = JSON.stringify({ type, message })\n window.parent && window.parent.postMessage(event, '*')\n}\n","import { useEffect, useState } from 'react'\n\nexport function useFetch<T>(fetcher: () => Promise<T>) {\n const [isLoading, setIsLoading] = useState(false)\n const [result, setResult] = useState<T | null>(null)\n const [error, setError] = useState('')\n useEffect(() => {\n setIsLoading(true)\n fetcher()\n .then((result) => setResult(result))\n .catch((error) => setError(error.message))\n .finally(() => setIsLoading(false))\n }, []) // eslint-disable-line\n return [result, isLoading, error] as const\n}\n","import { WearableCategory } from '@dcl/schemas'\nimport { getRepresentationOrDefault, isTexture } from '../representation'\nimport { Wearable } from '../wearable'\nimport { Asset } from './scene'\n\nexport function isCategory(category: WearableCategory) {\n return (wearable: Wearable) => wearable.data.category === category\n}\n\nexport function isHidden(category: WearableCategory) {\n return (asset: Asset) => {\n return (\n asset.wearable.data.category === category ||\n (asset.wearable.data.hides || []).includes(category) ||\n (asset.wearable.data.replaces || []).includes(category)\n )\n }\n}\n\nexport function isSuccesful(result: void | Asset): result is Asset {\n return !!result\n}\n\nexport function isModel(wearable: Wearable): boolean {\n const representation = getRepresentationOrDefault(wearable)\n return !isTexture(representation)\n}\n\nexport function isFacialFeature(wearable: Wearable): boolean {\n return !isModel(wearable)\n}\n","import { WearableCategory } from '@dcl/schemas'\nimport { Asset } from './scene'\nimport { isHidden } from './utils'\n\nexport function getBodyShape(assets: Asset[]) {\n const bodyShape = assets.find((part) => part.wearable.data.category === ('body_shape' as WearableCategory))\n\n if (!bodyShape) {\n throw new Error(`Could not find a bodyShape when trying to hide base body parts`)\n }\n\n // hide base body parts if necessary\n const hasSkin = assets.some((part) => part.wearable.data.category === WearableCategory.SKIN)\n const hideUpperBody = hasSkin || assets.some(isHidden(WearableCategory.UPPER_BODY))\n const hideLowerBody = hasSkin || assets.some(isHidden(WearableCategory.LOWER_BODY))\n const hideFeet = hasSkin || assets.some(isHidden(WearableCategory.FEET))\n const hideHead = hasSkin || assets.some(isHidden('head' as WearableCategory))\n\n for (const mesh of bodyShape.container.meshes) {\n const name = mesh.name.toLowerCase()\n if (name.endsWith('ubody_basemesh') && hideUpperBody) {\n mesh.setEnabled(false)\n }\n if (name.endsWith('lbody_basemesh') && hideLowerBody) {\n mesh.setEnabled(false)\n }\n if (name.endsWith('feet_basemesh') && hideFeet) {\n mesh.setEnabled(false)\n }\n if (name.endsWith('head') && hideHead) {\n mesh.setEnabled(false)\n }\n if (name.endsWith('head_basemesh') && hideHead) {\n mesh.setEnabled(false)\n }\n if (name.endsWith('mask_eyes') && hideHead) {\n mesh.setEnabled(false)\n }\n if (name.endsWith('mask_eyebrows') && hideHead) {\n mesh.setEnabled(false)\n }\n if (name.endsWith('mask_mouth') && hideHead) {\n mesh.setEnabled(false)\n }\n }\n\n return bodyShape\n}\n","import { WearableCategory } from '@dcl/schemas'\nimport { AvatarPreview } from '../avatar'\nimport { hasRepresentation } from '../representation'\nimport { isEmote, Wearable } from '../wearable'\n\nconst categoriesHiddenBySkin = [\n WearableCategory.HAIR,\n WearableCategory.FACIAL_HAIR,\n WearableCategory.MOUTH,\n WearableCategory.EYEBROWS,\n WearableCategory.EYES,\n WearableCategory.UPPER_BODY,\n WearableCategory.LOWER_BODY,\n WearableCategory.FEET,\n]\n\nexport function getSlots(preview: AvatarPreview) {\n const slots = new Map<WearableCategory, Wearable>()\n\n let wearables: Wearable[] = preview.wearables.filter((wearable) => !isEmote(wearable)) // remove emotes if any\n\n // remove other wearables that hide the equipped wearable\n if (preview.wearable && !isEmote(preview.wearable)) {\n wearables = preview.wearables.filter((wearable) => {\n if (preview.wearable) {\n const { category, hides, replaces } = preview.wearable.data\n if (wearable.data.category === 'skin') {\n if (categoriesHiddenBySkin.includes(category)) {\n return false\n }\n if (hides && hides.includes('head' as WearableCategory)) {\n return false\n }\n if (replaces && replaces.includes('head' as WearableCategory)) {\n return false\n }\n }\n if (wearable.data.hides && wearable.data.hides.includes(category)) {\n return false\n }\n if (wearable.data.replaces && wearable.data.replaces.includes(category)) {\n return false\n }\n }\n return true\n })\n // add the equipped wearable at the end\n wearables.push(preview.wearable)\n }\n\n // arrange wearbles in slots\n for (const wearable of wearables) {\n const slot = wearable.data.category\n if (hasRepresentation(wearable, preview.bodyShape)) {\n slots.set(slot, wearable)\n }\n }\n let hasSkin = false\n // grab only the wearables that ended up in the map, and process in reverse order (last wearables can hide/replace the first ones)\n wearables = wearables.filter((wearable) => slots.get(wearable.data.category) === wearable).reverse()\n const alreadyRemoved = new Set<string>()\n for (const wearable of wearables) {\n const category = wearable.data.category\n if (alreadyRemoved.has(category)) {\n continue\n }\n const replaced = wearable.data.replaces || []\n const hidden = wearable.data.hides || []\n const toRemove = Array.from(new Set([...replaced, ...hidden]))\n for (const slot of toRemove) {\n if (slot !== category) {\n slots.delete(slot)\n alreadyRemoved.add(slot)\n }\n }\n if (wearable.data.category === WearableCategory.SKIN) {\n hasSkin = true\n }\n }\n // skins hide all the following slots\n if (hasSkin) {\n for (const category of categoriesHiddenBySkin) {\n slots.delete(category)\n }\n }\n\n return slots\n}\n","import { ArcRotateCamera } from '@babylonjs/core'\nimport { AvatarPreview } from '../avatar'\n\nexport function startAutoRotateBehavior(camera: ArcRotateCamera, preview: AvatarPreview) {\n if (camera) {\n camera.useAutoRotationBehavior = true\n if (camera.autoRotationBehavior) {\n camera.autoRotationBehavior.idleRotationSpeed = preview.autoRotateSpeed\n }\n }\n}\n","import {\n ArcRotateCamera,\n AssetContainer,\n BoundingInfo,\n Camera,\n Color3,\n Color4,\n DirectionalLight,\n Engine,\n GlowLayer,\n HemisphericLight,\n Mesh,\n PBRMaterial,\n Scene,\n SceneLoader,\n SpotLight,\n Texture,\n TextureAssetTask,\n Vector3,\n} from '@babylonjs/core'\nimport '@babylonjs/loaders'\nimport { WearableBodyShape } from '@dcl/schemas'\nimport { AvatarCamera, AvatarPreview, AvatarPreviewType } from '../avatar'\nimport { getContentUrl, getRepresentation, isTexture } from '../representation'\nimport { Wearable } from '../wearable'\nimport { startAutoRotateBehavior } from './camera'\n\nexport type Asset = {\n container: AssetContainer\n wearable: Wearable\n}\n\n/**\n * It refreshes the bounding info of a mesh, taking into account all of its children\n * @param parent\n */\nfunction refreshBoundingInfo(parent: Mesh) {\n const children = parent.getChildren().filter((mesh) => mesh.id !== '__root__')\n if (children.length > 0) {\n const child = children[0] as Mesh\n // child.showBoundingBox = true\n let boundingInfo = child.getBoundingInfo()\n\n let min = boundingInfo.boundingBox.minimumWorld.add(child.position)\n let max = boundingInfo.boundingBox.maximumWorld.add(child.position)\n\n for (let i = 1; i < children.length; i++) {\n const child = children[i] as Mesh\n // child.showBoundingBox = true\n boundingInfo = child.getBoundingInfo()\n const siblingMin = boundingInfo.boundingBox.minimumWorld.add(child.position)\n const siblingMax = boundingInfo.boundingBox.maximumWorld.add(child.position)\n\n min = Vector3.Minimize(min, siblingMin)\n max = Vector3.Maximize(max, siblingMax)\n }\n\n parent.setBoundingInfo(new BoundingInfo(min, max))\n }\n}\n\n/**\n * Creates a Scene with the right camera, light and effects\n * @param canvas\n * @param zoom\n * @returns\n */\nexport async function createScene(canvas: HTMLCanvasElement, preview: AvatarPreview) {\n // Create engine\n const engine = new Engine(canvas, true, {\n preserveDrawingBuffer: true,\n stencil: true,\n })\n\n // Load GLB/GLTF\n const root = new Scene(engine)\n root.autoClear = true\n root.clearColor = new Color4(0, 0, 0, 0)\n root.preventDefaultOnPointerDown = false\n\n // effects\n var glow = new GlowLayer('glow', root, {\n mainTextureFixedSize: 1024,\n blurKernelSize: 64,\n })\n glow.intensity = 0.2\n\n // Setup Camera\n var camera = new ArcRotateCamera('camera', 0, 0, 0, new Vector3(0, 0, 0), root)\n camera.mode = Camera.PERSPECTIVE_CAMERA\n switch (preview.camera) {\n case AvatarCamera.INTERACTIVE: {\n switch (preview.type) {\n case AvatarPreviewType.WEARABLE: {\n startAutoRotateBehavior(camera, preview)\n camera.position = new Vector3(-2, 2, 2)\n break\n }\n case AvatarPreviewType.AVATAR: {\n camera.position = new Vector3(0, 1, 3.5)\n break\n }\n default: {\n console.warn(`Unexpected preview.type=\"${preview.type}\"`)\n // do nothing\n }\n }\n camera.attachControl(canvas, true)\n break\n }\n case AvatarCamera.STATIC: {\n camera.position = new Vector3(0, 1, 3.5)\n break\n }\n }\n const offset = new Vector3(preview.offsetX, preview.offsetY, preview.offsetZ)\n camera.position.addInPlace(offset)\n camera.setTarget(offset)\n camera.lowerRadiusLimit = camera.upperRadiusLimit = camera.radius / preview.zoom\n\n // Setup lights\n var directional = new DirectionalLight('directional', new Vector3(0, 0, 1), root)\n directional.intensity = 1\n var top = new HemisphericLight('top', new Vector3(0, -1, 0), root)\n top.intensity = 1\n var bottom = new HemisphericLight('bottom', new Vector3(0, 1, 0), root)\n bottom.intensity = 1\n var spot = new SpotLight('spot', new Vector3(-2, 2, 2), new Vector3(2, -2, -2), Math.PI / 2, 1000, root)\n spot.intensity = 1\n\n // render loop\n engine.runRenderLoop(() => root.render())\n\n return root\n}\n\nexport async function loadMask(scene: Scene, wearable: Wearable, bodyShape: WearableBodyShape): Promise<Texture | null> {\n const name = wearable.id\n const representation = getRepresentation(wearable, bodyShape)\n const file = representation.contents.find((file) => file.key.toLowerCase().endsWith('_mask.png'))\n if (file) {\n return new Promise((resolve, reject) => {\n const task = new TextureAssetTask(name, file.url, true, false)\n task.onError = () => reject(task.errorObject)\n task.onSuccess = () => {\n resolve(task.texture)\n }\n task.run(scene, () => resolve(task.texture), reject)\n })\n }\n return null\n}\n\nexport async function loadTexture(scene: Scene, wearable: Wearable, bodyShape: WearableBodyShape): Promise<Texture | null> {\n const name = wearable.id\n const representation = getRepresentation(wearable, bodyShape)\n const file = representation.contents.find(\n (file) => file.key.toLowerCase().endsWith('.png') && !file.key.toLowerCase().endsWith('_mask.png')\n )\n if (file) {\n return new Promise((resolve, reject) => {\n const task = new TextureAssetTask(name, file.url, true, false)\n task.onError = () => reject(task.errorObject)\n task.onSuccess = () => {\n resolve(task.texture)\n }\n task.run(scene, () => resolve(task.texture), reject)\n })\n }\n return null\n}\n\nexport async function loadAssetContainer(scene: Scene, url: string) {\n const load = async (url: string, extension: string) => SceneLoader.LoadAssetContainerAsync(url, '', scene, null, extension)\n // try with GLB, if it fails try with GLTF\n try {\n return await load(url, '.glb')\n } catch (error) {\n return await load(url, '.gltf')\n }\n}\n\n/**\n * Loads a wearable into the Scene, using a given a body shape, skin and hair color\n * @param scene\n * @param wearable\n * @param bodyShape\n * @param skin\n * @param hair\n */\n\nconst hairMaterials = ['hair_mat']\n// there are some representations that use a modified material name like \"skin-f\" or \"skin_f\", i added them to the list support those wearables\nconst skinMaterials = ['avatarskin_mat', 'skin-f', 'skin_f']\nexport async function loadWearable(scene: Scene, wearable: Wearable, bodyShape = WearableBodyShape.MALE, skin?: string, hair?: string) {\n const representation = getRepresentation(wearable, bodyShape)\n if (isTexture(representation)) {\n throw new Error(`The wearable=\"${wearable.id}\" is a texture`)\n }\n const url = getContentUrl(representation)\n const container = await loadAssetContainer(scene, url)\n\n // Clean up\n for (let material of container.materials) {\n if (hairMaterials.some((mat) => material.name.toLowerCase().includes(mat))) {\n if (hair) {\n const pbr = material as PBRMaterial\n pbr.albedoColor = Color3.FromHexString(hair)\n pbr.alpha = 1\n } else {\n material.alpha = 0\n scene.removeMaterial(material)\n }\n }\n if (skinMaterials.some((mat) => material.name.toLowerCase().includes(mat))) {\n if (skin) {\n const pbr = material as PBRMaterial\n pbr.albedoColor = Color3.FromHexString(skin)\n pbr.alpha = 1\n } else {\n material.alpha = 0\n scene.removeMaterial(material)\n }\n }\n }\n\n // Stop any animations\n for (const animationGroup of container.animationGroups) {\n animationGroup.stop()\n animationGroup.reset()\n animationGroup.dispose()\n }\n\n return { container, wearable }\n}\n\n/**\n * Center and resizes a Scene to fit in the camera view\n * @param scene\n */\n\nexport function center(scene: Scene) {\n // Setup parent\n var parent = new Mesh('parent', scene)\n for (const mesh of scene.meshes) {\n if (mesh !== parent) {\n mesh.setParent(parent)\n }\n }\n\n // resize and center\n refreshBoundingInfo(parent)\n const bounds = parent.getBoundingInfo().boundingBox.extendSize\n const size = bounds.length()\n const scale = new Vector3(1 / size, 1 / size, 1 / size)\n parent.scaling = scale\n const center = parent.getBoundingInfo().boundingBox.center.multiply(scale)\n parent.position.subtractInPlace(center)\n}\n","import { AnimationGroup, ArcRotateCamera, AssetContainer, Scene, TransformNode } from '@babylonjs/core'\nimport { AvatarCamera, AvatarEmote, AvatarPreview } from '../avatar'\nimport { getRepresentation } from '../representation'\nimport { isEmote, Wearable } from '../wearable'\nimport { startAutoRotateBehavior } from './camera'\nimport { Asset, loadAssetContainer } from './scene'\n\nconst loopedEmotes = [AvatarEmote.IDLE, AvatarEmote.MONEY, AvatarEmote.CLAP]\n\nfunction isLooped(emote: AvatarEmote) {\n return loopedEmotes.includes(emote)\n}\n\n// cache emotes, this is so wecan play on loop without downloading the GLB again\nconst cache: Record<string, AssetContainer> = {}\n\nexport function buildEmoteUrl(emote: AvatarEmote) {\n let baseUrl = process.env.PUBLIC_URL || ''\n if (!baseUrl.endsWith('/')) {\n baseUrl += '/'\n }\n const path = `./emotes/${emote}.glb`\n const url = baseUrl.startsWith('http') ? new URL(path, baseUrl).href : path\n return url\n}\n\nexport async function loadEmoteFromUrl(scene: Scene, url: string) {\n let container = cache[url]\n if (!container) {\n container = await loadAssetContainer(scene, url)\n if (container.animationGroups.length === 0) {\n throw new Error(`No animation groups found for emote with url=${url}`)\n }\n cache[url] = container\n }\n return container\n}\n\nexport async function loadEmoteFromWearable(scene: Scene, wearable: Wearable, preview: AvatarPreview) {\n const representation = getRepresentation(wearable, preview.bodyShape)\n const content = representation.contents.find((content) => content.key === representation.mainFile)\n if (!content) {\n throw new Error(`Could not find a valid content in representation for wearable=${wearable.id} and bodyShape=${preview.bodyShape}`)\n }\n return loadEmoteFromUrl(scene, content.url)\n}\n\nexport async function playEmote(scene: Scene, assets: Asset[], preview: AvatarPreview) {\n // load asset container for emote\n let container: AssetContainer | undefined\n let loop = isLooped(preview.emote)\n if (preview.wearable && isEmote(preview.wearable)) {\n try {\n container = await loadEmoteFromWearable(scene, preview.wearable, preview)\n loop = !!preview.wearable.emoteDataV0?.loop\n } catch (error) {\n console.warn(`Could not load emote=${preview.wearable.id}`)\n }\n }\n if (!container) {\n const emoteUrl = buildEmoteUrl(preview.emote)\n container = await loadEmoteFromUrl(scene, emoteUrl)\n }\n\n // start camera rotation after animation ends\n async function onAnimationEnd() {\n if (preview.camera !== AvatarCamera.STATIC) {\n const camera = scene.cameras[0] as ArcRotateCamera\n startAutoRotateBehavior(camera, preview)\n }\n if (loop) {\n // keep playing idle animation on loop\n playEmote(scene, assets, preview)\n }\n }\n\n // play emote animation\n try {\n const emoteAnimationGroup = new AnimationGroup('emote', scene)\n for (const asset of assets) {\n // store all the transform nodes in a map, there can be repeated node ids\n // if a wearable has multiple representations, so for each id we keep an array of nodes\n const nodes = asset.container.transformNodes.reduce((map, node) => {\n const list = map.get(node.id) || []\n list.push(node)\n return map.set(node.id, list)\n }, new Map<string, TransformNode[]>())\n // apply each targeted animation from the emote asset container to the transform nodes of all the wearables\n for (const targetedAnimation of container.animationGroups[0].targetedAnimations) {\n const animation = targetedAnimation.animation\n const target = targetedAnimation.target as TransformNode\n const newTargets = nodes.get(target.id)\n if (newTargets && newTargets.length > 0) {\n for (const newTarget of newTargets) {\n emoteAnimationGroup.addTargetedAnimation(animation, newTarget)\n }\n }\n }\n }\n // play animation group and apply\n emoteAnimationGroup.play()\n emoteAnimationGroup.onAnimationEndObservable.addOnce(onAnimationEnd)\n } catch (error) {\n console.warn(`Could not play emote=${preview.emote}`, error)\n }\n}\n\nexport function shouldPlayEmote(preview: AvatarPreview) {\n return preview.emote\n}\n","import { AbstractMesh, Color3, Orientation, PBRMaterial, Scene, StandardMaterial, Texture } from '@babylonjs/core'\nimport { WearableBodyShape, WearableCategory } from '@dcl/schemas'\nimport { AvatarPreview } from '../avatar'\nimport { hexToColor } from '../color'\nimport { Wearable } from '../wearable'\nimport { Asset, loadMask, loadTexture } from './scene'\nimport { isCategory } from './utils'\n\nfunction getCategoryLoader(scene: Scene, features: Wearable[], bodyShape: WearableBodyShape) {\n return async (category: WearableCategory) => {\n const feature = features.find(isCategory(category))\n if (feature) {\n return Promise.all([loadTexture(scene, feature, bodyShape), loadMask(scene, feature, bodyShape)]) as Promise<\n [Texture | null, Texture | null]\n >\n }\n return [null, null] as [null, null]\n }\n}\n\nexport async function getFacialFeatures(scene: Scene, features: Wearable[], bodyShape: WearableBodyShape) {\n const loadCategory = getCategoryLoader(scene, features, bodyShape)\n const [eyes, eyebrows, mouth] = await Promise.all([\n loadCategory(WearableCategory.EYES),\n loadCategory(WearableCategory.EYEBROWS),\n loadCategory(WearableCategory.MOUTH),\n ])\n return { eyes, eyebrows, mouth }\n}\n\nexport async function applyFacialFeatures(\n scene: Scene,\n bodyShape: Asset,\n eyes: [Texture | null, Texture | null],\n eyebrows: [Texture | null, Texture | null],\n mouth: [Texture | null, Texture | null],\n preview: AvatarPreview\n) {\n for (const mesh of bodyShape.container.meshes) {\n if (mesh.name.toLowerCase().endsWith('mask_eyes')) {\n const [texture, mask] = eyes\n if (texture) {\n applyTextureAndMask(scene, 'eyes', mesh, texture, preview.eyes, mask, '#ffffff')\n }\n }\n if (mesh.name.toLowerCase().endsWith('mask_eyebrows')) {\n const [texture, mask] = eyebrows\n if (texture) {\n applyTextureAndMask(scene, 'eyebrows', mesh, texture, preview.hair, mask, preview.hair)\n }\n }\n if (mesh.name.toLowerCase().endsWith('mask_mouth')) {\n const [texture, mask] = mouth\n if (texture) {\n applyTextureAndMask(scene, 'mouth', mesh, texture, preview.skin, mask, preview.skin)\n }\n }\n }\n}\n\nfunction applyTextureAndMask(\n scene: Scene,\n name: string,\n mesh: AbstractMesh,\n texture: Texture,\n color: string,\n mask: Texture | null,\n maskColor: string\n) {\n const newMaterial = new StandardMaterial(`${name}_standard_material`, scene)\n newMaterial.alphaMode = PBRMaterial.PBRMATERIAL_ALPHABLEND\n newMaterial.backFaceCulling = true\n texture.hasAlpha = true\n newMaterial.sideOrientation = Orientation.CW\n newMaterial.diffuseTexture = texture\n newMaterial.diffuseColor = mask ? Color3.Black() : hexToColor(maskColor)\n if (mask) {\n newMaterial.emissiveTexture = mask\n newMaterial.emissiveColor = hexToColor(color)\n }\n mesh.material = newMaterial\n}\n","import { SceneLoader } from '@babylonjs/core'\nimport { GLTFFileLoader } from '@babylonjs/loaders'\nimport { WearableBodyShape } from '@dcl/schemas'\nimport { AvatarPreview } from '../avatar'\nimport { getRepresentation } from '../representation'\nimport { Wearable } from '../wearable'\n\nexport function createMappings(wearables: Wearable[], bodyShape = WearableBodyShape.MALE) {\n const mappings: Record<string, string> = {}\n for (const wearable of wearables) {\n try {\n const representation = getRepresentation(wearable, bodyShape)\n for (const file of representation.contents) {\n mappings[file.key] = file.url\n }\n } catch (error) {\n console.warn(\n `Skipping generation of mappings for wearable=\"${wearable.id}\" since it lacks a representation for bodyShape=\"${bodyShape}\"`\n )\n continue\n }\n }\n return mappings\n}\n\n/**\n * Configures the mappings for all the relative paths within a model to the right IPFS in the catalyst\n * @param wearables\n */\nexport function setupMappings(preview: AvatarPreview) {\n const wearables = preview.wearable ? [preview.wearable, ...preview.wearables] : preview.wearables\n const mappings = createMappings(wearables, preview.bodyShape)\n SceneLoader.OnPluginActivatedObservable.add((plugin) => {\n if (plugin.name === 'gltf') {\n const gltf = plugin as GLTFFileLoader\n gltf.preprocessUrlAsync = async (url: string) => {\n const baseUrl = `/content/contents/`\n const parts = url.split(baseUrl)\n return parts.length > 0 && !!parts[1] ? mappings[parts[1]] : url\n }\n }\n })\n}\n","import { AvatarPreview, AvatarPreviewType } from '../avatar'\nimport { getBodyShape } from './body'\nimport { getSlots } from './slots'\nimport { playEmote } from './emotes'\nimport { applyFacialFeatures, getFacialFeatures } from './face'\nimport { setupMappings } from './mappings'\nimport { Asset, center, createScene, loadWearable } from './scene'\nimport { isFacialFeature, isModel, isSuccesful } from './utils'\nimport { WearableBodyShape } from '@dcl/schemas'\n\n/**\n * Initializes Babylon, creates the scene and loads a list of wearables in it\n * @param canvas\n * @param wearables\n * @param options\n */\nexport async function render(canvas: HTMLCanvasElement, preview: AvatarPreview) {\n // create the root scene\n const root = await createScene(canvas, preview)\n\n // setup the mappings for all the contents\n setupMappings(preview)\n\n // load all the wearables into the root scene\n const promises: Promise<void | Asset>[] = []\n\n if (preview.type === AvatarPreviewType.AVATAR) {\n // get slots\n const slots = getSlots(preview)\n\n // get wearables\n const wearables = Array.from(slots.values())\n\n for (const wearable of wearables.filter(isModel)) {\n const promise = loadWearable(root, wearable, preview.bodyShape, preview.skin, preview.hair).catch((error) => {\n console.warn(error.message)\n })\n promises.push(promise)\n }\n const assets = (await Promise.all(promises)).filter(isSuccesful)\n\n // add all assets to scene\n for (const asset of assets) {\n asset.container.addAllToScene()\n }\n\n // build avatar\n const bodyShape = getBodyShape(assets)\n // apply facial features\n const features = wearables.filter(isFacialFeature)\n const { eyes, eyebrows, mouth } = await getFacialFeatures(root, features, preview.bodyShape)\n applyFacialFeatures(root, bodyShape, eyes, eyebrows, mouth, preview)\n\n // play emote\n await playEmote(root, assets, preview)\n } else {\n if (!preview.wearable) {\n throw new Error('No wearable to render')\n }\n const wearable = preview.wearable\n try {\n // try loading with the required body shape\n const asset = await loadWearable(root, wearable, preview.bodyShape, preview.skin, preview.hair)\n asset.container.addAllToScene()\n } catch (error) {\n // default to other body shape if failed\n const asset = await loadWearable(\n root,\n wearable,\n preview.bodyShape === WearableBodyShape.MALE ? WearableBodyShape.FEMALE : WearableBodyShape.MALE,\n preview.skin,\n preview.hair\n )\n asset.container.addAllToScene()\n }\n }\n\n // center the root scene into the camera\n center(root)\n}\n","import React, { useEffect, useRef, useState } from 'react'\nimport classNames from 'classnames'\nimport { WearableBodyShape } from '@dcl/schemas'\nimport { useWindowSize } from '../../hooks/useWindowSize'\nimport { useAvatar } from '../../hooks/useAvatar'\nimport { MessageType, sendMessage } from '../../lib/message'\nimport { AvatarCamera, AvatarEmote, AvatarPreview, AvatarPreviewType } from '../../lib/avatar'\nimport { parseZoom } from '../../lib/zoom'\nimport { Env } from '../../types/env'\nimport './Preview.css'\nimport { render } from '../../lib/babylon/render'\n\nconst Preview: React.FC = () => {\n const [previewError, setPreviewError] = useState('')\n const { width, height } = useWindowSize()\n const [style, setStyle] = useState<React.CSSProperties>({})\n const [isDragging, setIsDragging] = useState(false)\n const [isLoadingModel, setIsLoadingModel] = useState(true)\n const [isLoaded, setIsLoaded] = useState(false)\n const canvasRef = useRef<HTMLCanvasElement>(null)\n const params = new URLSearchParams(window.location.search)\n const contractAddress = params.get('contract')!\n const tokenId = params.get('token')\n const itemId = params.get('item')\n const skin = params.get('skin')\n const hair = params.get('hair')\n const eyes = params.get('eyes')\n const emote = params.get('emote') as AvatarEmote | null\n const camera = params.get('camera') as AvatarCamera | null\n const transparentBackground = params.has('transparentBackground')\n const autoRotateSpeedParam = params.get('autoRotateSpeed') as string | null\n const autoRotateSpeed = autoRotateSpeedParam ? parseFloat(autoRotateSpeedParam) : null\n const offsetXParam = params.get('offsetX') as string | null\n const offsetX = offsetXParam ? parseFloat(offsetXParam) : null\n const offsetYParam = params.get('offsetY') as string | null\n const offsetY = offsetYParam ? parseFloat(offsetYParam) : null\n const offsetZParam = params.get('offsetZ') as string | null\n const offsetZ = offsetZParam ? parseFloat(offsetZParam) : null\n const zoom = parseZoom(params.get('zoom'))\n const bodyShapeParam = params.get('bodyShape') || params.get('shape') // keep supporting deprecated \"shape\" param to avoid breaking changes\n const bodyShape = bodyShapeParam === 'female' ? WearableBodyShape.FEMALE : bodyShapeParam === 'male' ? WearableBodyShape.MALE : null\n const urns = params.getAll('urn')\n const profile = params.get('profile')\n const env = Object.values(Env).reduce((selected, value) => (value === params.get('env') ? value : selected), Env.PROD)\n const [overrides, setOverrides] = useState<Partial<AvatarPreview>>({})\n const [avatar, isLoadingAvatar, avatarError] = useAvatar(\n {\n contractAddress,\n tokenId,\n itemId,\n bodyShape,\n urns,\n env,\n profile,\n skin,\n hair,\n eyes,\n zoom,\n emote,\n camera,\n autoRotateSpeed,\n offsetX,\n offsetY,\n offsetZ,\n },\n overrides\n )\n const [image, setImage] = useState('')\n const [is3D, setIs3D] = useState(true)\n const [isMessageSent, setIsMessageSent] = useState(false)\n\n const error = previewError || avatarError\n const isLoading = (isLoadingModel || isLoadingAvatar) && !error\n const showImage = !!image && !is3D && !isLoading\n const showCanvas = is3D && !isLoading\n\n useEffect(() => {\n if (canvasRef.current && avatar) {\n // rarity background\n setStyle({ backgroundImage: transparentBackground ? undefined : avatar.background.gradient, opacity: 1 })\n\n // set background image\n if (avatar.background.image) {\n setImage(avatar.background.image)\n }\n\n // load model or image (for texture only wearables)\n if (avatar.type === AvatarPreviewType.TEXTURE) {\n setIs3D(false)\n setIsLoadingModel(false)\n setIsLoaded(true)\n } else {\n // preview models\n render(canvasRef.current, avatar)\n .catch((error) => setPreviewError(error.message))\n .finally(() => {\n setIsLoadingModel(false)\n setIsLoaded(true)\n })\n }\n }\n }, [canvasRef.current, avatar]) // eslint-disable-line\n\n // send a mesasge to the parent window when loaded or error occurs\n useEffect(() => {\n if (!isMessageSent) {\n if (isLoaded) {\n sendMessage(MessageType.LOAD)\n setIsMessageSent(true)\n } else if (error) {\n sendMessage(MessageType.ERROR, error)\n setIsMessageSent(true)\n }\n }\n }, [isLoaded, error, isMessageSent])\n\n // receive message from parent window to update options\n useEffect(() => {\n const previous = window.onmessage\n window.onmessage = function (event: MessageEvent) {\n if (event.data && event.data.type === MessageType.UPDATE) {\n const message = event.data as { type: MessageType.UPDATE; options: Partial<AvatarPreview> }\n if (message.options && typeof message.options === 'object') {\n setOverrides(message.options)\n }\n }\n }\n return () => {\n window.onmessage = previous\n }\n }, [])\n\n return (\n <div\n className={classNames('Preview', {\n 'is-dragging': isDragging,\n 'is-loading': isLoading,\n 'is-loaded': isLoaded,\n 'is-3d': is3D && avatar?.camera === AvatarCamera.INTERACTIVE,\n 'has-error': !!error,\n })}\n style={style}\n >\n <img\n src={image}\n className={classNames('thumbnail', {\n 'is-visible': showImage,\n })}\n alt=\"preview\"\n />\n <canvas\n id=\"wearable-preview\"\n className={classNames({\n 'is-visible': showCanvas,\n })}\n width={width}\n height={height}\n ref={canvasRef}\n onMouseDown={() => setIsDragging(is3D && !error)}\n onMouseUp={() => setIsDragging(false)}\n ></canvas>\n {error && <div className=\"error\">{error}</div>}\n </div>\n )\n}\n\nexport default React.memo(Preview)\n","import { useState, useEffect } from 'react'\n\n// Define general type for useWindowSize hook, which includes width and height\ninterface Size {\n width: number | undefined\n height: number | undefined\n}\n\nexport function useWindowSize(): Size {\n // Initialize state with undefined width/height so server and client renders match\n // Learn more here: https://joshwcomeau.com/react/the-perils-of-rehydration/\n const [windowSize, setWindowSize] = useState<Size>({\n width: undefined,\n height: undefined,\n })\n useEffect(() => {\n // Handler to call on window resize\n function handleResize() {\n // Set window width/height to state\n setWindowSize({\n width: window.innerWidth,\n height: window.innerHeight,\n })\n }\n // Add event listener\n window.addEventListener('resize', handleResize)\n // Call handler right away so state gets updated with initial window size\n handleResize()\n // Remove event listener on cleanup\n return () => window.removeEventListener('resize', handleResize)\n }, []) // Empty array ensures that effect is only run on mount\n return windowSize\n}\n","import { useMemo } from 'react'\nimport { AvatarPreview, AvatarPreviewOptions, createAvatarPreview } from '../lib/avatar'\nimport { useFetch } from './useFetch'\n\nexport function useAvatar(options: AvatarPreviewOptions, overrides: Partial<AvatarPreview> = {}) {\n const [avatar, isLoading, error] = useFetch(async () => createAvatarPreview(options))\n const avatarWithOverrides = useMemo(() => {\n const keysToOverride = (Object.keys(overrides) as (keyof AvatarPreview)[]).filter(\n (key) => typeof overrides[key] !== 'undefined' && overrides[key] !== null\n )\n if (avatar && keysToOverride.length > 0) {\n const newAvatar: AvatarPreview = { ...avatar }\n for (const key of keysToOverride) {\n const value = overrides[key]\n if (value) {\n newAvatar[key] = value as never\n }\n }\n return newAvatar\n }\n return avatar\n }, [avatar, overrides])\n\n return [avatarWithOverrides, isLoading, error] as const\n}\n","import React from 'react'\nimport ReactDOM from 'react-dom'\nimport './index.css'\nimport { Preview } from './components/Preview'\n\nReactDOM.render(\n <React.StrictMode>\n <Preview />\n </React.StrictMode>,\n document.getElementById('root')\n)\n"],"sourceRoot":""}
@@ -1,2 +1,2 @@
1
- !function(e){function r(r){for(var n,u,a=r[0],i=r[1],c=r[2],f=0,d=[];f<a.length;f++)u=a[f],Object.prototype.hasOwnProperty.call(o,u)&&o[u]&&d.push(o[u][0]),o[u]=0;for(n in i)Object.prototype.hasOwnProperty.call(i,n)&&(e[n]=i[n]);for(p&&p(r);d.length;)d.shift()();return l.push.apply(l,c||[]),t()}function t(){for(var e,r=0;r<l.length;r++){for(var t=l[r],n=!0,a=1;a<t.length;a++){var i=t[a];0!==o[i]&&(n=!1)}n&&(l.splice(r--,1),e=u(u.s=t[0]))}return e}var n={},o={1:0},l=[];function u(r){if(n[r])return n[r].exports;var t=n[r]={i:r,l:!1,exports:{}};return e[r].call(t.exports,t,t.exports,u),t.l=!0,t.exports}u.m=e,u.c=n,u.d=function(e,r,t){u.o(e,r)||Object.defineProperty(e,r,{enumerable:!0,get:t})},u.r=function(e){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},u.t=function(e,r){if(1&r&&(e=u(e)),8&r)return e;if(4&r&&"object"===typeof e&&e&&e.__esModule)return e;var t=Object.create(null);if(u.r(t),Object.defineProperty(t,"default",{enumerable:!0,value:e}),2&r&&"string"!=typeof e)for(var n in e)u.d(t,n,function(r){return e[r]}.bind(null,n));return t},u.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return u.d(r,"a",r),r},u.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},u.p="https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2059283696.commit-5deed6e/";var a=this["webpackJsonp@dcl/wearable-preview"]=this["webpackJsonp@dcl/wearable-preview"]||[],i=a.push.bind(a);a.push=r,a=a.slice();for(var c=0;c<a.length;c++)r(a[c]);var p=i;t()}([]);
2
- //# sourceMappingURL=runtime-main.86a7a354.js.map
1
+ !function(e){function r(r){for(var n,u,a=r[0],i=r[1],c=r[2],f=0,s=[];f<a.length;f++)u=a[f],Object.prototype.hasOwnProperty.call(o,u)&&o[u]&&s.push(o[u][0]),o[u]=0;for(n in i)Object.prototype.hasOwnProperty.call(i,n)&&(e[n]=i[n]);for(p&&p(r);s.length;)s.shift()();return l.push.apply(l,c||[]),t()}function t(){for(var e,r=0;r<l.length;r++){for(var t=l[r],n=!0,a=1;a<t.length;a++){var i=t[a];0!==o[i]&&(n=!1)}n&&(l.splice(r--,1),e=u(u.s=t[0]))}return e}var n={},o={1:0},l=[];function u(r){if(n[r])return n[r].exports;var t=n[r]={i:r,l:!1,exports:{}};return e[r].call(t.exports,t,t.exports,u),t.l=!0,t.exports}u.m=e,u.c=n,u.d=function(e,r,t){u.o(e,r)||Object.defineProperty(e,r,{enumerable:!0,get:t})},u.r=function(e){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},u.t=function(e,r){if(1&r&&(e=u(e)),8&r)return e;if(4&r&&"object"===typeof e&&e&&e.__esModule)return e;var t=Object.create(null);if(u.r(t),Object.defineProperty(t,"default",{enumerable:!0,value:e}),2&r&&"string"!=typeof e)for(var n in e)u.d(t,n,function(r){return e[r]}.bind(null,n));return t},u.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return u.d(r,"a",r),r},u.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},u.p="https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2065716845.commit-784645d/";var a=this["webpackJsonp@dcl/wearable-preview"]=this["webpackJsonp@dcl/wearable-preview"]||[],i=a.push.bind(a);a.push=r,a=a.slice();for(var c=0;c<a.length;c++)r(a[c]);var p=i;t()}([]);
2
+ //# sourceMappingURL=runtime-main.9ef38739.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../webpack/bootstrap"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","executeModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","deferredModules","apply","checkDeferredModules","result","deferredModule","fulfilled","j","depId","splice","__webpack_require__","s","installedModules","exports","module","l","m","c","d","name","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","p","jsonpArray","this","oldJsonpFunction","slice"],"mappings":"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","file":"static/js/runtime-main.86a7a354.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n \t\tvar executeModules = data[2];\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t\t// add entry modules from loaded chunk to deferred list\n \t\tdeferredModules.push.apply(deferredModules, executeModules || []);\n\n \t\t// run deferred modules when all chunks ready\n \t\treturn checkDeferredModules();\n \t};\n \tfunction checkDeferredModules() {\n \t\tvar result;\n \t\tfor(var i = 0; i < deferredModules.length; i++) {\n \t\t\tvar deferredModule = deferredModules[i];\n \t\t\tvar fulfilled = true;\n \t\t\tfor(var j = 1; j < deferredModule.length; j++) {\n \t\t\t\tvar depId = deferredModule[j];\n \t\t\t\tif(installedChunks[depId] !== 0) fulfilled = false;\n \t\t\t}\n \t\t\tif(fulfilled) {\n \t\t\t\tdeferredModules.splice(i--, 1);\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = deferredModule[0]);\n \t\t\t}\n \t\t}\n\n \t\treturn result;\n \t}\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t1: 0\n \t};\n\n \tvar deferredModules = [];\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2059283696.commit-5deed6e/\";\n\n \tvar jsonpArray = this[\"webpackJsonp@dcl/wearable-preview\"] = this[\"webpackJsonp@dcl/wearable-preview\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// run deferred modules from other chunks\n \tcheckDeferredModules();\n"],"sourceRoot":""}
1
+ {"version":3,"sources":["../webpack/bootstrap"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","executeModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","deferredModules","apply","checkDeferredModules","result","deferredModule","fulfilled","j","depId","splice","__webpack_require__","s","installedModules","exports","module","l","m","c","d","name","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","p","jsonpArray","this","oldJsonpFunction","slice"],"mappings":"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","file":"static/js/runtime-main.9ef38739.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n \t\tvar executeModules = data[2];\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t\t// add entry modules from loaded chunk to deferred list\n \t\tdeferredModules.push.apply(deferredModules, executeModules || []);\n\n \t\t// run deferred modules when all chunks ready\n \t\treturn checkDeferredModules();\n \t};\n \tfunction checkDeferredModules() {\n \t\tvar result;\n \t\tfor(var i = 0; i < deferredModules.length; i++) {\n \t\t\tvar deferredModule = deferredModules[i];\n \t\t\tvar fulfilled = true;\n \t\t\tfor(var j = 1; j < deferredModule.length; j++) {\n \t\t\t\tvar depId = deferredModule[j];\n \t\t\t\tif(installedChunks[depId] !== 0) fulfilled = false;\n \t\t\t}\n \t\t\tif(fulfilled) {\n \t\t\t\tdeferredModules.splice(i--, 1);\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = deferredModule[0]);\n \t\t\t}\n \t\t}\n\n \t\treturn result;\n \t}\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t1: 0\n \t};\n\n \tvar deferredModules = [];\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2065716845.commit-784645d/\";\n\n \tvar jsonpArray = this[\"webpackJsonp@dcl/wearable-preview\"] = this[\"webpackJsonp@dcl/wearable-preview\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// run deferred modules from other chunks\n \tcheckDeferredModules();\n"],"sourceRoot":""}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["types/env.ts","lib/sleep.ts","lib/json.ts","lib/api/nft.ts","lib/avatar.ts","lib/api/peer.ts","lib/color.ts","lib/representation.ts","lib/wearable.ts","lib/zoom.ts","lib/message.ts","hooks/useFetch.ts","lib/babylon/utils.ts","lib/babylon/body.ts","lib/babylon/slots.ts","lib/babylon/camera.ts","lib/babylon/scene.ts","lib/babylon/emotes.ts","lib/babylon/face.ts","lib/babylon/mappings.ts","lib/babylon/render.ts","components/Preview/Preview.tsx","hooks/useWindowSize.ts","hooks/useAvatar.ts","index.tsx"],"names":["Env","sleep","ms","a","Promise","resolve","setTimeout","json","url","attempts","fetch","resp","ok","Error","text","AvatarEmote","AvatarCamera","AvatarPreviewType","nftApiByEnv","DEV","PROD","NFTApi","contractAddress","itemId","env","data","length","tokenId","nft","nftApi","peerByEnv","PeerApi","urn","wearables","profile","profiles","peerApi","formatHex","color","startsWith","numberToHex","value","toString","slice","colorToHex","r","g","b","hexToColor","hex","parsed","parseHex","Color3","parseInt","is","representation","bodyShape","bodyShapes","includes","isMale","WearableBodyShape","MALE","isFemale","FEMALE","getRepresentation","wearable","shape","representations","some","id","find","getRepresentationOrDefault","hasRepresentation","error","getContentUrl","content","contents","key","mainFile","isTexture","endsWith","getWearableByCategory","category","getDefaultCategories","WearableCategory","EYEBROWS","MOUTH","EYES","HAIR","UPPER_BODY","LOWER_BODY","FEET","getDefaultWearableUrn","isWearable","getWearableBodyShape","wearabe","isEmote","getZoom","SKIN","MessageType","DEFAULT_PROFILE","fetchWearable","catch","console","log","fetchProfile","then","avatars","fetchWearableFromContract","options","network","fetchNFT","Network","ETHEREUM","image","split","fetchAvatar","urns","all","map","filter","success","promises","defaultWearable","push","defaultWearables","every","createAvatarPreview","wearablePromise","profilePromise","avatar","skin","hair","eyes","zoom","type","WEARABLE","background","gradient","AVATAR","TEXTURE","Rarity","getGradient","rarity","light","dark","thumbnail","emote","IDLE","Object","values","camera","INTERACTIVE","autoRotateSpeed","isNaN","undefined","offsetX","offsetY","offsetZ","useFetch","fetcher","useState","isLoading","setIsLoading","result","setResult","setError","useEffect","message","finally","sendMessage","event","JSON","stringify","window","parent","postMessage","isCategory","isHidden","asset","hides","replaces","isSuccesful","isModel","isFacialFeature","getBodyShape","assets","part","hasSkin","hideUpperBody","hideLowerBody","hideFeet","hideHead","container","meshes","mesh","name","toLowerCase","setEnabled","categoriesHiddenBySkin","FACIAL_HAIR","getSlots","preview","slots","Map","slot","set","get","reverse","alreadyRemoved","Set","has","replaced","hidden","toRemove","Array","from","delete","add","startAutoRotateBehavior","useAutoRotationBehavior","autoRotationBehavior","idleRotationSpeed","createScene","canvas","engine","Engine","preserveDrawingBuffer","stencil","root","Scene","autoClear","clearColor","Color4","preventDefaultOnPointerDown","GlowLayer","mainTextureFixedSize","blurKernelSize","intensity","ArcRotateCamera","Vector3","mode","Camera","PERSPECTIVE_CAMERA","STATIC","position","warn","attachControl","offset","addInPlace","setTarget","lowerRadiusLimit","upperRadiusLimit","radius","DirectionalLight","HemisphericLight","SpotLight","Math","PI","runRenderLoop","render","loadMask","scene","file","reject","task","TextureAssetTask","onError","errorObject","onSuccess","texture","run","loadTexture","loadAssetContainer","load","extension","SceneLoader","LoadAssetContainerAsync","hairMaterials","skinMaterials","loadWearable","materials","material","mat","albedoColor","FromHexString","alpha","removeMaterial","animationGroups","animationGroup","stop","reset","dispose","center","Mesh","setParent","children","getChildren","child","boundingInfo","getBoundingInfo","min","boundingBox","minimumWorld","max","maximumWorld","i","siblingMin","siblingMax","Minimize","Maximize","setBoundingInfo","BoundingInfo","refreshBoundingInfo","size","extendSize","scale","scaling","multiply","subtractInPlace","loopedEmotes","MONEY","CLAP","isLooped","cache","buildEmoteUrl","baseUrl","process","path","URL","href","loadEmoteFromUrl","loadEmoteFromWearable","playEmote","onAnimationEnd","cameras","loop","emoteDataV0","emoteUrl","emoteAnimationGroup","AnimationGroup","nodes","transformNodes","reduce","node","list","targetedAnimations","targetedAnimation","animation","target","newTargets","newTarget","addTargetedAnimation","play","onAnimationEndObservable","addOnce","getCategoryLoader","features","feature","getFacialFeatures","loadCategory","eyebrows","mouth","applyFacialFeatures","mask","applyTextureAndMask","maskColor","newMaterial","StandardMaterial","alphaMode","PBRMaterial","PBRMATERIAL_ALPHABLEND","backFaceCulling","hasAlpha","sideOrientation","Orientation","CW","diffuseTexture","diffuseColor","Black","emissiveTexture","emissiveColor","setupMappings","mappings","createMappings","OnPluginActivatedObservable","plugin","preprocessUrlAsync","parts","promise","addAllToScene","Preview","previewError","setPreviewError","width","height","windowSize","setWindowSize","handleResize","innerWidth","innerHeight","addEventListener","removeEventListener","useWindowSize","style","setStyle","isDragging","setIsDragging","isLoadingModel","setIsLoadingModel","isLoaded","setIsLoaded","canvasRef","useRef","params","URLSearchParams","location","search","transparentBackground","autoRotateSpeedParam","parseFloat","offsetXParam","offsetYParam","offsetZParam","rawZoom","parsedZoom","parseZoom","bodyShapeParam","getAll","selected","overrides","setOverrides","useMemo","keysToOverride","keys","newAvatar","useAvatar","isLoadingAvatar","avatarError","setImage","is3D","setIs3D","isMessageSent","setIsMessageSent","showImage","showCanvas","current","backgroundImage","opacity","LOAD","ERROR","previous","onmessage","UPDATE","className","classNames","src","alt","ref","onMouseDown","onMouseUp","React","memo","ReactDOM","StrictMode","document","getElementById"],"mappings":"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","file":"static/js/main.3db9196c.chunk.js","sourcesContent":["export enum Env {\n PROD = 'prod',\n DEV = 'dev',\n}\n","export async function sleep(ms: number) {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n","import { sleep } from './sleep'\n\nexport async function json<T>(url: string, attempts = 3): Promise<T> {\n try {\n const resp = await fetch(url)\n if (!resp.ok) {\n throw new Error(await resp.text())\n }\n return resp.json() as Promise<T>\n } catch (error) {\n if (attempts > 0) {\n await sleep(100)\n return json(url, attempts - 1)\n } else {\n throw error\n }\n }\n}\n","import { Item, NFT } from '@dcl/schemas'\nimport { Env } from '../../types/env'\nimport { json } from '../json'\n\nexport const nftApiByEnv: Record<Env, string> = {\n [Env.DEV]: 'https://nft-api.decentraland.io',\n [Env.PROD]: 'https://nft-api.decentraland.org',\n}\n\nclass NFTApi {\n async fetchItem(contractAddress: string, itemId: string, env: Env) {\n const { data } = await json<{ data: Item[] }>(`${nftApiByEnv[env]}/v1/items?contractAddress=${contractAddress}&itemId=${itemId}`)\n if (data.length === 0) {\n throw new Error(`Item not found for contractAddress=\"${contractAddress}\" itemId=\"${itemId}\"`)\n }\n return data[0]\n }\n async fetchNFT(contractAddress: string, tokenId: string, env: Env) {\n const { data } = await json<{ data: { nft: NFT }[] }>(\n `${nftApiByEnv[env]}/v1/nfts?contractAddress=${contractAddress}&tokenId=${tokenId}`\n )\n if (data.length === 0) {\n throw new Error(`NFT not found for contractAddress=\"${contractAddress}\" tokenId=\"${tokenId}\"`)\n }\n return data[0].nft\n }\n}\n\nexport const nftApi = new NFTApi()\n","import { Network, Rarity, WearableBodyShape } from '@dcl/schemas'\nimport { Env } from '../types/env'\nimport { nftApi } from './api/nft'\nimport { peerApi } from './api/peer'\nimport { colorToHex, formatHex } from './color'\nimport { getRepresentationOrDefault, hasRepresentation, isTexture } from './representation'\nimport {\n getDefaultCategories,\n getDefaultWearableUrn,\n getWearableBodyShape,\n getWearableByCategory,\n isEmote,\n isWearable,\n Wearable,\n} from './wearable'\nimport { getZoom } from './zoom'\n\nexport type AvatarPreview = {\n wearable?: Wearable\n wearables: Wearable[]\n bodyShape: WearableBodyShape\n skin: string\n hair: string\n eyes: string\n zoom: number\n type: AvatarPreviewType\n background: AvatarBackground\n emote: AvatarEmote\n camera: AvatarCamera\n autoRotateSpeed: number\n offsetX: number\n offsetY: number\n offsetZ: number\n}\n\nexport type AvatarPreviewOptions = {\n contractAddress?: string | null\n tokenId?: string | null\n itemId?: string | null\n profile?: string | null\n bodyShape?: WearableBodyShape | null\n skin?: string | null\n hair?: string | null\n eyes?: string | null\n urns?: string[] | null\n zoom?: number | null\n emote?: AvatarEmote | null\n camera?: AvatarCamera | null\n autoRotateSpeed?: number | null\n offsetX?: number | null\n offsetY?: number | null\n offsetZ?: number | null\n env?: Env | null\n}\n\nexport type AvatarBackground = {\n image?: string\n gradient: string\n}\n\nexport enum AvatarEmote {\n IDLE = 'idle',\n CLAP = 'clap',\n DAB = 'dab',\n DANCE = 'dance',\n FASHION = 'fashion',\n FASHION_2 = 'fashion-2',\n FASHION_3 = 'fashion-3',\n FASHION_4 = 'fashion-4',\n LOVE = 'love',\n MONEY = 'money',\n}\n\nexport enum AvatarCamera {\n STATIC = 'static',\n INTERACTIVE = 'wearable',\n}\n\nexport enum AvatarPreviewType {\n TEXTURE = 'texture',\n WEARABLE = 'wearable',\n AVATAR = 'avatar',\n}\n\nconst DEFAULT_PROFILE = 'default'\n\nasync function fetchWearable(urn: string, env: Env) {\n return peerApi.fetchWearable(urn, env).catch((error: Error) => console.log(`Failed to load wearable=\"${urn}\"`, error))\n}\n\nasync function fetchProfile(profile: string, env: Env) {\n if (profile === DEFAULT_PROFILE) {\n return null\n }\n return peerApi\n .fetchProfile(profile, env)\n .then((profile) => (profile && profile.avatars.length > 0 ? profile.avatars[0] : null))\n .catch((error: Error) => console.log(`Failed to load profile=\"${profile}\"`, error))\n}\n\nasync function fetchWearableFromContract(options: { contractAddress: string; itemId?: string | null; tokenId?: string | null; env: Env }) {\n const { contractAddress, itemId, tokenId, env } = options\n if (!itemId && !tokenId) {\n throw new Error(`You need to provide an itemId or a tokenId`)\n }\n\n const network = env === Env.PROD ? 'matic' : 'mumbai'\n let urn = `urn:decentraland:${network}:collections-v2:${contractAddress}:${itemId}`\n if (!itemId && !tokenId) {\n throw new Error(`You must provide either tokenId or itemId`)\n } else if (!itemId && tokenId) {\n const nft = await nftApi.fetchNFT(contractAddress, tokenId, env)\n urn =\n nft.network !== Network.ETHEREUM\n ? `urn:decentraland:${network}:collections-v2:${contractAddress}:${nft.itemId}`\n : nft.image.split('contents/')[1].split('/thumbnail')[0] // since the Ethereum collections have a different URN, we extract it from the image path\n }\n return fetchWearable(urn, env)\n}\n\nasync function fetchAvatar(urns: string[], bodyShape: WearableBodyShape, env: Env) {\n let wearables = (await Promise.all([bodyShape, ...urns].map((urn) => fetchWearable(urn, env))))\n .filter(isWearable) // filter out wearables that failed to load\n .filter((wearable) => hasRepresentation(wearable, bodyShape)) // filter out wearables that don't have a representation for the body shape\n // fill default categories\n let success = false\n let attempts = 0\n do {\n const promises: Promise<Wearable | void>[] = []\n for (const category of getDefaultCategories(bodyShape)) {\n const wearable = getWearableByCategory(wearables, category)\n if (!wearable) {\n const urn = getDefaultWearableUrn(category, bodyShape)\n if (urn) {\n const defaultWearable = fetchWearable(urn, env)\n promises.push(defaultWearable)\n } else {\n throw new Error(`Could not get default URN for category=\"${category}\"`)\n }\n }\n }\n const defaultWearables = await Promise.all(promises)\n wearables = [...wearables, ...defaultWearables.filter(isWearable)]\n // make sure all the default wearables were loaded successfully, otherwise retry up to 3 times\n success = defaultWearables.every(isWearable)\n attempts++\n } while (!success && attempts < 3)\n return wearables\n}\n\nexport async function createAvatarPreview(options: AvatarPreviewOptions = {}): Promise<AvatarPreview> {\n const { contractAddress, tokenId, itemId } = options\n const env = options.env || Env.PROD\n\n // load wearable to preview\n let wearablePromise: Promise<Wearable | void> = Promise.resolve()\n if (contractAddress) {\n wearablePromise = fetchWearableFromContract({ contractAddress, tokenId, itemId, env })\n }\n\n // load profile\n const profilePromise = options.profile ? fetchProfile(options.profile, env) : Promise.resolve()\n\n // await promises\n const [wearable, profile] = await Promise.all([wearablePromise, profilePromise] as const)\n\n // use body shape from options, default to the profile one, if no profile default to the wearable bodyShape, if none, default to male\n const bodyShape =\n options.bodyShape ||\n (profile && (profile.avatar.bodyShape as WearableBodyShape)) ||\n (wearable ? getWearableBodyShape(wearable!) : WearableBodyShape.MALE)\n\n // use colors from options, default to profile, if none, use default values\n const skin = formatHex(options.skin || (profile && colorToHex(profile.avatar.skin.color)) || 'cc9b76')\n const hair = formatHex(options.hair || (profile && colorToHex(profile.avatar.hair.color)) || '000000')\n const eyes = formatHex(options.eyes || (profile && colorToHex(profile.avatar.eyes.color)) || '000000')\n\n // merge urns from profile (if any) and extra urns\n const urns = [...(profile ? profile.avatar.wearables : []), ...(options.urns || [])]\n\n let wearables: Wearable[] = []\n let zoom = 1.75\n let type = AvatarPreviewType.WEARABLE\n let background: AvatarBackground = {\n gradient: `radial-gradient(#676370, #18141b)`,\n }\n\n // if loading multiple wearables, or if wearable is emote, render full avatar\n if (urns.length > 0 || (wearable && isEmote(wearable)) || options.profile === DEFAULT_PROFILE) {\n type = AvatarPreviewType.AVATAR\n wearables = await fetchAvatar(urns, bodyShape, env)\n }\n\n if (wearable) {\n zoom = wearables.length > 0 ? zoom : getZoom(wearable)\n const representation = getRepresentationOrDefault(wearable)\n if (isTexture(representation) && type !== AvatarPreviewType.AVATAR) {\n type = AvatarPreviewType.TEXTURE\n }\n const [light, dark] = Rarity.getGradient(wearable.rarity)\n const gradient = `radial-gradient(${light}, ${dark})`\n background = {\n image: wearable.thumbnail,\n gradient,\n }\n }\n\n let emote = AvatarEmote.IDLE\n if (options.emote && Object.values(AvatarEmote).includes(options.emote)) {\n emote = options.emote\n }\n\n let camera = AvatarCamera.INTERACTIVE\n if (options.camera && Object.values(AvatarCamera).includes(options.camera)) {\n camera = options.camera\n }\n const autoRotateSpeed = typeof options.autoRotateSpeed === 'number' && !isNaN(options.autoRotateSpeed) ? options.autoRotateSpeed : 0.2\n\n return {\n wearable: wearable ?? undefined,\n wearables,\n bodyShape,\n skin,\n hair,\n eyes,\n type,\n background,\n emote,\n camera,\n autoRotateSpeed,\n offsetX: options.offsetX || 0,\n offsetY: options.offsetY || 0,\n offsetZ: options.offsetZ || 0,\n zoom: options.zoom || zoom,\n }\n}\n","import { Profile } from '@dcl/schemas'\nimport { Env } from '../../types/env'\nimport { json } from '../json'\nimport { Wearable } from '../wearable'\n\nexport const peerByEnv: Record<Env, string> = {\n [Env.DEV]: 'https://peer.decentraland.zone',\n [Env.PROD]: 'https://peer.decentraland.org',\n}\n\nclass PeerApi {\n async fetchWearable(urn: string, env: Env) {\n const { wearables } = await json<{ wearables: Wearable[] }>(`${peerByEnv[env]}/lambdas/collections/wearables?wearableId=${urn}`)\n if (wearables.length === 0) {\n throw new Error(`Wearable not found for urn=\"${urn}\"`)\n }\n return wearables[0]\n }\n async fetchProfile(profile: string, env: Env) {\n const profiles = await json<Profile[]>(`${peerByEnv[env]}/lambdas/profiles?id=${profile}`)\n return profiles.length > 0 ? profiles[0] : null\n }\n}\n\nexport const peerApi = new PeerApi()\n","import { Color3 } from '@babylonjs/core'\nimport { Color3 as RGB } from '@dcl/schemas'\n\nexport function formatHex(color: string) {\n return color.startsWith('#') ? color : '#' + color\n}\n\nexport function parseHex(color: string) {\n return color.startsWith('#') ? color.slice(1) : color\n}\n\nexport function numberToHex(value: number) {\n const hex = ((value * 255) | 0).toString(16)\n return ('0' + hex).slice(-2)\n}\n\nexport function colorToHex(color: RGB) {\n return numberToHex(color.r) + numberToHex(color.g) + numberToHex(color.b)\n}\n\nexport function hexToColor(hex: string) {\n const parsed = parseHex(hex)\n const color = new Color3(\n parseInt(parsed.slice(0, 2), 16) / 256,\n parseInt(parsed.slice(2, 4), 16) / 256,\n parseInt(parsed.slice(4, 6), 16) / 256\n )\n return color\n}\n","import { WearableBodyShape, WearableRepresentation as WearableRepresentationBroken } from '@dcl/schemas'\nimport { Wearable } from './wearable'\n\nexport type WearableRepresentation = Omit<WearableRepresentationBroken, 'contents'> & { contents: { key: string; url: string }[] }\n\nexport function is(representation: WearableRepresentation, bodyShape: WearableBodyShape) {\n return representation.bodyShapes.includes(bodyShape)\n}\n\nexport function isMale(representation: WearableRepresentation) {\n return is(representation, WearableBodyShape.MALE)\n}\n\nexport function isFemale(representation: WearableRepresentation) {\n return is(representation, WearableBodyShape.FEMALE)\n}\n\nexport function getRepresentation(wearable: Wearable, shape = WearableBodyShape.MALE) {\n switch (shape) {\n case WearableBodyShape.FEMALE: {\n if (!wearable.data.representations.some(isFemale)) {\n throw new Error(`Could not find a BaseFemale representation for wearable=\"${wearable.id}\"`)\n }\n return wearable.data.representations.find(isFemale)!\n }\n case WearableBodyShape.MALE: {\n if (!wearable.data.representations.some(isMale)) {\n throw new Error(`Could not find a BaseMale representation for wearable=\"${wearable.id}\"`)\n }\n return wearable.data.representations.find(isMale)!\n }\n }\n}\n\nexport function getRepresentationOrDefault(wearable: Wearable, shape = WearableBodyShape.MALE) {\n if (hasRepresentation(wearable, shape)) {\n return getRepresentation(wearable, shape)\n }\n if (wearable.data.representations.length > 0) {\n return wearable.data.representations[0]\n }\n throw new Error(`The wearable=\"${wearable.id}\" has no representation`)\n}\n\nexport function hasRepresentation(wearable: Wearable, shape = WearableBodyShape.MALE) {\n try {\n getRepresentation(wearable, shape)\n return true\n } catch (error) {\n return false\n }\n}\n\nexport function getContentUrl(representation: WearableRepresentation) {\n const content = representation.contents.find((content) => content.key === representation.mainFile)\n if (!content) {\n throw new Error(`Could not find main file`)\n }\n return content.url\n}\n\nexport function isTexture(representation: WearableRepresentation) {\n return representation.mainFile.endsWith('png')\n}\n","import { Wearable as WearableBroken, WearableBodyShape, WearableCategory } from '@dcl/schemas'\nimport { WearableRepresentation } from './representation'\n\nexport type Wearable = Omit<WearableBroken, 'data' | 'names'> & {\n name: string\n data: Omit<WearableBroken['data'], 'representations'> & {\n representations: WearableRepresentation[]\n }\n emoteDataV0?: {\n loop: boolean\n }\n}\n\nexport function getWearableByCategory(wearables: Wearable[], category: WearableCategory) {\n return wearables.find((wearable) => wearable.data.category === category) || null\n}\n\nexport function getDefaultCategories(shape: WearableBodyShape) {\n switch (shape) {\n case WearableBodyShape.MALE:\n return [\n WearableCategory.EYEBROWS,\n WearableCategory.MOUTH,\n WearableCategory.EYES,\n WearableCategory.HAIR,\n WearableCategory.UPPER_BODY,\n WearableCategory.LOWER_BODY,\n WearableCategory.FEET,\n ]\n case WearableBodyShape.FEMALE:\n return [\n WearableCategory.EYEBROWS,\n WearableCategory.MOUTH,\n WearableCategory.EYES,\n WearableCategory.HAIR,\n WearableCategory.UPPER_BODY,\n WearableCategory.LOWER_BODY,\n WearableCategory.FEET,\n ]\n }\n}\n\nexport function getDefaultWearableUrn(category: WearableCategory, shape: WearableBodyShape) {\n switch (category) {\n case WearableCategory.EYEBROWS:\n return shape === WearableBodyShape.MALE\n ? 'urn:decentraland:off-chain:base-avatars:eyebrows_00'\n : 'urn:decentraland:off-chain:base-avatars:f_eyebrows_00'\n case WearableCategory.MOUTH:\n return shape === WearableBodyShape.MALE\n ? 'urn:decentraland:off-chain:base-avatars:mouth_00'\n : 'urn:decentraland:off-chain:base-avatars:f_mouth_00'\n case WearableCategory.EYES:\n return shape === WearableBodyShape.MALE\n ? 'urn:decentraland:off-chain:base-avatars:eyes_00'\n : 'urn:decentraland:off-chain:base-avatars:f_eyes_00'\n case WearableCategory.HAIR:\n return shape === WearableBodyShape.MALE\n ? 'urn:decentraland:off-chain:base-avatars:casual_hair_01'\n : 'urn:decentraland:off-chain:base-avatars:standard_hair'\n case WearableCategory.UPPER_BODY:\n return shape === WearableBodyShape.MALE\n ? 'urn:decentraland:off-chain:base-avatars:green_hoodie'\n : 'urn:decentraland:off-chain:base-avatars:f_sweater'\n case WearableCategory.LOWER_BODY:\n return shape === WearableBodyShape.MALE\n ? 'urn:decentraland:off-chain:base-avatars:brown_pants'\n : 'urn:decentraland:off-chain:base-avatars:f_jeans'\n case WearableCategory.FEET:\n return shape === WearableBodyShape.MALE\n ? 'urn:decentraland:off-chain:base-avatars:sneakers'\n : 'urn:decentraland:off-chain:base-avatars:bun_shoes'\n default:\n throw new Error(`There is no default wearable for category=\"${category}\"`)\n }\n}\n\nexport function isWearable(value: Wearable | void): value is Wearable {\n return !!value\n}\n\nexport function getWearableBodyShape(wearabe: Wearable): WearableBodyShape {\n const bodyShapes = [WearableBodyShape.MALE, WearableBodyShape.FEMALE]\n return (\n bodyShapes.find((bodyShape) => wearabe.data.representations.some((representation) => representation.bodyShapes.includes(bodyShape))) ||\n bodyShapes[0]\n )\n}\n\nexport function isEmote(wearable: Wearable) {\n return !!wearable && `emoteDataV0` in wearable\n}\n","import { WearableCategory } from '@dcl/schemas'\nimport { Wearable } from './wearable'\n\nexport function parseZoom(rawZoom: string | null) {\n const parsedZoom = rawZoom ? parseFloat(rawZoom) : null\n const zoom = parsedZoom === null || isNaN(parsedZoom) ? null : (Math.min(Math.max(parsedZoom, 0), 100) * 1.8) / 100 + 1\n return zoom\n}\n\n/**\n * Returns the right zoom for a given category\n * @param category\n * @returns\n */\nexport function getZoom(wearable?: Wearable | void) {\n const category = wearable?.data.category\n switch (category) {\n case WearableCategory.UPPER_BODY:\n return 2\n case WearableCategory.SKIN:\n return 1.75\n default:\n return 1.25\n }\n}\n","export enum MessageType {\n LOAD = 'load',\n ERROR = 'error',\n UPDATE = 'update',\n}\n\nexport function sendMessage(type: MessageType, message?: string) {\n const event = JSON.stringify({ type, message })\n window.parent && window.parent.postMessage(event, '*')\n}\n","import { useEffect, useState } from 'react'\n\nexport function useFetch<T>(fetcher: () => Promise<T>) {\n const [isLoading, setIsLoading] = useState(false)\n const [result, setResult] = useState<T | null>(null)\n const [error, setError] = useState('')\n useEffect(() => {\n setIsLoading(true)\n fetcher()\n .then((result) => setResult(result))\n .catch((error) => setError(error.message))\n .finally(() => setIsLoading(false))\n }, []) // eslint-disable-line\n return [result, isLoading, error] as const\n}\n","import { WearableCategory } from '@dcl/schemas'\nimport { getRepresentationOrDefault, isTexture } from '../representation'\nimport { Wearable } from '../wearable'\nimport { Asset } from './scene'\n\nexport function isCategory(category: WearableCategory) {\n return (wearable: Wearable) => wearable.data.category === category\n}\n\nexport function isHidden(category: WearableCategory) {\n return (asset: Asset) => {\n return (\n asset.wearable.data.category === category ||\n (asset.wearable.data.hides || []).includes(category) ||\n (asset.wearable.data.replaces || []).includes(category)\n )\n }\n}\n\nexport function isSuccesful(result: void | Asset): result is Asset {\n return !!result\n}\n\nexport function isModel(wearable: Wearable): boolean {\n const representation = getRepresentationOrDefault(wearable)\n return !isTexture(representation)\n}\n\nexport function isFacialFeature(wearable: Wearable): boolean {\n return !isModel(wearable)\n}\n","import { WearableCategory } from '@dcl/schemas'\nimport { Asset } from './scene'\nimport { isHidden } from './utils'\n\nexport function getBodyShape(assets: Asset[]) {\n const bodyShape = assets.find((part) => part.wearable.data.category === ('body_shape' as WearableCategory))\n\n if (!bodyShape) {\n throw new Error(`Could not find a bodyShape when trying to hide base body parts`)\n }\n\n // hide base body parts if necessary\n const hasSkin = assets.some((part) => part.wearable.data.category === WearableCategory.SKIN)\n const hideUpperBody = hasSkin || assets.some(isHidden(WearableCategory.UPPER_BODY))\n const hideLowerBody = hasSkin || assets.some(isHidden(WearableCategory.LOWER_BODY))\n const hideFeet = hasSkin || assets.some(isHidden(WearableCategory.FEET))\n const hideHead = hasSkin || assets.some(isHidden('head' as WearableCategory))\n\n for (const mesh of bodyShape.container.meshes) {\n const name = mesh.name.toLowerCase()\n if (name.endsWith('ubody_basemesh') && hideUpperBody) {\n mesh.setEnabled(false)\n }\n if (name.endsWith('lbody_basemesh') && hideLowerBody) {\n mesh.setEnabled(false)\n }\n if (name.endsWith('feet_basemesh') && hideFeet) {\n mesh.setEnabled(false)\n }\n if (name.endsWith('head') && hideHead) {\n mesh.setEnabled(false)\n }\n if (name.endsWith('head_basemesh') && hideHead) {\n mesh.setEnabled(false)\n }\n if (name.endsWith('mask_eyes') && hideHead) {\n mesh.setEnabled(false)\n }\n if (name.endsWith('mask_eyebrows') && hideHead) {\n mesh.setEnabled(false)\n }\n if (name.endsWith('mask_mouth') && hideHead) {\n mesh.setEnabled(false)\n }\n }\n\n return bodyShape\n}\n","import { WearableCategory } from '@dcl/schemas'\nimport { AvatarPreview } from '../avatar'\nimport { hasRepresentation } from '../representation'\nimport { isEmote, Wearable } from '../wearable'\n\nconst categoriesHiddenBySkin = [\n WearableCategory.HAIR,\n WearableCategory.FACIAL_HAIR,\n WearableCategory.MOUTH,\n WearableCategory.EYEBROWS,\n WearableCategory.EYES,\n WearableCategory.UPPER_BODY,\n WearableCategory.LOWER_BODY,\n WearableCategory.FEET,\n]\n\nexport function getSlots(preview: AvatarPreview) {\n const slots = new Map<WearableCategory, Wearable>()\n\n let wearables: Wearable[] = preview.wearables.filter((wearable) => !isEmote(wearable)) // remove emotes if any\n\n // remove other wearables that hide the equipped wearable\n if (preview.wearable && !isEmote(preview.wearable)) {\n wearables = preview.wearables.filter((wearable) => {\n if (preview.wearable) {\n const { category, hides, replaces } = preview.wearable.data\n if (wearable.data.category === 'skin') {\n if (categoriesHiddenBySkin.includes(category)) {\n return false\n }\n if (hides && hides.includes('head' as WearableCategory)) {\n return false\n }\n if (replaces && replaces.includes('head' as WearableCategory)) {\n return false\n }\n }\n if (wearable.data.hides && wearable.data.hides.includes(category)) {\n return false\n }\n if (wearable.data.replaces && wearable.data.replaces.includes(category)) {\n return false\n }\n }\n return true\n })\n // add the equipped wearable at the end\n wearables.push(preview.wearable)\n }\n\n // arrange wearbles in slots\n for (const wearable of wearables) {\n const slot = wearable.data.category\n if (hasRepresentation(wearable, preview.bodyShape)) {\n slots.set(slot, wearable)\n }\n }\n let hasSkin = false\n // grab only the wearables that ended up in the map, and process in reverse order (last wearables can hide/replace the first ones)\n wearables = wearables.filter((wearable) => slots.get(wearable.data.category) === wearable).reverse()\n const alreadyRemoved = new Set<string>()\n for (const wearable of wearables) {\n const category = wearable.data.category\n if (alreadyRemoved.has(category)) {\n continue\n }\n const replaced = wearable.data.replaces || []\n const hidden = wearable.data.hides || []\n const toRemove = Array.from(new Set([...replaced, ...hidden]))\n for (const slot of toRemove) {\n if (slot !== category) {\n slots.delete(slot)\n alreadyRemoved.add(slot)\n }\n }\n if (wearable.data.category === WearableCategory.SKIN) {\n hasSkin = true\n }\n }\n // skins hide all the following slots\n if (hasSkin) {\n for (const category of categoriesHiddenBySkin) {\n slots.delete(category)\n }\n }\n\n return slots\n}\n","import { ArcRotateCamera } from '@babylonjs/core'\nimport { AvatarPreview } from '../avatar'\n\nexport function startAutoRotateBehavior(camera: ArcRotateCamera, preview: AvatarPreview) {\n if (camera) {\n camera.useAutoRotationBehavior = true\n if (camera.autoRotationBehavior) {\n camera.autoRotationBehavior.idleRotationSpeed = preview.autoRotateSpeed\n }\n }\n}\n","import {\n ArcRotateCamera,\n AssetContainer,\n BoundingInfo,\n Camera,\n Color3,\n Color4,\n DirectionalLight,\n Engine,\n GlowLayer,\n HemisphericLight,\n Mesh,\n PBRMaterial,\n Scene,\n SceneLoader,\n SpotLight,\n Texture,\n TextureAssetTask,\n Vector3,\n} from '@babylonjs/core'\nimport '@babylonjs/loaders'\nimport { WearableBodyShape } from '@dcl/schemas'\nimport { AvatarCamera, AvatarPreview, AvatarPreviewType } from '../avatar'\nimport { getContentUrl, getRepresentation, isTexture } from '../representation'\nimport { Wearable } from '../wearable'\nimport { startAutoRotateBehavior } from './camera'\n\nexport type Asset = {\n container: AssetContainer\n wearable: Wearable\n}\n\n/**\n * It refreshes the bounding info of a mesh, taking into account all of its children\n * @param parent\n */\nfunction refreshBoundingInfo(parent: Mesh) {\n const children = parent.getChildren().filter((mesh) => mesh.id !== '__root__')\n if (children.length > 0) {\n const child = children[0] as Mesh\n // child.showBoundingBox = true\n let boundingInfo = child.getBoundingInfo()\n\n let min = boundingInfo.boundingBox.minimumWorld.add(child.position)\n let max = boundingInfo.boundingBox.maximumWorld.add(child.position)\n\n for (let i = 1; i < children.length; i++) {\n const child = children[i] as Mesh\n // child.showBoundingBox = true\n boundingInfo = child.getBoundingInfo()\n const siblingMin = boundingInfo.boundingBox.minimumWorld.add(child.position)\n const siblingMax = boundingInfo.boundingBox.maximumWorld.add(child.position)\n\n min = Vector3.Minimize(min, siblingMin)\n max = Vector3.Maximize(max, siblingMax)\n }\n\n parent.setBoundingInfo(new BoundingInfo(min, max))\n }\n}\n\n/**\n * Creates a Scene with the right camera, light and effects\n * @param canvas\n * @param zoom\n * @returns\n */\nexport async function createScene(canvas: HTMLCanvasElement, preview: AvatarPreview) {\n // Create engine\n const engine = new Engine(canvas, true, {\n preserveDrawingBuffer: true,\n stencil: true,\n })\n\n // Load GLB/GLTF\n const root = new Scene(engine)\n root.autoClear = true\n root.clearColor = new Color4(0, 0, 0, 0)\n root.preventDefaultOnPointerDown = false\n\n // effects\n var glow = new GlowLayer('glow', root, {\n mainTextureFixedSize: 1024,\n blurKernelSize: 64,\n })\n glow.intensity = 0.2\n\n // Setup Camera\n var camera = new ArcRotateCamera('camera', 0, 0, 0, new Vector3(0, 0, 0), root)\n camera.mode = Camera.PERSPECTIVE_CAMERA\n switch (preview.camera) {\n case AvatarCamera.INTERACTIVE: {\n switch (preview.type) {\n case AvatarPreviewType.WEARABLE: {\n startAutoRotateBehavior(camera, preview)\n camera.position = new Vector3(-2, 2, 2)\n break\n }\n case AvatarPreviewType.AVATAR: {\n camera.position = new Vector3(0, 1, 3.5)\n break\n }\n default: {\n console.warn(`Unexpected preview.type=\"${preview.type}\"`)\n // do nothing\n }\n }\n camera.attachControl(canvas, true)\n break\n }\n case AvatarCamera.STATIC: {\n camera.position = new Vector3(0, 1, 3.5)\n break\n }\n }\n const offset = new Vector3(preview.offsetX, preview.offsetY, preview.offsetZ)\n camera.position.addInPlace(offset)\n camera.setTarget(offset)\n camera.lowerRadiusLimit = camera.upperRadiusLimit = camera.radius / preview.zoom\n\n // Setup lights\n var directional = new DirectionalLight('directional', new Vector3(0, 0, 1), root)\n directional.intensity = 1\n var top = new HemisphericLight('top', new Vector3(0, -1, 0), root)\n top.intensity = 1\n var bottom = new HemisphericLight('bottom', new Vector3(0, 1, 0), root)\n bottom.intensity = 1\n var spot = new SpotLight('spot', new Vector3(-2, 2, 2), new Vector3(2, -2, -2), Math.PI / 2, 1000, root)\n spot.intensity = 1\n\n // render loop\n engine.runRenderLoop(() => root.render())\n\n return root\n}\n\nexport async function loadMask(scene: Scene, wearable: Wearable, bodyShape: WearableBodyShape): Promise<Texture | null> {\n const name = wearable.id\n const representation = getRepresentation(wearable, bodyShape)\n const file = representation.contents.find((file) => file.key.toLowerCase().endsWith('_mask.png'))\n if (file) {\n return new Promise((resolve, reject) => {\n const task = new TextureAssetTask(name, file.url, true, false)\n task.onError = () => reject(task.errorObject)\n task.onSuccess = () => {\n resolve(task.texture)\n }\n task.run(scene, () => resolve(task.texture), reject)\n })\n }\n return null\n}\n\nexport async function loadTexture(scene: Scene, wearable: Wearable, bodyShape: WearableBodyShape): Promise<Texture | null> {\n const name = wearable.id\n const representation = getRepresentation(wearable, bodyShape)\n const file = representation.contents.find(\n (file) => file.key.toLowerCase().endsWith('.png') && !file.key.toLowerCase().endsWith('_mask.png')\n )\n if (file) {\n return new Promise((resolve, reject) => {\n const task = new TextureAssetTask(name, file.url, true, false)\n task.onError = () => reject(task.errorObject)\n task.onSuccess = () => {\n resolve(task.texture)\n }\n task.run(scene, () => resolve(task.texture), reject)\n })\n }\n return null\n}\n\nexport async function loadAssetContainer(scene: Scene, url: string) {\n const load = async (url: string, extension: string) => SceneLoader.LoadAssetContainerAsync(url, '', scene, null, extension)\n // try with GLB, if it fails try with GLTF\n try {\n return await load(url, '.glb')\n } catch (error) {\n return await load(url, '.gltf')\n }\n}\n\n/**\n * Loads a wearable into the Scene, using a given a body shape, skin and hair color\n * @param scene\n * @param wearable\n * @param bodyShape\n * @param skin\n * @param hair\n */\n\nconst hairMaterials = ['hair_mat']\nconst skinMaterials = ['avatarskin_mat', 'skin-f']\nexport async function loadWearable(scene: Scene, wearable: Wearable, bodyShape = WearableBodyShape.MALE, skin?: string, hair?: string) {\n const representation = getRepresentation(wearable, bodyShape)\n if (isTexture(representation)) {\n throw new Error(`The wearable=\"${wearable.id}\" is a texture`)\n }\n const url = getContentUrl(representation)\n const container = await loadAssetContainer(scene, url)\n\n // Clean up\n for (let material of container.materials) {\n if (hairMaterials.some((mat) => material.name.toLowerCase().includes(mat))) {\n if (hair) {\n const pbr = material as PBRMaterial\n pbr.albedoColor = Color3.FromHexString(hair)\n } else {\n material.alpha = 0\n scene.removeMaterial(material)\n }\n }\n if (skinMaterials.some((mat) => material.name.toLowerCase().includes(mat))) {\n if (skin) {\n const pbr = material as PBRMaterial\n pbr.albedoColor = Color3.FromHexString(skin)\n } else {\n material.alpha = 0\n scene.removeMaterial(material)\n }\n }\n }\n\n // Stop any animations\n for (const animationGroup of container.animationGroups) {\n animationGroup.stop()\n animationGroup.reset()\n animationGroup.dispose()\n }\n\n return { container, wearable }\n}\n\n/**\n * Center and resizes a Scene to fit in the camera view\n * @param scene\n */\n\nexport function center(scene: Scene) {\n // Setup parent\n var parent = new Mesh('parent', scene)\n for (const mesh of scene.meshes) {\n if (mesh !== parent) {\n mesh.setParent(parent)\n }\n }\n\n // resize and center\n refreshBoundingInfo(parent)\n const bounds = parent.getBoundingInfo().boundingBox.extendSize\n const size = bounds.length()\n const scale = new Vector3(1 / size, 1 / size, 1 / size)\n parent.scaling = scale\n const center = parent.getBoundingInfo().boundingBox.center.multiply(scale)\n parent.position.subtractInPlace(center)\n}\n","import { AnimationGroup, ArcRotateCamera, AssetContainer, Scene, TransformNode } from '@babylonjs/core'\nimport { AvatarCamera, AvatarEmote, AvatarPreview } from '../avatar'\nimport { getRepresentation } from '../representation'\nimport { isEmote, Wearable } from '../wearable'\nimport { startAutoRotateBehavior } from './camera'\nimport { Asset, loadAssetContainer } from './scene'\n\nconst loopedEmotes = [AvatarEmote.IDLE, AvatarEmote.MONEY, AvatarEmote.CLAP]\n\nfunction isLooped(emote: AvatarEmote) {\n return loopedEmotes.includes(emote)\n}\n\n// cache emotes, this is so wecan play on loop without downloading the GLB again\nconst cache: Record<string, AssetContainer> = {}\n\nexport function buildEmoteUrl(emote: AvatarEmote) {\n let baseUrl = process.env.PUBLIC_URL || ''\n if (!baseUrl.endsWith('/')) {\n baseUrl += '/'\n }\n const path = `./emotes/${emote}.glb`\n const url = baseUrl.startsWith('http') ? new URL(path, baseUrl).href : path\n return url\n}\n\nexport async function loadEmoteFromUrl(scene: Scene, url: string) {\n let container = cache[url]\n if (!container) {\n container = await loadAssetContainer(scene, url)\n if (container.animationGroups.length === 0) {\n throw new Error(`No animation groups found for emote with url=${url}`)\n }\n cache[url] = container\n }\n return container\n}\n\nexport async function loadEmoteFromWearable(scene: Scene, wearable: Wearable, preview: AvatarPreview) {\n const representation = getRepresentation(wearable, preview.bodyShape)\n const content = representation.contents.find((content) => content.key === representation.mainFile)\n if (!content) {\n throw new Error(`Could not find a valid content in representation for wearable=${wearable.id} and bodyShape=${preview.bodyShape}`)\n }\n return loadEmoteFromUrl(scene, content.url)\n}\n\nexport async function playEmote(scene: Scene, assets: Asset[], preview: AvatarPreview) {\n // load asset container for emote\n let container: AssetContainer | undefined\n let loop = isLooped(preview.emote)\n if (preview.wearable && isEmote(preview.wearable)) {\n try {\n container = await loadEmoteFromWearable(scene, preview.wearable, preview)\n if (preview.wearable.emoteDataV0?.loop) {\n loop = true\n }\n } catch (error) {\n console.warn(`Could not load emote=${preview.wearable.id}`)\n }\n }\n if (!container) {\n const emoteUrl = buildEmoteUrl(preview.emote)\n container = await loadEmoteFromUrl(scene, emoteUrl)\n }\n\n // start camera rotation after animation ends\n async function onAnimationEnd() {\n if (preview.camera !== AvatarCamera.STATIC) {\n const camera = scene.cameras[0] as ArcRotateCamera\n startAutoRotateBehavior(camera, preview)\n }\n if (loop) {\n // keep playing idle animation on loop\n playEmote(scene, assets, preview)\n }\n }\n\n // play emote animation\n try {\n const emoteAnimationGroup = new AnimationGroup('emote', scene)\n for (const asset of assets) {\n // store all the transform nodes in a map, there can be repeated node ids\n // if a wearable has multiple representations, so for each id we keep an array of nodes\n const nodes = asset.container.transformNodes.reduce((map, node) => {\n const list = map.get(node.id) || []\n list.push(node)\n return map.set(node.id, list)\n }, new Map<string, TransformNode[]>())\n // apply each targeted animation from the emote asset container to the transform nodes of all the wearables\n for (const targetedAnimation of container.animationGroups[0].targetedAnimations) {\n const animation = targetedAnimation.animation\n const target = targetedAnimation.target as TransformNode\n const newTargets = nodes.get(target.id)\n if (newTargets && newTargets.length > 0) {\n for (const newTarget of newTargets) {\n emoteAnimationGroup.addTargetedAnimation(animation, newTarget)\n }\n }\n }\n }\n // play animation group and apply\n emoteAnimationGroup.play()\n emoteAnimationGroup.onAnimationEndObservable.addOnce(onAnimationEnd)\n } catch (error) {\n console.warn(`Could not play emote=${preview.emote}`, error)\n }\n}\n\nexport function shouldPlayEmote(preview: AvatarPreview) {\n return preview.emote\n}\n","import { AbstractMesh, Color3, Orientation, PBRMaterial, Scene, StandardMaterial, Texture } from '@babylonjs/core'\nimport { WearableBodyShape, WearableCategory } from '@dcl/schemas'\nimport { AvatarPreview } from '../avatar'\nimport { hexToColor } from '../color'\nimport { Wearable } from '../wearable'\nimport { Asset, loadMask, loadTexture } from './scene'\nimport { isCategory } from './utils'\n\nfunction getCategoryLoader(scene: Scene, features: Wearable[], bodyShape: WearableBodyShape) {\n return async (category: WearableCategory) => {\n const feature = features.find(isCategory(category))\n if (feature) {\n return Promise.all([loadTexture(scene, feature, bodyShape), loadMask(scene, feature, bodyShape)]) as Promise<\n [Texture | null, Texture | null]\n >\n }\n return [null, null] as [null, null]\n }\n}\n\nexport async function getFacialFeatures(scene: Scene, features: Wearable[], bodyShape: WearableBodyShape) {\n const loadCategory = getCategoryLoader(scene, features, bodyShape)\n const [eyes, eyebrows, mouth] = await Promise.all([\n loadCategory(WearableCategory.EYES),\n loadCategory(WearableCategory.EYEBROWS),\n loadCategory(WearableCategory.MOUTH),\n ])\n return { eyes, eyebrows, mouth }\n}\n\nexport async function applyFacialFeatures(\n scene: Scene,\n bodyShape: Asset,\n eyes: [Texture | null, Texture | null],\n eyebrows: [Texture | null, Texture | null],\n mouth: [Texture | null, Texture | null],\n preview: AvatarPreview\n) {\n for (const mesh of bodyShape.container.meshes) {\n if (mesh.name.toLowerCase().endsWith('mask_eyes')) {\n const [texture, mask] = eyes\n if (texture) {\n applyTextureAndMask(scene, 'eyes', mesh, texture, preview.eyes, mask, '#ffffff')\n }\n }\n if (mesh.name.toLowerCase().endsWith('mask_eyebrows')) {\n const [texture, mask] = eyebrows\n if (texture) {\n applyTextureAndMask(scene, 'eyebrows', mesh, texture, preview.hair, mask, preview.hair)\n }\n }\n if (mesh.name.toLowerCase().endsWith('mask_mouth')) {\n const [texture, mask] = mouth\n if (texture) {\n applyTextureAndMask(scene, 'mouth', mesh, texture, preview.skin, mask, preview.skin)\n }\n }\n }\n}\n\nfunction applyTextureAndMask(\n scene: Scene,\n name: string,\n mesh: AbstractMesh,\n texture: Texture,\n color: string,\n mask: Texture | null,\n maskColor: string\n) {\n const newMaterial = new StandardMaterial(`${name}_standard_material`, scene)\n newMaterial.alphaMode = PBRMaterial.PBRMATERIAL_ALPHABLEND\n newMaterial.backFaceCulling = true\n texture.hasAlpha = true\n newMaterial.sideOrientation = Orientation.CW\n newMaterial.diffuseTexture = texture\n newMaterial.diffuseColor = mask ? Color3.Black() : hexToColor(maskColor)\n if (mask) {\n newMaterial.emissiveTexture = mask\n newMaterial.emissiveColor = hexToColor(color)\n }\n mesh.material = newMaterial\n}\n","import { SceneLoader } from '@babylonjs/core'\nimport { GLTFFileLoader } from '@babylonjs/loaders'\nimport { WearableBodyShape } from '@dcl/schemas'\nimport { AvatarPreview } from '../avatar'\nimport { getRepresentation } from '../representation'\nimport { Wearable } from '../wearable'\n\nexport function createMappings(wearables: Wearable[], bodyShape = WearableBodyShape.MALE) {\n const mappings: Record<string, string> = {}\n for (const wearable of wearables) {\n try {\n const representation = getRepresentation(wearable, bodyShape)\n for (const file of representation.contents) {\n mappings[file.key] = file.url\n }\n } catch (error) {\n console.warn(\n `Skipping generation of mappings for wearable=\"${wearable.id}\" since it lacks a representation for bodyShape=\"${bodyShape}\"`\n )\n continue\n }\n }\n return mappings\n}\n\n/**\n * Configures the mappings for all the relative paths within a model to the right IPFS in the catalyst\n * @param wearables\n */\nexport function setupMappings(preview: AvatarPreview) {\n const wearables = preview.wearable ? [preview.wearable, ...preview.wearables] : preview.wearables\n const mappings = createMappings(wearables, preview.bodyShape)\n SceneLoader.OnPluginActivatedObservable.add((plugin) => {\n if (plugin.name === 'gltf') {\n const gltf = plugin as GLTFFileLoader\n gltf.preprocessUrlAsync = async (url: string) => {\n const baseUrl = `/content/contents/`\n const parts = url.split(baseUrl)\n return parts.length > 0 && !!parts[1] ? mappings[parts[1]] : url\n }\n }\n })\n}\n","import { AvatarPreview, AvatarPreviewType } from '../avatar'\nimport { getBodyShape } from './body'\nimport { getSlots } from './slots'\nimport { playEmote } from './emotes'\nimport { applyFacialFeatures, getFacialFeatures } from './face'\nimport { setupMappings } from './mappings'\nimport { Asset, center, createScene, loadWearable } from './scene'\nimport { isFacialFeature, isModel, isSuccesful } from './utils'\nimport { WearableBodyShape } from '@dcl/schemas'\n\n/**\n * Initializes Babylon, creates the scene and loads a list of wearables in it\n * @param canvas\n * @param wearables\n * @param options\n */\nexport async function render(canvas: HTMLCanvasElement, preview: AvatarPreview) {\n // create the root scene\n const root = await createScene(canvas, preview)\n\n // setup the mappings for all the contents\n setupMappings(preview)\n\n // load all the wearables into the root scene\n const promises: Promise<void | Asset>[] = []\n\n if (preview.type === AvatarPreviewType.AVATAR) {\n // get slots\n const slots = getSlots(preview)\n\n // get wearables\n const wearables = Array.from(slots.values())\n\n for (const wearable of wearables.filter(isModel)) {\n const promise = loadWearable(root, wearable, preview.bodyShape, preview.skin, preview.hair).catch((error) => {\n console.warn(error.message)\n })\n promises.push(promise)\n }\n const assets = (await Promise.all(promises)).filter(isSuccesful)\n\n // add all assets to scene\n for (const asset of assets) {\n asset.container.addAllToScene()\n }\n\n // build avatar\n const bodyShape = getBodyShape(assets)\n // apply facial features\n const features = wearables.filter(isFacialFeature)\n const { eyes, eyebrows, mouth } = await getFacialFeatures(root, features, preview.bodyShape)\n applyFacialFeatures(root, bodyShape, eyes, eyebrows, mouth, preview)\n\n // play emote\n await playEmote(root, assets, preview)\n } else {\n if (!preview.wearable) {\n throw new Error('No wearable to render')\n }\n const wearable = preview.wearable\n try {\n // try loading with the required body shape\n const asset = await loadWearable(root, wearable, preview.bodyShape, preview.skin, preview.hair)\n asset.container.addAllToScene()\n } catch (error) {\n // default to other body shape if failed\n const asset = await loadWearable(\n root,\n wearable,\n preview.bodyShape === WearableBodyShape.MALE ? WearableBodyShape.FEMALE : WearableBodyShape.MALE,\n preview.skin,\n preview.hair\n )\n asset.container.addAllToScene()\n }\n }\n\n // center the root scene into the camera\n center(root)\n}\n","import React, { useEffect, useRef, useState } from 'react'\nimport classNames from 'classnames'\nimport { WearableBodyShape } from '@dcl/schemas'\nimport { useWindowSize } from '../../hooks/useWindowSize'\nimport { useAvatar } from '../../hooks/useAvatar'\nimport { MessageType, sendMessage } from '../../lib/message'\nimport { AvatarCamera, AvatarEmote, AvatarPreview, AvatarPreviewType } from '../../lib/avatar'\nimport { parseZoom } from '../../lib/zoom'\nimport { Env } from '../../types/env'\nimport './Preview.css'\nimport { render } from '../../lib/babylon/render'\n\nconst Preview: React.FC = () => {\n const [previewError, setPreviewError] = useState('')\n const { width, height } = useWindowSize()\n const [style, setStyle] = useState<React.CSSProperties>({})\n const [isDragging, setIsDragging] = useState(false)\n const [isLoadingModel, setIsLoadingModel] = useState(true)\n const [isLoaded, setIsLoaded] = useState(false)\n const canvasRef = useRef<HTMLCanvasElement>(null)\n const params = new URLSearchParams(window.location.search)\n const contractAddress = params.get('contract')!\n const tokenId = params.get('token')\n const itemId = params.get('item')\n const skin = params.get('skin')\n const hair = params.get('hair')\n const eyes = params.get('eyes')\n const emote = params.get('emote') as AvatarEmote | null\n const camera = params.get('camera') as AvatarCamera | null\n const transparentBackground = params.has('transparentBackground')\n const autoRotateSpeedParam = params.get('autoRotateSpeed') as string | null\n const autoRotateSpeed = autoRotateSpeedParam ? parseFloat(autoRotateSpeedParam) : null\n const offsetXParam = params.get('offsetX') as string | null\n const offsetX = offsetXParam ? parseFloat(offsetXParam) : null\n const offsetYParam = params.get('offsetY') as string | null\n const offsetY = offsetYParam ? parseFloat(offsetYParam) : null\n const offsetZParam = params.get('offsetZ') as string | null\n const offsetZ = offsetZParam ? parseFloat(offsetZParam) : null\n const zoom = parseZoom(params.get('zoom'))\n const bodyShapeParam = params.get('bodyShape') || params.get('shape') // keep supporting deprecated \"shape\" param to avoid breaking changes\n const bodyShape = bodyShapeParam === 'female' ? WearableBodyShape.FEMALE : bodyShapeParam === 'male' ? WearableBodyShape.MALE : null\n const urns = params.getAll('urn')\n const profile = params.get('profile')\n const env = Object.values(Env).reduce((selected, value) => (value === params.get('env') ? value : selected), Env.PROD)\n const [overrides, setOverrides] = useState<Partial<AvatarPreview>>({})\n const [avatar, isLoadingAvatar, avatarError] = useAvatar(\n {\n contractAddress,\n tokenId,\n itemId,\n bodyShape,\n urns,\n env,\n profile,\n skin,\n hair,\n eyes,\n zoom,\n emote,\n camera,\n autoRotateSpeed,\n offsetX,\n offsetY,\n offsetZ,\n },\n overrides\n )\n const [image, setImage] = useState('')\n const [is3D, setIs3D] = useState(true)\n const [isMessageSent, setIsMessageSent] = useState(false)\n\n const error = previewError || avatarError\n const isLoading = (isLoadingModel || isLoadingAvatar) && !error\n const showImage = !!image && !is3D && !isLoading\n const showCanvas = is3D && !isLoading\n\n useEffect(() => {\n if (canvasRef.current && avatar) {\n // rarity background\n setStyle({ backgroundImage: transparentBackground ? undefined : avatar.background.gradient, opacity: 1 })\n\n // set background image\n if (avatar.background.image) {\n setImage(avatar.background.image)\n }\n\n // load model or image (for texture only wearables)\n if (avatar.type === AvatarPreviewType.TEXTURE) {\n setIs3D(false)\n setIsLoadingModel(false)\n setIsLoaded(true)\n } else {\n // preview models\n render(canvasRef.current, avatar)\n .catch((error) => setPreviewError(error.message))\n .finally(() => {\n setIsLoadingModel(false)\n setIsLoaded(true)\n })\n }\n }\n }, [canvasRef.current, avatar]) // eslint-disable-line\n\n // send a mesasge to the parent window when loaded or error occurs\n useEffect(() => {\n if (!isMessageSent) {\n if (isLoaded) {\n sendMessage(MessageType.LOAD)\n setIsMessageSent(true)\n } else if (error) {\n sendMessage(MessageType.ERROR, error)\n setIsMessageSent(true)\n }\n }\n }, [isLoaded, error, isMessageSent])\n\n // receive message from parent window to update options\n useEffect(() => {\n const previous = window.onmessage\n window.onmessage = function (event: MessageEvent) {\n if (event.data && event.data.type === MessageType.UPDATE) {\n const message = event.data as { type: MessageType.UPDATE; options: Partial<AvatarPreview> }\n if (message.options && typeof message.options === 'object') {\n setOverrides(message.options)\n }\n }\n }\n return () => {\n window.onmessage = previous\n }\n }, [])\n\n return (\n <div\n className={classNames('Preview', {\n 'is-dragging': isDragging,\n 'is-loading': isLoading,\n 'is-loaded': isLoaded,\n 'is-3d': is3D && avatar?.camera === AvatarCamera.INTERACTIVE,\n 'has-error': !!error,\n })}\n style={style}\n >\n <img\n src={image}\n className={classNames('thumbnail', {\n 'is-visible': showImage,\n })}\n alt=\"preview\"\n />\n <canvas\n id=\"wearable-preview\"\n className={classNames({\n 'is-visible': showCanvas,\n })}\n width={width}\n height={height}\n ref={canvasRef}\n onMouseDown={() => setIsDragging(is3D && !error)}\n onMouseUp={() => setIsDragging(false)}\n ></canvas>\n {error && <div className=\"error\">{error}</div>}\n </div>\n )\n}\n\nexport default React.memo(Preview)\n","import { useState, useEffect } from 'react'\n\n// Define general type for useWindowSize hook, which includes width and height\ninterface Size {\n width: number | undefined\n height: number | undefined\n}\n\nexport function useWindowSize(): Size {\n // Initialize state with undefined width/height so server and client renders match\n // Learn more here: https://joshwcomeau.com/react/the-perils-of-rehydration/\n const [windowSize, setWindowSize] = useState<Size>({\n width: undefined,\n height: undefined,\n })\n useEffect(() => {\n // Handler to call on window resize\n function handleResize() {\n // Set window width/height to state\n setWindowSize({\n width: window.innerWidth,\n height: window.innerHeight,\n })\n }\n // Add event listener\n window.addEventListener('resize', handleResize)\n // Call handler right away so state gets updated with initial window size\n handleResize()\n // Remove event listener on cleanup\n return () => window.removeEventListener('resize', handleResize)\n }, []) // Empty array ensures that effect is only run on mount\n return windowSize\n}\n","import { useMemo } from 'react'\nimport { AvatarPreview, AvatarPreviewOptions, createAvatarPreview } from '../lib/avatar'\nimport { useFetch } from './useFetch'\n\nexport function useAvatar(options: AvatarPreviewOptions, overrides: Partial<AvatarPreview> = {}) {\n const [avatar, isLoading, error] = useFetch(async () => createAvatarPreview(options))\n const avatarWithOverrides = useMemo(() => {\n const keysToOverride = (Object.keys(overrides) as (keyof AvatarPreview)[]).filter(\n (key) => typeof overrides[key] !== 'undefined' && overrides[key] !== null\n )\n if (avatar && keysToOverride.length > 0) {\n const newAvatar: AvatarPreview = { ...avatar }\n for (const key of keysToOverride) {\n const value = overrides[key]\n if (value) {\n newAvatar[key] = value as never\n }\n }\n return newAvatar\n }\n return avatar\n }, [avatar, overrides])\n\n return [avatarWithOverrides, isLoading, error] as const\n}\n","import React from 'react'\nimport ReactDOM from 'react-dom'\nimport './index.css'\nimport { Preview } from './components/Preview'\n\nReactDOM.render(\n <React.StrictMode>\n <Preview />\n </React.StrictMode>,\n document.getElementById('root')\n)\n"],"sourceRoot":""}