@dcl/wearable-preview 1.0.0-2449988983.commit-0534c22 → 1.0.0-2456669507.commit-cda58cb

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-2449988983.commit-0534c22/static/css/main.bcd9c703.chunk.css",
4
- "main.js": "https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2449988983.commit-0534c22/static/js/main.db7754ff.chunk.js",
5
- "main.js.map": "https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2449988983.commit-0534c22/static/js/main.db7754ff.chunk.js.map",
6
- "runtime-main.js": "https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2449988983.commit-0534c22/static/js/runtime-main.f5ee404b.js",
7
- "runtime-main.js.map": "https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2449988983.commit-0534c22/static/js/runtime-main.f5ee404b.js.map",
8
- "static/js/2.f1f98537.chunk.js": "https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2449988983.commit-0534c22/static/js/2.f1f98537.chunk.js",
9
- "static/js/2.f1f98537.chunk.js.map": "https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2449988983.commit-0534c22/static/js/2.f1f98537.chunk.js.map",
10
- "index.html": "https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2449988983.commit-0534c22/index.html",
11
- "static/css/main.bcd9c703.chunk.css.map": "https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2449988983.commit-0534c22/static/css/main.bcd9c703.chunk.css.map",
12
- "static/js/2.f1f98537.chunk.js.LICENSE.txt": "https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2449988983.commit-0534c22/static/js/2.f1f98537.chunk.js.LICENSE.txt"
3
+ "main.css": "https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2456669507.commit-cda58cb/static/css/main.bcd9c703.chunk.css",
4
+ "main.js": "https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2456669507.commit-cda58cb/static/js/main.534e8df5.chunk.js",
5
+ "main.js.map": "https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2456669507.commit-cda58cb/static/js/main.534e8df5.chunk.js.map",
6
+ "runtime-main.js": "https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2456669507.commit-cda58cb/static/js/runtime-main.b3be03d0.js",
7
+ "runtime-main.js.map": "https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2456669507.commit-cda58cb/static/js/runtime-main.b3be03d0.js.map",
8
+ "static/js/2.f1f98537.chunk.js": "https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2456669507.commit-cda58cb/static/js/2.f1f98537.chunk.js",
9
+ "static/js/2.f1f98537.chunk.js.map": "https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2456669507.commit-cda58cb/static/js/2.f1f98537.chunk.js.map",
10
+ "index.html": "https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2456669507.commit-cda58cb/index.html",
11
+ "static/css/main.bcd9c703.chunk.css.map": "https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2456669507.commit-cda58cb/static/css/main.bcd9c703.chunk.css.map",
12
+ "static/js/2.f1f98537.chunk.js.LICENSE.txt": "https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2456669507.commit-cda58cb/static/js/2.f1f98537.chunk.js.LICENSE.txt"
13
13
  },
14
14
  "entrypoints": [
15
- "static/js/runtime-main.f5ee404b.js",
15
+ "static/js/runtime-main.b3be03d0.js",
16
16
  "static/js/2.f1f98537.chunk.js",
17
17
  "static/css/main.bcd9c703.chunk.css",
18
- "static/js/main.db7754ff.chunk.js"
18
+ "static/js/main.534e8df5.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-2449988983.commit-0534c22/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-2449988983.commit-0534c22/logo192.png"/><link rel="manifest" href="https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2449988983.commit-0534c22/manifest.json"/><title>Decentraland | Wearable Preview</title><link href="https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2449988983.commit-0534c22/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],c=r[1],i=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 c)Object.prototype.hasOwnProperty.call(c,n)&&(e[n]=c[n]);for(p&&p(r);s.length;)s.shift()();return l.push.apply(l,i||[]),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 c=t[a];0!==o[c]&&(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-2449988983.commit-0534c22/";var a=this["webpackJsonp@dcl/wearable-preview"]=this["webpackJsonp@dcl/wearable-preview"]||[],c=a.push.bind(a);a.push=r,a=a.slice();for(var i=0;i<a.length;i++)r(a[i]);var p=c;t()}([])</script><script src="https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2449988983.commit-0534c22/static/js/2.f1f98537.chunk.js"></script><script src="https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2449988983.commit-0534c22/static/js/main.db7754ff.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-2456669507.commit-cda58cb/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-2456669507.commit-cda58cb/logo192.png"/><link rel="manifest" href="https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2456669507.commit-cda58cb/manifest.json"/><title>Decentraland | Wearable Preview</title><link href="https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2456669507.commit-cda58cb/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,a,u=r[0],c=r[1],i=r[2],f=0,s=[];f<u.length;f++)a=u[f],Object.prototype.hasOwnProperty.call(o,a)&&o[a]&&s.push(o[a][0]),o[a]=0;for(n in c)Object.prototype.hasOwnProperty.call(c,n)&&(e[n]=c[n]);for(p&&p(r);s.length;)s.shift()();return l.push.apply(l,i||[]),t()}function t(){for(var e,r=0;r<l.length;r++){for(var t=l[r],n=!0,u=1;u<t.length;u++){var c=t[u];0!==o[c]&&(n=!1)}n&&(l.splice(r--,1),e=a(a.s=t[0]))}return e}var n={},o={1:0},l=[];function a(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,a),t.l=!0,t.exports}a.m=e,a.c=n,a.d=function(e,r,t){a.o(e,r)||Object.defineProperty(e,r,{enumerable:!0,get:t})},a.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},a.t=function(e,r){if(1&r&&(e=a(e)),8&r)return e;if(4&r&&"object"==typeof e&&e&&e.__esModule)return e;var t=Object.create(null);if(a.r(t),Object.defineProperty(t,"default",{enumerable:!0,value:e}),2&r&&"string"!=typeof e)for(var n in e)a.d(t,n,function(r){return e[r]}.bind(null,n));return t},a.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return a.d(r,"a",r),r},a.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},a.p="https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2456669507.commit-cda58cb/";var u=this["webpackJsonp@dcl/wearable-preview"]=this["webpackJsonp@dcl/wearable-preview"]||[],c=u.push.bind(u);u.push=r,u=u.slice();for(var i=0;i<u.length;i++)r(u[i]);var p=c;t()}([])</script><script src="https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2456669507.commit-cda58cb/static/js/2.f1f98537.chunk.js"></script><script src="https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2456669507.commit-cda58cb/static/js/main.534e8df5.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-2449988983.commit-0534c22",
3
+ "version": "1.0.0-2456669507.commit-cda58cb",
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-2449988983.commit-0534c22",
13
- "commit": "0534c221900ad86d4fbd3746baf6c4743d404f60"
12
+ "homepage": "https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2456669507.commit-cda58cb",
13
+ "commit": "cda58cbf2332849eb5d0bab039feee31325e4153"
14
14
  }
@@ -1,2 +1,2 @@
1
- (this["webpackJsonp@dcl/wearable-preview"]=this["webpackJsonp@dcl/wearable-preview"]||[]).push([[0],{330:function(e,t,n){},448:function(e,t){},454:function(e,t,n){"use strict";n.r(t),t.default="float angleY = 3.14 / 2.0;\n\nmat3 rotateY = mat3(\n cos(angleY), 0, sin(angleY),\n 0, 1, 0,\n -sin(angleY), 0, cos(angleY)\n);\n\n// view angle DOT normal of the position\nvec3 tray = normalize(viewDirectionW * rotateY);\nvec3 rayDirection = normalize(tray-vPositionW);\nfloat t=(dot(normalW,rayDirection) + 1.0) / 2.0;\n\nfloat ToonThresholds[3];\nToonThresholds[0] = 0.90;\nToonThresholds[1] = 0.80;\nToonThresholds[2] = 0.20;\n\nfloat ToonBrightnessLevels[4];\nToonBrightnessLevels[0] = 1.2;\nToonBrightnessLevels[1] = 1.0;\nToonBrightnessLevels[2] = 1.0;\nToonBrightnessLevels[3] = 0.8;\n\nif (t > ToonThresholds[0])\n{\n finalColor.rgb *= ToonBrightnessLevels[0];\n}\nelse if (t > ToonThresholds[1])\n{\n finalColor.rgb *= ToonBrightnessLevels[1];\n}\nelse if (t > ToonThresholds[2])\n{\n finalColor.rgb *= ToonBrightnessLevels[2];\n}\nelse\n{\n finalColor.rgb *= ToonBrightnessLevels[3];\n}\n"},455:function(e,t,n){},459:function(e,t,n){"use strict";n.r(t);var r=n(56),a=n.n(r),o=n(324),c=n.n(o),i=(n(330),n(61)),s=n(252),u=n.n(s),l=n(20);var f,d=n(70),p=n(110),b=n(31),h=n.n(b),v=n(43),w=n(249),m=n(250),y=n(167);function g(e){return E.apply(this,arguments)}function E(){return(E=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 O(e){return x.apply(this,arguments)}function x(){return x=Object(v.a)(h.a.mark((function e(t){var n,r,a=arguments;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=a.length>1&&void 0!==a[1]?a[1]:3,e.prev=1,e.next=4,fetch(t);case 4:if((r=e.sent).ok){e.next=11;break}return e.t0=Error,e.next=9,r.text();case 9:throw e.t1=e.sent,new e.t0(e.t1);case 11:return e.abrupt("return",r.json());case 14:if(e.prev=14,e.t2=e.catch(1),!(n>0)){e.next=22;break}return e.next=19,g(100);case 19:return e.abrupt("return",O(t,n-1));case 22:throw e.t2;case 23:case"end":return e.stop()}}),e,null,[[1,14]])}))),x.apply(this,arguments)}var k,j=(f={},Object(y.a)(f,l.PreviewEnv.DEV,"https://nft-api.decentraland.io"),Object(y.a)(f,l.PreviewEnv.PROD,"https://nft-api.decentraland.org"),f),S=function(){function e(){Object(w.a)(this,e)}return Object(m.a)(e,[{key:"fetchItem",value:function(){var e=Object(v.a)(h.a.mark((function e(t,n,r){var a,o;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,O("".concat(j[r],"/v1/items?contractAddress=").concat(t,"&itemId=").concat(n));case 2:if(a=e.sent,0!==(o=a.data).length){e.next=6;break}throw new Error('Item not found for contractAddress="'.concat(t,'" itemId="').concat(n,'"'));case 6:return e.abrupt("return",o[0]);case 7:case"end":return e.stop()}}),e)})));return function(t,n,r){return e.apply(this,arguments)}}()},{key:"fetchNFT",value:function(){var e=Object(v.a)(h.a.mark((function e(t,n,r){var a,o;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,O("".concat(j[r],"/v1/nfts?contractAddress=").concat(t,"&tokenId=").concat(n));case 2:if(a=e.sent,0!==(o=a.data).length){e.next=6;break}throw new Error('NFT not found for contractAddress="'.concat(t,'" tokenId="').concat(n,'"'));case 6:return e.abrupt("return",o[0].nft);case 7:case"end":return e.stop()}}),e)})));return function(t,n,r){return e.apply(this,arguments)}}()}]),e}(),W=new S,A=(k={},Object(y.a)(k,l.PreviewEnv.DEV,"https://peer.decentraland.zone"),Object(y.a)(k,l.PreviewEnv.PROD,"https://peer.decentraland.org"),k),C=function(){function e(){Object(w.a)(this,e)}return Object(m.a)(e,[{key:"fetchWearables",value:function(){var e=Object(v.a)(h.a.mark((function e(t,n){var r,a;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(0!==t.length){e.next=2;break}return e.abrupt("return",[]);case 2:return e.next=4,O("".concat(A[n],"/lambdas/collections/wearables?").concat(t.map((function(e){return"wearableId=".concat(e)})).join("&")));case 4:if(r=e.sent,0!==(a=r.wearables).length){e.next=8;break}throw new Error('Wearables not found for urns="'.concat(t,'"'));case 8:return e.abrupt("return",a);case 9:case"end":return e.stop()}}),e)})));return function(t,n){return e.apply(this,arguments)}}()},{key:"fetchProfile",value:function(){var e=Object(v.a)(h.a.mark((function e(t,n){var r;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,O("".concat(A[n],"/lambdas/profiles?id=").concat(t));case 2:return r=e.sent,e.abrupt("return",r.length>0?r[0]:null);case 4:case"end":return e.stop()}}),e)})));return function(t,n){return e.apply(this,arguments)}}()}]),e}(),B=new C;var P=n(36);function T(e){return e.startsWith("#")?e:"#"+e}function L(e){return("0"+(255*e|0).toString(16)).slice(-2)}function R(e){return L(e.r)+L(e.g)+L(e.b)}function M(e){var t=function(e){return e.startsWith("#")?e.slice(1):e}(e);return new P.Color3(parseInt(t.slice(0,2),16)/256,parseInt(t.slice(2,4),16)/256,parseInt(t.slice(4,6),16)/256)}function I(e,t){return e.bodyShapes.includes(t)}function _(e){return I(e,l.WearableBodyShape.MALE)}function D(e){return I(e,l.WearableBodyShape.FEMALE)}function F(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(D))throw new Error('Could not find a BaseFemale representation for wearable="'.concat(e.id,'"'));return e.data.representations.find(D);case l.WearableBodyShape.MALE:if(!e.data.representations.some(_))throw new Error('Could not find a BaseMale representation for wearable="'.concat(e.id,'"'));return e.data.representations.find(_)}}function Y(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:l.WearableBodyShape.MALE;if(N(e,t))return F(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 N(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:l.WearableBodyShape.MALE;try{return F(e,t),!0}catch(n){return!1}}function V(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 H(e){return e.mainFile.endsWith("png")}function U(e,t){return e.find((function(e){return e.data.category===t}))||null}function z(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 Z(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 G(e){return!!e}function X(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 J(e){return!!e&&"emoteDataV0"in e}function K(e){var t=e?parseFloat(e):null;return null===t||isNaN(t)?null:1.8*Math.min(Math.max(t,0),100)/100+1}function q(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}}var Q="default";function $(e,t){return ee.apply(this,arguments)}function ee(){return(ee=Object(v.a)(h.a.mark((function e(t,n){var r;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,ae([t],n);case 2:if(1===(r=e.sent).length){e.next=5;break}throw new Error('Could not find wearable for urn="'.concat(t,'"'));case 5:return e.abrupt("return",r[0]);case 6:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function te(e){return JSON.parse(atob(e))}function ne(e,t){return re.apply(this,arguments)}function re(){return(re=Object(v.a)(h.a.mark((function e(t,n){var r;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t){e.next=2;break}return e.abrupt("return",[]);case 2:return e.next=4,ae(t.avatar.wearables,n);case 4:return r=e.sent,e.abrupt("return",r.filter((function(e){return!J(e)})));case 6:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function ae(e,t){return oe.apply(this,arguments)}function oe(){return(oe=Object(v.a)(h.a.mark((function e(t,n){return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(0!==t.length){e.next=2;break}return e.abrupt("return",[]);case 2:return e.abrupt("return",B.fetchWearables(t,n));case 3:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function ce(e){return ie.apply(this,arguments)}function ie(){return(ie=Object(v.a)(h.a.mark((function e(t){var n,r;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(0!==t.length){e.next=2;break}return e.abrupt("return",[]);case 2:return n=t.map((function(e){return fetch(e).then((function(e){return e.json()})).catch()})),e.next=5,Promise.all(n);case 5:return r=e.sent,e.abrupt("return",r.filter(G));case 7:case"end":return e.stop()}}),e)})))).apply(this,arguments)}var se=function(){var e={};return{memo:function(){var t=Object(v.a)(h.a.mark((function t(n,r){var a,o,c,i=arguments;return h.a.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(!(n in e)){for(a=i.length,o=new Array(a>2?a-2:0),c=2;c<a;c++)o[c-2]=i[c];e[n]=r.apply(void 0,o)}return t.abrupt("return",e[n]);case 3:case"end":return t.stop()}}),t)})));return function(e,n){return t.apply(this,arguments)}}(),reset:function(){for(var t in e)delete e[t]}}}();function ue(e,t){return le.apply(this,arguments)}function le(){return(le=Object(v.a)(h.a.mark((function e(t,n){return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt("return",se.memo(t,Object(v.a)(h.a.mark((function e(){var r;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t!==Q){e.next=2;break}return e.abrupt("return",null);case 2:return e.next=4,B.fetchProfile(t,n).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 4:return r=e.sent,e.abrupt("return",r||null);case 6:case"end":return e.stop()}}),e)})))));case 1:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function fe(e){return de.apply(this,arguments)}function de(){return(de=Object(v.a)(h.a.mark((function e(t){var n,r,a,o,c,i,s;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n=t.contractAddress,r=t.itemId,a=t.tokenId,o=t.env,r||a){e.next=3;break}throw new Error("You need to provide an itemId or a tokenId");case 3:if(c=o===l.PreviewEnv.PROD?"matic":"mumbai",i="urn:decentraland:".concat(c,":collections-v2:").concat(n,":").concat(r),r||a){e.next=9;break}throw new Error("You must provide either tokenId or itemId");case 9:if(r||!a){e.next=14;break}return e.next=12,W.fetchNFT(n,a,o);case 12:s=e.sent,i=s.network!==l.Network.ETHEREUM?"urn:decentraland:".concat(c,":collections-v2:").concat(n,":").concat(s.itemId):s.image.split("contents/")[1].split("/thumbnail")[0];case 14:return e.abrupt("return",$(i,o));case 15:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function pe(e,t,n,r,a,o){return be.apply(this,arguments)}function be(){return(be=Object(v.a)(h.a.mark((function e(t,n,r,a,o,c){var i,s,u,l,f,b,v;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.t0=[],e.t1=p.a,e.next=4,ne(t,c);case 4:return e.t2=e.sent,e.t3=(0,e.t1)(e.t2),e.t4=p.a,e.next=9,ae([o].concat(Object(p.a)(n)),c);case 9:return e.t5=e.sent,e.t6=(0,e.t4)(e.t5),e.t7=p.a,e.next=14,ce(r);case 14:e.t8=e.sent,e.t9=(0,e.t7)(e.t8),e.t10=Object(p.a)(a.map(te)),i=(i=e.t0.concat.call(e.t0,e.t3,e.t6,e.t9,e.t10)).filter((function(e){return N(e,o)})),s=[],u=Object(d.a)(z(o)),e.prev=21,u.s();case 23:if((l=u.n()).done){e.next=35;break}if(f=l.value,U(i,f)){e.next=33;break}if(!(b=Z(f,o))){e.next=32;break}s.push(b),e.next=33;break;case 32:throw new Error('Could not get default URN for category="'.concat(f,'"'));case 33:e.next=23;break;case 35:e.next=40;break;case 37:e.prev=37,e.t11=e.catch(21),u.e(e.t11);case 40:return e.prev=40,u.f(),e.finish(40);case 43:if(!(s.length>0)){e.next=48;break}return e.next=46,ae(s,c);case 46:v=e.sent,i=[].concat(Object(p.a)(i),Object(p.a)(v));case 48:return e.abrupt("return",i);case 49:case"end":return e.stop()}}),e,null,[[21,37,40,43]])})))).apply(this,arguments)}function he(){return he=Object(v.a)(h.a.mark((function e(){var t,n,r,a,o,c,s,u,f,d,b,v,w,m,y,g,E,O,x,k,j,S,W,A,C,B,P,L,M,I,_,D,F,N,V=arguments;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=V.length>0&&void 0!==V[0]?V[0]:{},n=t.contractAddress,r=t.tokenId,a=t.itemId,o=t.env||l.PreviewEnv.PROD,c=Promise.resolve(),n&&(c=fe({contractAddress:n,tokenId:r,itemId:a,env:o})),s=t.profile?ue(t.profile,o):Promise.resolve(null),e.next=8,Promise.all([c,s]);case 8:if(u=e.sent,f=Object(i.a)(u,2),d=f[0],b=f[1],v=t.bodyShape||b&&b.avatar.bodyShape||(d?X(d):l.WearableBodyShape.MALE),w=T(t.skin||b&&R(b.avatar.skin.color)||"cc9b76"),m=T(t.hair||b&&R(b.avatar.hair.color)||"000000"),y=T(t.eyes||b&&R(b.avatar.eyes.color)||"000000"),g=Object(p.a)(t.urns||[]),E=t.urls||[],O=t.base64s||[],x=[],k=1.75,j=l.PreviewType.WEARABLE,S={gradient:t.transparentBackground?void 0:"radial-gradient(#676370, #18141b)"},!(g.length>0||E.length>0||O.length>0||d&&J(d)||t.profile)){e.next=28;break}return j=l.PreviewType.AVATAR,e.next=27,pe(b,g,E,O,v,o);case 27:x=e.sent;case 28:return d&&(k=x.length>0?k:q(d),H(Y(d))&&j!==l.PreviewType.AVATAR&&(j=l.PreviewType.TEXTURE),W=l.Rarity.getGradient(d.rarity),A=Object(i.a)(W,2),C=A[0],B=A[1],P="radial-gradient(".concat(C,", ").concat(B,")"),S={image:d.thumbnail,gradient:P}),L=l.PreviewEmote.IDLE,t.emote&&Object.values(l.PreviewEmote).includes(t.emote)&&(L=t.emote),M=l.PreviewCamera.INTERACTIVE,t.camera&&Object.values(l.PreviewCamera).includes(t.camera)&&(M=t.camera),I="number"!==typeof t.autoRotateSpeed||isNaN(t.autoRotateSpeed)?.2:t.autoRotateSpeed,_="boolean"===typeof t.centerBoundingBox&&!1!==t.centerBoundingBox,D=1,F=100,N=50,ve(t.wheelZoom)&&(D=Math.max(t.wheelZoom,1)),ve(t.wheelPrecision)&&(F=Math.max(t.wheelPrecision,1)),ve(t.wheelStart)&&(N=100-Math.min(Math.max(t.wheelStart,0),100)),e.abrupt("return",{wearable:null!==d&&void 0!==d?d:void 0,wearables:x,bodyShape:v,skin:w,hair:m,eyes:y,type:j,background:S,emote:L,camera:M,autoRotateSpeed:I,centerBoundingBox:_,offsetX:t.offsetX||0,offsetY:t.offsetY||0,offsetZ:t.offsetZ||0,zoom:t.zoom||k,wheelZoom:D,wheelPrecision:F,wheelStart:N});case 42:case"end":return e.stop()}}),e)}))),he.apply(this,arguments)}function ve(e){return"number"===typeof e&&!isNaN(e)}var we={};function me(e,t){return t===we[e]}var ye=n(266),ge=n(325),Ee=n.n(ge),Oe=function(){var e=Object(r.useState)(window.location.search.toString()),t=Object(i.a)(e,1)[0],n=Object(r.useMemo)((function(){var e=new URLSearchParams(t),n=e.get("autoRotateSpeed"),r=e.get("offsetX"),a=e.get("offsetY"),o=e.get("offsetZ"),c=e.get("wheelZoom"),i=e.get("wheelPrecision"),s=e.get("wheelStart"),u=e.get("bodyShape");return{contractAddress:e.get("contract"),tokenId:e.get("token"),itemId:e.get("item"),skin:e.get("skin"),hair:e.get("hair"),eyes:e.get("eyes"),emote:e.get("emote"),camera:e.get("camera"),transparentBackground:e.has("transparentBackground"),centerBoundingBox:"false"!==e.get("centerBoundingBox"),autoRotateSpeed:n?parseFloat(n):null,offsetX:r?parseFloat(r):null,offsetY:a?parseFloat(a):null,offsetZ:o?parseFloat(o):null,wheelZoom:c?parseFloat(c):null,wheelPrecision:i?parseFloat(i):null,wheelStart:s?parseFloat(s):null,zoom:K(e.get("zoom")),bodyShape:"female"===u||u===l.WearableBodyShape.FEMALE?l.WearableBodyShape.FEMALE:"male"===u||u===l.WearableBodyShape.MALE?l.WearableBodyShape.MALE:null,urns:e.getAll("urn"),urls:e.getAll("url"),base64s:e.getAll("base64"),profile:e.get("profile"),env:Object.values(l.PreviewEnv).filter((function(e){return"string"===typeof e})).reduce((function(t,n){return n===e.get("env")?n:t}),l.PreviewEnv.PROD)}}),[t]),a=function(){var e=Object(r.useState)({}),t=Object(i.a)(e,2),n=t[0],a=t[1],o=Object(r.useState)(!1),c=Object(i.a)(o,2),s=c[0],u=c[1];return Object(r.useEffect)((function(){function e(e){if(e.data&&e.data.type===l.PreviewMessageType.UPDATE&&"object"===typeof e.data.payload&&"object"===typeof e.data.payload.options){var t=e.data.payload.options;Ee()(n,t)||a(t)}}return window.addEventListener("message",e),s||(Object(l.sendMessage)(window.parent,l.PreviewMessageType.READY,{}),u(!0)),function(){window.removeEventListener("message",e)}}),[n,s]),n}();return Object(r.useMemo)((function(){return Object(ye.a)(Object(ye.a)({},n),a)}),[n,a])};function xe(){var e=Oe(),t=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[],a=Object(r.useState)(!1),o=Object(i.a)(a,2),c=o[0],s=o[1],u=Object(r.useState)(null),l=Object(i.a)(u,2),f=l[0],d=l[1],p=Object(r.useState)(""),b=Object(i.a)(p,2),h=b[0],v=b[1];return"undefined"===typeof we[e]&&(we[e]=0),Object(r.useEffect)((function(){var n=++we[e];s(!0),t().then((function(t){me(e,n)&&d(t)})).catch((function(t){me(e,n)&&v(t.message)})).finally((function(){me(e,n)&&s(!1)}))}),n),[f,c,h]}("useConfig",(function(){return function(){return he.apply(this,arguments)}(e)}),[e]),n=Object(i.a)(t,3);return[n[0],n[1],n[2]]}function ke(e){return function(t){return t.data.category===e}}function je(e){return function(t){return t.wearable.data.category===e||(t.wearable.data.hides||[]).includes(e)||(t.wearable.data.replaces||[]).includes(e)}}function Se(e){return!!e}function We(e){return!H(Y(e))}function Ae(e){return!We(e)}function Ce(e){var t=e.find((function(e){return e.wearable.data.category===l.WearableCategory.BODY_SHAPE}));if(!t)return null;var n,r=e.some((function(e){return e.wearable.data.category===l.WearableCategory.SKIN})),a=r||e.some(je(l.WearableCategory.UPPER_BODY)),o=r||e.some(je(l.WearableCategory.LOWER_BODY)),c=r||e.some(je(l.WearableCategory.FEET)),i=r||e.some(je(l.WearableCategory.HEAD)),s=Object(d.a)(t.container.meshes);try{for(s.s();!(n=s.n()).done;){var u=n.value,f=u.name.toLowerCase();f.endsWith("ubody_basemesh")&&a&&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 Be=[l.WearableCategory.HELMET,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 Pe(e){var t=new Map,n=e.wearables.filter((function(e){return!J(e)}));e.wearable&&!J(e.wearable)&&(n=e.wearables.filter((function(t){if(e.wearable){var n=e.wearable.data,r=n.category,a=n.hides,o=n.replaces;if("skin"===t.data.category){if(Be.includes(r))return!1;if(a&&a.includes(l.WearableCategory.HEAD))return!1;if(o&&o.includes(l.WearableCategory.HEAD))return!1}if(t.data.hides&&t.data.hides.includes(r))return!1;if(t.data.replaces&&t.data.replaces.includes(r))return!1}return!0})),n.push(e.wearable));var r,a=Object(d.a)(n);try{for(a.s();!(r=a.n()).done;){var o=r.value,c=o.data.category;N(o,e.bodyShape)&&t.set(c,o)}}catch(j){a.e(j)}finally{a.f()}var i=!1;n=n.filter((function(e){return t.get(e.data.category)===e})).reverse();var s,u=new Set,f=Object(d.a)(n);try{for(f.s();!(s=f.n()).done;){var b=s.value,h=b.data.category;if(!u.has(h)){for(var v=b.data.replaces||[],w=b.data.hides||[],m=Array.from(new Set([].concat(Object(p.a)(v),Object(p.a)(w)))),y=0,g=m;y<g.length;y++){var E=g[y];E!==h&&(t.delete(E),u.add(E))}b.data.category===l.WearableCategory.SKIN&&(i=!0)}}}catch(j){f.e(j)}finally{f.f()}if(i){var O,x=Object(d.a)(Be);try{for(x.s();!(O=x.n()).done;){var k=O.value;t.delete(k)}}catch(j){x.e(j)}finally{x.f()}}return t}function Te(e,t){e&&(e.useAutoRotationBehavior=!0,e.autoRotationBehavior&&(e.autoRotationBehavior.idleRotationSpeed=t.autoRotateSpeed))}n(323);function Le(){return["iPad Simulator","iPhone Simulator","iPod Simulator","iPad","iPhone","iPod"].includes(navigator.platform)}var Re,Me=!1;function Ie(e,t){return _e.apply(this,arguments)}function _e(){return(_e=Object(v.a)(h.a.mark((function e(t,n){var r,a,o;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:Re&&Re.dispose(),Re=new P.Engine(t,!0,{preserveDrawingBuffer:!0,stencil:!0,antialias:!0}),(r=new P.Scene(Re)).autoClear=!0,r.clearColor=new P.Color4(0,0,0,0),r.ambientColor=new P.Color3(1,1,1),r.preventDefaultOnPointerDown=!1,(a=new P.ArcRotateCamera("camera",0,0,0,new P.Vector3(0,0,0),r)).mode=P.Camera.PERSPECTIVE_CAMERA,e.t0=n.camera,e.next=e.t0===l.PreviewCamera.INTERACTIVE?12:e.t0===l.PreviewCamera.STATIC?23:25;break;case 12:e.t1=n.type,e.next=e.t1===l.PreviewType.WEARABLE?15:e.t1===l.PreviewType.AVATAR?18:20;break;case 15:return Te(a,n),a.position=new P.Vector3(-2,2,2),e.abrupt("break",21);case 18:return a.position=new P.Vector3(0,1,3.5),e.abrupt("break",21);case 20:console.warn('Unexpected preview.type="'.concat(n.type,'"'));case 21:return a.attachControl(t,!0),e.abrupt("break",25);case 23:return a.position=new P.Vector3(0,1,3.5),e.abrupt("break",25);case 25:return o=new P.Vector3(n.offsetX,n.offsetY,n.offsetZ),a.position.addInPlace(o),a.setTarget(o),a.lowerRadiusLimit=a.radius/n.zoom,a.upperRadiusLimit=a.lowerRadiusLimit*n.wheelZoom,a.radius=a.lowerRadiusLimit+(a.upperRadiusLimit-a.lowerRadiusLimit)*n.wheelStart/100,a.wheelPrecision=n.wheelPrecision,n.type===l.PreviewType.WEARABLE&&(new P.DirectionalLight("directional",new P.Vector3(0,0,1),r).intensity=1,new P.SpotLight("spot",new P.Vector3(-2,2,2),new P.Vector3(2,-2,-2),Math.PI/2,1e3,r).intensity=1),new P.HemisphericLight("top",new P.Vector3(0,-1,0),r).intensity=1,new P.HemisphericLight("bottom",new P.Vector3(0,1,0),r).intensity=1,Le()||(new P.GlowLayer("glow",r).intensity=.4),Re.runRenderLoop((function(){r.render()})),e.abrupt("return",r);case 41:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function De(e,t,n){return Fe.apply(this,arguments)}function Fe(){return(Fe=Object(v.a)(h.a.mark((function e(t,n,r){var a,o,c;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(a=n.id,o=F(n,r),!(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,n){var r=new P.TextureAssetTask(a,c.url,!0,!1);r.onError=function(){return n(r.errorObject)},r.onSuccess=function(){e(r.texture)},r.run(t,(function(){return e(r.texture)}),n)})));case 5:return e.abrupt("return",null);case 6:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function Ye(e,t,n){return Ne.apply(this,arguments)}function Ne(){return(Ne=Object(v.a)(h.a.mark((function e(t,n,r){var a,o,c;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(a=n.id,o=F(n,r),!(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,n){var r=new P.TextureAssetTask(a,c.url,!0,!1);r.onError=function(){return n(r.errorObject)},r.onSuccess=function(){e(r.texture)},r.run(t,(function(){return e(r.texture)}),n)})));case 5:return e.abrupt("return",null);case 6:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function Ve(e,t){return He.apply(this,arguments)}function He(){return He=Object(v.a)(h.a.mark((function e(t,n){var r;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=function(){var e=Object(v.a)(h.a.mark((function e(n,r){return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt("return",P.SceneLoader.LoadAssetContainerAsync(n,"",t,null,r));case 1:case"end":return e.stop()}}),e)})));return function(t,n){return e.apply(this,arguments)}}(),e.prev=1,e.next=4,r(n,".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,r(n,".gltf");case 12:case"end":return e.stop()}}),e,null,[[1,7]])}))),He.apply(this,arguments)}function Ue(e){var t,n=new P.Mesh("parent",e),r=Object(d.a)(e.meshes);try{for(r.s();!(t=r.n()).done;){var a=t.value;a!==n&&a.setParent(n)}}catch(s){r.e(s)}finally{r.f()}!function(e){var t=e.getChildren().filter((function(e){return"__root__"!==e.id}));if(t.length>0){for(var n=t[0],r=n.getBoundingInfo(),a=r.boundingBox.minimumWorld.add(n.position),o=r.boundingBox.maximumWorld.add(n.position),c=1;c<t.length;c++){var i=t[c],s=(r=i.getBoundingInfo()).boundingBox.minimumWorld.add(i.position),u=r.boundingBox.maximumWorld.add(i.position);a=P.Vector3.Minimize(a,s),o=P.Vector3.Maximize(o,u)}e.setBoundingInfo(new P.BoundingInfo(a,o))}}(n);var o=n.getBoundingInfo().boundingBox.extendSize.length(),c=new P.Vector3(1/o,1/o,1/o);n.scaling=c;var i=n.getBoundingInfo().boundingBox.center.multiply(c);n.position.subtractInPlace(i)}var ze=[l.PreviewEmote.IDLE,l.PreviewEmote.MONEY,l.PreviewEmote.CLAP];function Ze(e){return ze.includes(e)}function Ge(e){var t="https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2449988983.commit-0534c22";t.endsWith("/")||(t+="/");var n="./emotes/".concat(e,".glb");return t.startsWith("http")?new URL(n,t).href:n}function Xe(e,t){return Je.apply(this,arguments)}function Je(){return(Je=Object(v.a)(h.a.mark((function e(t,n){var r;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Ve(t,n);case 2:if(0!==(r=e.sent).animationGroups.length){e.next=5;break}throw new Error("No animation groups found for emote with url=".concat(n));case 5:return e.abrupt("return",r);case 6:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function Ke(e,t,n){return qe.apply(this,arguments)}function qe(){return(qe=Object(v.a)(h.a.mark((function e(t,n,r){var a,o;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(a=F(n,r.bodyShape),o=a.contents.find((function(e){return e.key===a.mainFile}))){e.next=4;break}throw new Error("Could not find a valid content in representation for wearable=".concat(n.id," and bodyShape=").concat(r.bodyShape));case 4:return e.abrupt("return",Xe(t,o.url));case 5:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function Qe(e,t,n){return $e.apply(this,arguments)}function $e(){return $e=Object(v.a)(h.a.mark((function e(t,n,r){var a,o,c,i,s,u,f,p,b,w,m,y,g,E,O,x,k,j,S,W,A,C;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(p=function(){return(p=Object(v.a)(h.a.mark((function e(){return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:r.camera!==l.PreviewCamera.STATIC&&Te(t.cameras[0],r),o&&Qe(t,n,r);case 2:case"end":return e.stop()}}),e)})))).apply(this,arguments)},f=function(){return p.apply(this,arguments)},o=Ze(r.emote),!r.wearable||!J(r.wearable)){e.next=16;break}return e.prev=4,e.next=7,Ke(t,r.wearable,r);case 7:a=e.sent,o=!!(null===(c=r.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(r.wearable.id));case 14:e.next=22;break;case 16:if(!r.wearables.some(J)){e.next=22;break}return s=r.wearables.reverse().find(J),e.next=20,Ke(t,s,r);case 20:a=e.sent,o=!!(null===(i=s.emoteDataV0)||void 0===i?void 0:i.loop);case 22:if(a){e.next=27;break}return u=Ge(r.emote),e.next=26,Xe(t,u);case 26:a=e.sent;case 27:e.prev=27,b=new P.AnimationGroup("emote",t),w=Object(d.a)(n),e.prev=30,w.s();case 32:if((m=w.n()).done){e.next=43;break}if(y=m.value,g=y.container.transformNodes.reduce((function(e,t){var n=e.get(t.id)||[];return n.push(t),e.set(t.id,n)}),new Map),!(a.animationGroups.length>0)){e.next=40;break}E=Object(d.a)(a.animationGroups[0].targetedAnimations);try{for(E.s();!(O=E.n()).done;)if(x=O.value,k=x.animation,j=x.target,(S=g.get(j.id))&&S.length>0){W=Object(d.a)(S);try{for(W.s();!(A=W.n()).done;)C=A.value,b.addTargetedAnimation(k,C)}catch(B){W.e(B)}finally{W.f()}}}catch(B){E.e(B)}finally{E.f()}e.next=41;break;case 40:throw new Error("No animationGroups found");case 41:e.next=32;break;case 43:e.next=48;break;case 45:e.prev=45,e.t1=e.catch(30),w.e(e.t1);case 48:return e.prev=48,w.f(),e.finish(48);case 51:b.play(),b.onAnimationEndObservable.addOnce(f),e.next=58;break;case 55:e.prev=55,e.t2=e.catch(27),console.warn("Could not play emote=".concat(r.emote),e.t2);case 58:case"end":return e.stop()}}),e,null,[[4,11],[27,55],[30,45,48,51]])}))),$e.apply(this,arguments)}function et(e,t,n){return function(){var r=Object(v.a)(h.a.mark((function r(a){var o;return h.a.wrap((function(r){for(;;)switch(r.prev=r.next){case 0:if(!(o=t.find(ke(a)))){r.next=3;break}return r.abrupt("return",Promise.all([Ye(e,o,n),De(e,o,n)]));case 3:return r.abrupt("return",[null,null]);case 4:case"end":return r.stop()}}),r)})));return function(e){return r.apply(this,arguments)}}()}function tt(e,t,n){return nt.apply(this,arguments)}function nt(){return(nt=Object(v.a)(h.a.mark((function e(t,n,r){var a,o,c,s,u,f;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return a=et(t,n,r),e.next=3,Promise.all([a(l.WearableCategory.EYES),a(l.WearableCategory.EYEBROWS),a(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 rt(e,t,n,r,a,o){return at.apply(this,arguments)}function at(){return(at=Object(v.a)(h.a.mark((function e(t,n,r,a,o,c){var s,u,l,f,p,b,v,w,m,y,g,E;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:s=Object(d.a)(n.container.meshes);try{for(s.s();!(u=s.n()).done;)(l=u.value).name.toLowerCase().endsWith("mask_eyes")&&(f=Object(i.a)(r,2),p=f[0],b=f[1],p&&ot(t,"eyes",l,p,c.eyes,b,"#ffffff")),l.name.toLowerCase().endsWith("mask_eyebrows")&&(v=Object(i.a)(a,2),w=v[0],m=v[1],w&&ot(t,"eyebrows",l,w,c.hair,m,c.hair)),l.name.toLowerCase().endsWith("mask_mouth")&&(y=Object(i.a)(o,2),g=y[0],E=y[1],g&&ot(t,"mouth",l,g,c.skin,E,c.skin))}catch(h){s.e(h)}finally{s.f()}case 2:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function ot(e,t,n,r,a,o,c){var i=new P.StandardMaterial("".concat(t,"_standard_material"),e);i.alphaMode=P.PBRMaterial.PBRMATERIAL_ALPHABLEND,i.backFaceCulling=!0,i.specularColor=P.Color3.Black(),r.hasAlpha=!0,i.sideOrientation=P.Orientation.CW,i.diffuseTexture=r,i.diffuseColor=o?P.Color3.Black():M(c),o&&(i.emissiveTexture=o,i.emissiveColor=M(a).toLinearSpace()),n.material=i}function ct(e){var t=function(e){var t,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:l.WearableBodyShape.MALE,r={},a=Object(d.a)(e);try{for(a.s();!(t=a.n()).done;){var o=t.value;try{var c,i=F(o,n),s=Object(d.a)(i.contents);try{for(s.s();!(c=s.n()).done;){var u=c.value;r[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(n,'"'));continue}}}catch(f){a.e(f)}finally{a.f()}return r}(e.wearable?[e.wearable].concat(Object(p.a)(e.wearables)):e.wearables,e.bodyShape);P.SceneLoader.OnPluginActivatedObservable.add((function(e){"gltf"===e.name&&(e.preprocessUrlAsync=function(){var e=Object(v.a)(h.a.mark((function e(n){var r;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return"/content/contents/",r=n.split("/content/contents/"),e.abrupt("return",r.length>0&&r[1]?t[r[1]]:n);case 3:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}())}))}var it="#include<pbrBlockFinalColorComposition>",st="#include<customToonShading>";if(!P.Effect.ShadersStore.pbrPixelShader.includes(it))throw new Error("could not patch the pbrPixelShader");function ut(e,t){return lt.apply(this,arguments)}function lt(){return lt=Object(v.a)(h.a.mark((function e(t,n){var r,a,o,c,i,s,u,f,p,b,v,w,m,y=arguments;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(r=y.length>2&&void 0!==y[2]?y[2]:l.WearableBodyShape.MALE,a=y.length>3?y[3]:void 0,o=y.length>4?y[4]:void 0,!H(c=F(n,r))){e.next=6;break}throw new Error('The wearable="'.concat(n.id,'" is a texture'));case 6:return i=V(c),e.next=9,Ve(t,i);case 9:s=e.sent,u=Object(d.a)(s.materials);try{for(u.s();!(f=u.n()).done;)(p=f.value)instanceof P.PBRMaterial&&((b=p).metallic&&(b.metallic=0,b.metallicF0Factor=0),b.name.toLowerCase().includes("hair")&&(o?(b.albedoColor=P.Color3.FromHexString(o).toLinearSpace(),b.specularIntensity=0,b.alpha=1):(b.alpha=0,t.removeMaterial(b))),b.name.toLowerCase().includes("skin")&&(a?(b.albedoColor=P.Color3.FromHexString(a).toLinearSpace(),b.specularIntensity=0,b.alpha=1):(b.alpha=0,t.removeMaterial(b))))}catch(h){u.e(h)}finally{u.f()}v=Object(d.a)(s.animationGroups);try{for(v.s();!(w=v.n()).done;)(m=w.value).stop(),m.reset(),m.dispose()}catch(h){v.e(h)}finally{v.f()}return e.abrupt("return",{container:s,wearable:n});case 15:case"end":return e.stop()}}),e)}))),lt.apply(this,arguments)}function ft(){return(ft=Object(v.a)(h.a.mark((function e(t,n){var r,a,o,c,i,s,u,f,p,b,v,w,m,y,g,E,O,x;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Ie(t,n);case 2:if(r=e.sent,ct(n),a=[],n.type!==l.PreviewType.AVATAR){e.next=29;break}o=Pe(n),c=Array.from(o.values()),i=Object(d.a)(c.filter(We));try{for(i.s();!(s=i.n()).done;)u=s.value,f=ut(r,u,n.bodyShape,n.skin,n.hair).catch((function(e){console.warn(e.message)})),a.push(f)}catch(h){i.e(h)}finally{i.f()}return e.next=12,Promise.all(a);case 12:p=e.sent.filter(Se),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()}if(!(w=Ce(p))){e.next=25;break}return m=c.filter(Ae),e.next=20,tt(r,m,n.bodyShape);case 20:y=e.sent,g=y.eyes,E=y.eyebrows,O=y.mouth,rt(r,w,g,E,O,n);case 25:return e.next=27,Qe(r,p,n);case 27:e.next=45;break;case 29:if(n.wearable){e.next=31;break}throw new Error("No wearable to render");case 31:return x=n.wearable,e.prev=32,e.next=35,ut(r,x,n.bodyShape,n.skin,n.hair);case 35:e.sent.container.addAllToScene(),e.next=45;break;case 39:return e.prev=39,e.t0=e.catch(32),e.next=43,ut(r,x,n.bodyShape===l.WearableBodyShape.MALE?l.WearableBodyShape.FEMALE:l.WearableBodyShape.MALE,n.skin,n.hair);case 43:e.sent.container.addAllToScene();case 45:n.centerBoundingBox&&Ue(r);case 46:case"end":return e.stop()}}),e,null,[[32,39]])})))).apply(this,arguments)}P.Effect.ShadersStore.pbrPixelShader.includes(st)||(P.Effect.ShadersStore.pbrPixelShader=P.Effect.ShadersStore.pbrPixelShader.replace(it,it+"\n"+st+"\n")),P.Effect.IncludesShadersStore.customToonShading=n(454).default;n(455);var dt=n(151),pt=function(){var e=Object(r.useState)(""),t=Object(i.a)(e,2),n=t[0],a=t[1],o=function(){var e=Object(r.useState)({width:void 0,height:void 0}),t=Object(i.a)(e,2),n=t[0],a=t[1];return Object(r.useEffect)((function(){function e(){a({width:window.innerWidth,height:window.innerHeight})}return window.addEventListener("resize",e),e(),function(){return window.removeEventListener("resize",e)}}),[]),n}(),c=o.width,s=o.height,f=Object(r.useState)({}),d=Object(i.a)(f,2),p=d[0],b=d[1],h=Object(r.useState)(!1),v=Object(i.a)(h,2),w=v[0],m=v[1],y=Object(r.useState)(!0),g=Object(i.a)(y,2),E=g[0],O=g[1],x=Object(r.useState)(!1),k=Object(i.a)(x,2),j=k[0],S=k[1],W=Object(r.useRef)(null),A=xe(),C=Object(i.a)(A,3),B=C[0],P=C[1],T=C[2],L=Object(r.useState)(""),R=Object(i.a)(L,2),M=R[0],I=R[1],_=Object(r.useState)(!0),D=Object(i.a)(_,2),F=D[0],Y=D[1],N=Object(r.useState)(!1),V=Object(i.a)(N,2),H=V[0],U=V[1],z=n||T,Z=(E||P)&&!z,G=!!M&&!F&&!Z,X=F&&!Z;return Object(r.useEffect)((function(){W.current&&B&&(b({backgroundImage:B.background.gradient?B.background.gradient:void 0,opacity:1}),B.background.image&&I(B.background.image),B.type===l.PreviewType.TEXTURE?(Y(!1),O(!1),S(!0)):function(e,t){return ft.apply(this,arguments)}(W.current,B).catch((function(e){return a(e.message)})).finally((function(){O(!1),S(!0)})))}),[W.current,B]),Object(r.useEffect)((function(){H||(j?(Object(l.sendMessage)(window.parent,l.PreviewMessageType.LOAD,null),U(!0)):z&&(Object(l.sendMessage)(window.parent,l.PreviewMessageType.ERROR,{message:z}),U(!0)))}),[j,z,H]),Object(r.useEffect)((function(){if(P){var e=!1;E||(O(!0),e=!0),H&&(U(!1),e=!0),e&&j&&S(!1)}}),[P,E,H,j]),Object(dt.jsxs)("div",{className:u()("Preview",{"is-dragging":w,"is-loading":Z,"is-loaded":j,"is-3d":F&&(null===B||void 0===B?void 0:B.camera)===l.PreviewCamera.INTERACTIVE,"has-error":!!z}),style:p,children:[Object(dt.jsx)("img",{src:M,className:u()("thumbnail",{"is-visible":G}),alt:"preview"}),Object(dt.jsx)("canvas",{id:"wearable-preview",className:u()({"is-visible":X}),width:c,height:s,ref:W,onMouseDown:function(){return m(F&&!z)},onMouseUp:function(){return m(!1)}}),z&&Object(dt.jsx)("div",{className:"error",children:z})]})},bt=a.a.memo(pt);c.a.render(Object(dt.jsx)(a.a.StrictMode,{children:Object(dt.jsx)(bt,{})}),document.getElementById("root"))}},[[459,1,2]]]);
2
- //# sourceMappingURL=main.db7754ff.chunk.js.map
1
+ (this["webpackJsonp@dcl/wearable-preview"]=this["webpackJsonp@dcl/wearable-preview"]||[]).push([[0],{330:function(e,t,n){},448:function(e,t){},454:function(e,t,n){"use strict";n.r(t),t.default="float angleY = 3.14 / 2.0;\n\nmat3 rotateY = mat3(\n cos(angleY), 0, sin(angleY),\n 0, 1, 0,\n -sin(angleY), 0, cos(angleY)\n);\n\n// view angle DOT normal of the position\nvec3 tray = normalize(viewDirectionW * rotateY);\nvec3 rayDirection = normalize(tray-vPositionW);\nfloat t=(dot(normalW,rayDirection) + 1.0) / 2.0;\n\nfloat ToonThresholds[3];\nToonThresholds[0] = 0.90;\nToonThresholds[1] = 0.80;\nToonThresholds[2] = 0.20;\n\nfloat ToonBrightnessLevels[4];\nToonBrightnessLevels[0] = 1.2;\nToonBrightnessLevels[1] = 1.0;\nToonBrightnessLevels[2] = 1.0;\nToonBrightnessLevels[3] = 0.8;\n\nif (t > ToonThresholds[0])\n{\n finalColor.rgb *= ToonBrightnessLevels[0];\n}\nelse if (t > ToonThresholds[1])\n{\n finalColor.rgb *= ToonBrightnessLevels[1];\n}\nelse if (t > ToonThresholds[2])\n{\n finalColor.rgb *= ToonBrightnessLevels[2];\n}\nelse\n{\n finalColor.rgb *= ToonBrightnessLevels[3];\n}\n"},455:function(e,t,n){},459:function(e,t,n){"use strict";n.r(t);var r=n(56),a=n.n(r),o=n(324),c=n.n(o),i=(n(330),n(61)),s=n(252),u=n.n(s),l=n(20);var f,d=n(70),p=n(110),b=n(31),h=n.n(b),v=n(43),w=n(249),y=n(250),m=n(167);function g(e){return E.apply(this,arguments)}function E(){return(E=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 O(e){return x.apply(this,arguments)}function x(){return x=Object(v.a)(h.a.mark((function e(t){var n,r,a=arguments;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=a.length>1&&void 0!==a[1]?a[1]:3,e.prev=1,e.next=4,fetch(t);case 4:if((r=e.sent).ok){e.next=11;break}return e.t0=Error,e.next=9,r.text();case 9:throw e.t1=e.sent,new e.t0(e.t1);case 11:return e.abrupt("return",r.json());case 14:if(e.prev=14,e.t2=e.catch(1),!(n>0)){e.next=22;break}return e.next=19,g(100);case 19:return e.abrupt("return",O(t,n-1));case 22:throw e.t2;case 23:case"end":return e.stop()}}),e,null,[[1,14]])}))),x.apply(this,arguments)}var k,j=(f={},Object(m.a)(f,l.PreviewEnv.DEV,"https://nft-api.decentraland.io"),Object(m.a)(f,l.PreviewEnv.PROD,"https://nft-api.decentraland.org"),f),S=function(){function e(){Object(w.a)(this,e)}return Object(y.a)(e,[{key:"fetchItem",value:function(){var e=Object(v.a)(h.a.mark((function e(t,n,r){var a,o;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,O("".concat(j[r],"/v1/items?contractAddress=").concat(t,"&itemId=").concat(n));case 2:if(a=e.sent,0!==(o=a.data).length){e.next=6;break}throw new Error('Item not found for contractAddress="'.concat(t,'" itemId="').concat(n,'"'));case 6:return e.abrupt("return",o[0]);case 7:case"end":return e.stop()}}),e)})));return function(t,n,r){return e.apply(this,arguments)}}()},{key:"fetchNFT",value:function(){var e=Object(v.a)(h.a.mark((function e(t,n,r){var a,o;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,O("".concat(j[r],"/v1/nfts?contractAddress=").concat(t,"&tokenId=").concat(n));case 2:if(a=e.sent,0!==(o=a.data).length){e.next=6;break}throw new Error('NFT not found for contractAddress="'.concat(t,'" tokenId="').concat(n,'"'));case 6:return e.abrupt("return",o[0].nft);case 7:case"end":return e.stop()}}),e)})));return function(t,n,r){return e.apply(this,arguments)}}()}]),e}(),W=new S,A=(k={},Object(m.a)(k,l.PreviewEnv.DEV,"https://peer.decentraland.zone"),Object(m.a)(k,l.PreviewEnv.PROD,"https://peer.decentraland.org"),k),C=function(){function e(){Object(w.a)(this,e)}return Object(y.a)(e,[{key:"fetchWearables",value:function(){var e=Object(v.a)(h.a.mark((function e(t,n){var r,a;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(0!==t.length){e.next=2;break}return e.abrupt("return",[]);case 2:return e.next=4,O("".concat(A[n],"/lambdas/collections/wearables?").concat(t.map((function(e){return"wearableId=".concat(e)})).join("&")));case 4:if(r=e.sent,0!==(a=r.wearables).length){e.next=8;break}throw new Error('Wearables not found for urns="'.concat(t,'"'));case 8:return e.abrupt("return",a);case 9:case"end":return e.stop()}}),e)})));return function(t,n){return e.apply(this,arguments)}}()},{key:"fetchProfile",value:function(){var e=Object(v.a)(h.a.mark((function e(t,n){var r;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,O("".concat(A[n],"/lambdas/profiles?id=").concat(t));case 2:return r=e.sent,e.abrupt("return",r.length>0?r[0]:null);case 4:case"end":return e.stop()}}),e)})));return function(t,n){return e.apply(this,arguments)}}()}]),e}(),B=new C;var P=n(36);function T(e){return e.startsWith("#")?e:"#"+e}function L(e){return("0"+(255*e|0).toString(16)).slice(-2)}function R(e){return L(e.r)+L(e.g)+L(e.b)}function M(e){var t=function(e){return e.startsWith("#")?e.slice(1):e}(e);return new P.Color3(parseInt(t.slice(0,2),16)/256,parseInt(t.slice(2,4),16)/256,parseInt(t.slice(4,6),16)/256)}function I(e,t){return e.bodyShapes.includes(t)}function _(e){return I(e,l.WearableBodyShape.MALE)}function D(e){return I(e,l.WearableBodyShape.FEMALE)}function F(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(D))throw new Error('Could not find a BaseFemale representation for wearable="'.concat(e.id,'"'));return e.data.representations.find(D);case l.WearableBodyShape.MALE:if(!e.data.representations.some(_))throw new Error('Could not find a BaseMale representation for wearable="'.concat(e.id,'"'));return e.data.representations.find(_)}}function Y(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:l.WearableBodyShape.MALE;if(N(e,t))return F(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 N(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:l.WearableBodyShape.MALE;try{return F(e,t),!0}catch(n){return!1}}function V(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 H(e){return e.mainFile.endsWith("png")}function U(e,t){return e.find((function(e){return e.data.category===t}))||null}function z(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 Z(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 G(e){return!!e}function X(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 J(e){return!!e&&"emoteDataV0"in e}function K(e){var t=e?parseFloat(e):null;return null===t||isNaN(t)?null:1.8*Math.min(Math.max(t,0),100)/100+1}function q(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}}var Q="default";function $(e,t){return ee.apply(this,arguments)}function ee(){return(ee=Object(v.a)(h.a.mark((function e(t,n){var r;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,ae([t],n);case 2:if(1===(r=e.sent).length){e.next=5;break}throw new Error('Could not find wearable for urn="'.concat(t,'"'));case 5:return e.abrupt("return",r[0]);case 6:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function te(e){return JSON.parse(atob(e))}function ne(e,t){return re.apply(this,arguments)}function re(){return(re=Object(v.a)(h.a.mark((function e(t,n){var r;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t){e.next=2;break}return e.abrupt("return",[]);case 2:return e.next=4,ae(t.avatar.wearables,n);case 4:return r=e.sent,e.abrupt("return",r.filter((function(e){return!J(e)})));case 6:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function ae(e,t){return oe.apply(this,arguments)}function oe(){return(oe=Object(v.a)(h.a.mark((function e(t,n){return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(0!==t.length){e.next=2;break}return e.abrupt("return",[]);case 2:return e.abrupt("return",B.fetchWearables(t,n));case 3:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function ce(e){return ie.apply(this,arguments)}function ie(){return(ie=Object(v.a)(h.a.mark((function e(t){var n,r;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(0!==t.length){e.next=2;break}return e.abrupt("return",[]);case 2:return n=t.map((function(e){return fetch(e).then((function(e){return e.json()})).catch()})),e.next=5,Promise.all(n);case 5:return r=e.sent,e.abrupt("return",r.filter(G));case 7:case"end":return e.stop()}}),e)})))).apply(this,arguments)}var se=function(){var e={};return{memo:function(){var t=Object(v.a)(h.a.mark((function t(n,r){var a,o,c,i=arguments;return h.a.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(!(n in e)){for(a=i.length,o=new Array(a>2?a-2:0),c=2;c<a;c++)o[c-2]=i[c];e[n]=r.apply(void 0,o)}return t.abrupt("return",e[n]);case 3:case"end":return t.stop()}}),t)})));return function(e,n){return t.apply(this,arguments)}}(),reset:function(){for(var t in e)delete e[t]}}}();function ue(e,t){return le.apply(this,arguments)}function le(){return(le=Object(v.a)(h.a.mark((function e(t,n){return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt("return",se.memo(t,Object(v.a)(h.a.mark((function e(){var r;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(t!==Q){e.next=2;break}return e.abrupt("return",null);case 2:return e.next=4,B.fetchProfile(t,n).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 4:return r=e.sent,e.abrupt("return",r||null);case 6:case"end":return e.stop()}}),e)})))));case 1:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function fe(e){return de.apply(this,arguments)}function de(){return(de=Object(v.a)(h.a.mark((function e(t){var n,r,a,o,c,i,s;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n=t.contractAddress,r=t.itemId,a=t.tokenId,o=t.env,r||a){e.next=3;break}throw new Error("You need to provide an itemId or a tokenId");case 3:if(c=o===l.PreviewEnv.PROD?"matic":"mumbai",i="urn:decentraland:".concat(c,":collections-v2:").concat(n,":").concat(r),r||a){e.next=9;break}throw new Error("You must provide either tokenId or itemId");case 9:if(r||!a){e.next=14;break}return e.next=12,W.fetchNFT(n,a,o);case 12:s=e.sent,i=s.network!==l.Network.ETHEREUM?"urn:decentraland:".concat(c,":collections-v2:").concat(n,":").concat(s.itemId):s.image.split("contents/")[1].split("/thumbnail")[0];case 14:return e.abrupt("return",$(i,o));case 15:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function pe(e,t,n,r,a,o){return be.apply(this,arguments)}function be(){return(be=Object(v.a)(h.a.mark((function e(t,n,r,a,o,c){var i,s,u,l,f,b,v;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.t0=[],e.t1=p.a,e.next=4,ne(t,c);case 4:return e.t2=e.sent,e.t3=(0,e.t1)(e.t2),e.t4=p.a,e.next=9,ae([o].concat(Object(p.a)(n)),c);case 9:return e.t5=e.sent,e.t6=(0,e.t4)(e.t5),e.t7=p.a,e.next=14,ce(r);case 14:e.t8=e.sent,e.t9=(0,e.t7)(e.t8),e.t10=Object(p.a)(a.map(te)),i=(i=e.t0.concat.call(e.t0,e.t3,e.t6,e.t9,e.t10)).filter((function(e){return N(e,o)})),s=[],u=Object(d.a)(z(o)),e.prev=21,u.s();case 23:if((l=u.n()).done){e.next=35;break}if(f=l.value,U(i,f)){e.next=33;break}if(!(b=Z(f,o))){e.next=32;break}s.push(b),e.next=33;break;case 32:throw new Error('Could not get default URN for category="'.concat(f,'"'));case 33:e.next=23;break;case 35:e.next=40;break;case 37:e.prev=37,e.t11=e.catch(21),u.e(e.t11);case 40:return e.prev=40,u.f(),e.finish(40);case 43:if(!(s.length>0)){e.next=48;break}return e.next=46,ae(s,c);case 46:v=e.sent,i=[].concat(Object(p.a)(i),Object(p.a)(v));case 48:return e.abrupt("return",i);case 49:case"end":return e.stop()}}),e,null,[[21,37,40,43]])})))).apply(this,arguments)}function he(){return he=Object(v.a)(h.a.mark((function e(){var t,n,r,a,o,c,s,u,f,d,b,v,w,y,m,g,E,O,x,k,j,S,W,A,C,B,P,L,M,I,_,D,F,N,V=arguments;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=V.length>0&&void 0!==V[0]?V[0]:{},n=t.contractAddress,r=t.tokenId,a=t.itemId,o=t.env||l.PreviewEnv.PROD,c=Promise.resolve(),n&&(c=fe({contractAddress:n,tokenId:r,itemId:a,env:o})),s=t.profile?ue(t.profile,o):Promise.resolve(null),e.next=8,Promise.all([c,s]);case 8:if(u=e.sent,f=Object(i.a)(u,2),d=f[0],b=f[1],v=t.bodyShape||b&&b.avatar.bodyShape||(d?X(d):l.WearableBodyShape.MALE),w=T(t.skin||b&&R(b.avatar.skin.color)||"cc9b76"),y=T(t.hair||b&&R(b.avatar.hair.color)||"000000"),m=T(t.eyes||b&&R(b.avatar.eyes.color)||"000000"),g=Object(p.a)(t.urns||[]),E=t.urls||[],O=t.base64s||[],x=[],k=1.75,j=l.PreviewType.WEARABLE,S={gradient:t.transparentBackground?void 0:"radial-gradient(#676370, #18141b)"},!(g.length>0||E.length>0||O.length>0||d&&J(d)||t.profile)){e.next=28;break}return j=l.PreviewType.AVATAR,e.next=27,pe(b,g,E,O,v,o);case 27:x=e.sent;case 28:return d&&(k=x.length>0?k:q(d),H(Y(d))&&j!==l.PreviewType.AVATAR&&(j=l.PreviewType.TEXTURE),W=l.Rarity.getGradient(d.rarity),A=Object(i.a)(W,2),C=A[0],B=A[1],P="radial-gradient(".concat(C,", ").concat(B,")"),S={image:d.thumbnail,gradient:P}),L=l.PreviewEmote.IDLE,t.emote&&Object.values(l.PreviewEmote).includes(t.emote)&&(L=t.emote),M=l.PreviewCamera.INTERACTIVE,t.camera&&Object.values(l.PreviewCamera).includes(t.camera)&&(M=t.camera),I="number"!==typeof t.autoRotateSpeed||isNaN(t.autoRotateSpeed)?.2:t.autoRotateSpeed,_="boolean"===typeof t.centerBoundingBox&&!1!==t.centerBoundingBox,D=1,F=100,N=50,ve(t.wheelZoom)&&(D=Math.max(t.wheelZoom,1)),ve(t.wheelPrecision)&&(F=Math.max(t.wheelPrecision,1)),ve(t.wheelStart)&&(N=100-Math.min(Math.max(t.wheelStart,0),100)),e.abrupt("return",{wearable:null!==d&&void 0!==d?d:void 0,wearables:x,bodyShape:v,skin:w,hair:y,eyes:m,type:j,background:S,emote:L,camera:M,autoRotateSpeed:I,centerBoundingBox:_,offsetX:t.offsetX||0,offsetY:t.offsetY||0,offsetZ:t.offsetZ||0,zoom:t.zoom||k,wheelZoom:D,wheelPrecision:F,wheelStart:N});case 42:case"end":return e.stop()}}),e)}))),he.apply(this,arguments)}function ve(e){return"number"===typeof e&&!isNaN(e)}var we={};function ye(e,t){return t===we[e]}var me=n(266),ge=n(325),Ee=n.n(ge),Oe=function(){var e=Object(r.useState)(window.location.search.toString()),t=Object(i.a)(e,1)[0],n=Object(r.useMemo)((function(){var e=new URLSearchParams(t),n=e.get("autoRotateSpeed"),r=e.get("offsetX"),a=e.get("offsetY"),o=e.get("offsetZ"),c=e.get("wheelZoom"),i=e.get("wheelPrecision"),s=e.get("wheelStart"),u=e.get("bodyShape");return{contractAddress:e.get("contract"),tokenId:e.get("token"),itemId:e.get("item"),skin:e.get("skin"),hair:e.get("hair"),eyes:e.get("eyes"),emote:e.get("emote"),camera:e.get("camera"),transparentBackground:e.has("transparentBackground"),centerBoundingBox:"false"!==e.get("centerBoundingBox"),autoRotateSpeed:n?parseFloat(n):null,offsetX:r?parseFloat(r):null,offsetY:a?parseFloat(a):null,offsetZ:o?parseFloat(o):null,wheelZoom:c?parseFloat(c):null,wheelPrecision:i?parseFloat(i):null,wheelStart:s?parseFloat(s):null,zoom:K(e.get("zoom")),bodyShape:"female"===u||u===l.WearableBodyShape.FEMALE?l.WearableBodyShape.FEMALE:"male"===u||u===l.WearableBodyShape.MALE?l.WearableBodyShape.MALE:null,urns:e.getAll("urn"),urls:e.getAll("url"),base64s:e.getAll("base64"),profile:e.get("profile"),env:Object.values(l.PreviewEnv).filter((function(e){return"string"===typeof e})).reduce((function(t,n){return n===e.get("env")?n:t}),l.PreviewEnv.PROD)}}),[t]),a=function(){var e=Object(r.useState)({}),t=Object(i.a)(e,2),n=t[0],a=t[1],o=Object(r.useState)(!1),c=Object(i.a)(o,2),s=c[0],u=c[1];return Object(r.useEffect)((function(){function e(e){if(e.data&&e.data.type===l.PreviewMessageType.UPDATE&&"object"===typeof e.data.payload&&"object"===typeof e.data.payload.options){var t=e.data.payload.options;Ee()(n,t)||a(t)}}return window.addEventListener("message",e),s||(Object(l.sendMessage)(window.parent,l.PreviewMessageType.READY,{}),u(!0)),function(){window.removeEventListener("message",e)}}),[n,s]),n}();return Object(r.useMemo)((function(){return Object(me.a)(Object(me.a)({},n),a)}),[n,a])};function xe(){var e=Oe(),t=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[],a=Object(r.useState)(!1),o=Object(i.a)(a,2),c=o[0],s=o[1],u=Object(r.useState)(null),l=Object(i.a)(u,2),f=l[0],d=l[1],p=Object(r.useState)(""),b=Object(i.a)(p,2),h=b[0],v=b[1];return"undefined"===typeof we[e]&&(we[e]=0),Object(r.useEffect)((function(){var n=++we[e];s(!0),t().then((function(t){ye(e,n)&&d(t)})).catch((function(t){ye(e,n)&&v(t.message)})).finally((function(){ye(e,n)&&s(!1)}))}),n),[f,c,h]}("useConfig",(function(){return function(){return he.apply(this,arguments)}(e)}),[e]),n=Object(i.a)(t,3);return[n[0],n[1],n[2]]}function ke(e){return function(t){return t.data.category===e}}function je(e){return function(t){return t.wearable.data.category===e||(t.wearable.data.hides||[]).includes(e)||(t.wearable.data.replaces||[]).includes(e)}}function Se(e){return!!e}function We(e){return!H(Y(e))}function Ae(e){return!We(e)}function Ce(e){var t=e.find((function(e){return e.wearable.data.category===l.WearableCategory.BODY_SHAPE}));if(!t)return null;var n,r=e.some((function(e){return e.wearable.data.category===l.WearableCategory.SKIN})),a=r||e.some(je(l.WearableCategory.UPPER_BODY)),o=r||e.some(je(l.WearableCategory.LOWER_BODY)),c=r||e.some(je(l.WearableCategory.FEET)),i=r||e.some(je(l.WearableCategory.HEAD)),s=Object(d.a)(t.container.meshes);try{for(s.s();!(n=s.n()).done;){var u=n.value,f=u.name.toLowerCase();f.endsWith("ubody_basemesh")&&a&&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 Be=[l.WearableCategory.HELMET,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 Pe(e){var t=new Map,n=e.wearables.filter((function(e){return!J(e)}));e.wearable&&!J(e.wearable)&&(n=e.wearables.filter((function(t){if(e.wearable){var n=e.wearable.data,r=n.category,a=n.hides,o=n.replaces;if("skin"===t.data.category){if(Be.includes(r))return!1;if(a&&a.includes(l.WearableCategory.HEAD))return!1;if(o&&o.includes(l.WearableCategory.HEAD))return!1}if(t.data.hides&&t.data.hides.includes(r))return!1;if(t.data.replaces&&t.data.replaces.includes(r))return!1}return!0})),n.push(e.wearable));var r,a=Object(d.a)(n);try{for(a.s();!(r=a.n()).done;){var o=r.value,c=o.data.category;N(o,e.bodyShape)&&t.set(c,o)}}catch(j){a.e(j)}finally{a.f()}var i=!1;n=n.filter((function(e){return t.get(e.data.category)===e})).reverse();var s,u=new Set,f=Object(d.a)(n);try{for(f.s();!(s=f.n()).done;){var b=s.value,h=b.data.category;if(!u.has(h)){for(var v=b.data.replaces||[],w=b.data.hides||[],y=Array.from(new Set([].concat(Object(p.a)(v),Object(p.a)(w)))),m=0,g=y;m<g.length;m++){var E=g[m];E!==h&&(t.delete(E),u.add(E))}b.data.category===l.WearableCategory.SKIN&&(i=!0)}}}catch(j){f.e(j)}finally{f.f()}if(i){var O,x=Object(d.a)(Be);try{for(x.s();!(O=x.n()).done;){var k=O.value;t.delete(k)}}catch(j){x.e(j)}finally{x.f()}}return t}function Te(e,t){e&&(e.useAutoRotationBehavior=!0,e.autoRotationBehavior&&(e.autoRotationBehavior.idleRotationSpeed=t.autoRotateSpeed))}n(323);function Le(){return["iPad Simulator","iPhone Simulator","iPod Simulator","iPad","iPhone","iPod"].includes(navigator.platform)}var Re,Me=!1;function Ie(e,t){return _e.apply(this,arguments)}function _e(){return(_e=Object(v.a)(h.a.mark((function e(t,n){var r,a,o;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:Re&&Re.dispose(),Re=new P.Engine(t,!0,{preserveDrawingBuffer:!0,stencil:!0,antialias:!0}),(r=new P.Scene(Re)).autoClear=!0,r.clearColor=new P.Color4(0,0,0,0),r.ambientColor=new P.Color3(1,1,1),r.preventDefaultOnPointerDown=!1,(a=new P.ArcRotateCamera("camera",0,0,0,new P.Vector3(0,0,0),r)).mode=P.Camera.PERSPECTIVE_CAMERA,e.t0=n.camera,e.next=e.t0===l.PreviewCamera.INTERACTIVE?12:e.t0===l.PreviewCamera.STATIC?23:25;break;case 12:e.t1=n.type,e.next=e.t1===l.PreviewType.WEARABLE?15:e.t1===l.PreviewType.AVATAR?18:20;break;case 15:return Te(a,n),a.position=new P.Vector3(-2,2,2),e.abrupt("break",21);case 18:return a.position=new P.Vector3(0,1,3.5),e.abrupt("break",21);case 20:console.warn('Unexpected preview.type="'.concat(n.type,'"'));case 21:return a.attachControl(t,!0),e.abrupt("break",25);case 23:return a.position=new P.Vector3(0,1,3.5),e.abrupt("break",25);case 25:return o=new P.Vector3(n.offsetX,n.offsetY,n.offsetZ),a.position.addInPlace(o),a.setTarget(o),a.lowerRadiusLimit=a.radius/n.zoom,a.upperRadiusLimit=a.lowerRadiusLimit*n.wheelZoom,a.radius=a.lowerRadiusLimit+(a.upperRadiusLimit-a.lowerRadiusLimit)*n.wheelStart/100,a.wheelPrecision=n.wheelPrecision,n.type===l.PreviewType.WEARABLE&&(new P.DirectionalLight("directional",new P.Vector3(0,0,1),r).intensity=1,new P.SpotLight("spot",new P.Vector3(-2,2,2),new P.Vector3(2,-2,-2),Math.PI/2,1e3,r).intensity=1),new P.HemisphericLight("top",new P.Vector3(0,-1,0),r).intensity=1,new P.HemisphericLight("bottom",new P.Vector3(0,1,0),r).intensity=1,Le()||(new P.GlowLayer("glow",r).intensity=2.5),Re.runRenderLoop((function(){r.render()})),e.abrupt("return",r);case 41:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function De(e,t,n){return Fe.apply(this,arguments)}function Fe(){return(Fe=Object(v.a)(h.a.mark((function e(t,n,r){var a,o,c;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(a=n.id,o=F(n,r),!(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,n){var r=new P.TextureAssetTask(a,c.url,!0,!1);r.onError=function(){return n(r.errorObject)},r.onSuccess=function(){e(r.texture)},r.run(t,(function(){return e(r.texture)}),n)})));case 5:return e.abrupt("return",null);case 6:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function Ye(e,t,n){return Ne.apply(this,arguments)}function Ne(){return(Ne=Object(v.a)(h.a.mark((function e(t,n,r){var a,o,c;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(a=n.id,o=F(n,r),!(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,n){var r=new P.TextureAssetTask(a,c.url,!0,!1);r.onError=function(){return n(r.errorObject)},r.onSuccess=function(){e(r.texture)},r.run(t,(function(){return e(r.texture)}),n)})));case 5:return e.abrupt("return",null);case 6:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function Ve(e,t){return He.apply(this,arguments)}function He(){return He=Object(v.a)(h.a.mark((function e(t,n){var r;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=function(){var e=Object(v.a)(h.a.mark((function e(n,r){return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt("return",P.SceneLoader.LoadAssetContainerAsync(n,"",t,null,r));case 1:case"end":return e.stop()}}),e)})));return function(t,n){return e.apply(this,arguments)}}(),e.prev=1,e.next=4,r(n,".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,r(n,".gltf");case 12:case"end":return e.stop()}}),e,null,[[1,7]])}))),He.apply(this,arguments)}function Ue(e){var t,n=new P.Mesh("parent",e),r=Object(d.a)(e.meshes);try{for(r.s();!(t=r.n()).done;){var a=t.value;a!==n&&a.setParent(n)}}catch(s){r.e(s)}finally{r.f()}!function(e){var t=e.getChildren().filter((function(e){return"__root__"!==e.id}));if(t.length>0){for(var n=t[0],r=n.getBoundingInfo(),a=r.boundingBox.minimumWorld.add(n.position),o=r.boundingBox.maximumWorld.add(n.position),c=1;c<t.length;c++){var i=t[c],s=(r=i.getBoundingInfo()).boundingBox.minimumWorld.add(i.position),u=r.boundingBox.maximumWorld.add(i.position);a=P.Vector3.Minimize(a,s),o=P.Vector3.Maximize(o,u)}e.setBoundingInfo(new P.BoundingInfo(a,o))}}(n);var o=n.getBoundingInfo().boundingBox.extendSize.length(),c=new P.Vector3(1/o,1/o,1/o);n.scaling=c;var i=n.getBoundingInfo().boundingBox.center.multiply(c);n.position.subtractInPlace(i)}var ze=[l.PreviewEmote.IDLE,l.PreviewEmote.MONEY,l.PreviewEmote.CLAP];function Ze(e){return ze.includes(e)}function Ge(e){var t="https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2456669507.commit-cda58cb";t.endsWith("/")||(t+="/");var n="./emotes/".concat(e,".glb");return t.startsWith("http")?new URL(n,t).href:n}function Xe(e,t){return Je.apply(this,arguments)}function Je(){return(Je=Object(v.a)(h.a.mark((function e(t,n){var r;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Ve(t,n);case 2:if(0!==(r=e.sent).animationGroups.length){e.next=5;break}throw new Error("No animation groups found for emote with url=".concat(n));case 5:return e.abrupt("return",r);case 6:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function Ke(e,t,n){return qe.apply(this,arguments)}function qe(){return(qe=Object(v.a)(h.a.mark((function e(t,n,r){var a,o;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(a=F(n,r.bodyShape),o=a.contents.find((function(e){return e.key===a.mainFile}))){e.next=4;break}throw new Error("Could not find a valid content in representation for wearable=".concat(n.id," and bodyShape=").concat(r.bodyShape));case 4:return e.abrupt("return",Xe(t,o.url));case 5:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function Qe(e,t,n){return $e.apply(this,arguments)}function $e(){return $e=Object(v.a)(h.a.mark((function e(t,n,r){var a,o,c,i,s,u,f,p,b,w,y,m,g,E,O,x,k,j,S,W,A,C;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(p=function(){return(p=Object(v.a)(h.a.mark((function e(){return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:r.camera!==l.PreviewCamera.STATIC&&Te(t.cameras[0],r),o&&Qe(t,n,r);case 2:case"end":return e.stop()}}),e)})))).apply(this,arguments)},f=function(){return p.apply(this,arguments)},o=Ze(r.emote),!r.wearable||!J(r.wearable)){e.next=16;break}return e.prev=4,e.next=7,Ke(t,r.wearable,r);case 7:a=e.sent,o=!!(null===(c=r.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(r.wearable.id));case 14:e.next=22;break;case 16:if(!r.wearables.some(J)){e.next=22;break}return s=r.wearables.reverse().find(J),e.next=20,Ke(t,s,r);case 20:a=e.sent,o=!!(null===(i=s.emoteDataV0)||void 0===i?void 0:i.loop);case 22:if(a){e.next=27;break}return u=Ge(r.emote),e.next=26,Xe(t,u);case 26:a=e.sent;case 27:e.prev=27,b=new P.AnimationGroup("emote",t),w=Object(d.a)(n),e.prev=30,w.s();case 32:if((y=w.n()).done){e.next=43;break}if(m=y.value,g=m.container.transformNodes.reduce((function(e,t){var n=e.get(t.id)||[];return n.push(t),e.set(t.id,n)}),new Map),!(a.animationGroups.length>0)){e.next=40;break}E=Object(d.a)(a.animationGroups[0].targetedAnimations);try{for(E.s();!(O=E.n()).done;)if(x=O.value,k=x.animation,j=x.target,(S=g.get(j.id))&&S.length>0){W=Object(d.a)(S);try{for(W.s();!(A=W.n()).done;)C=A.value,b.addTargetedAnimation(k,C)}catch(B){W.e(B)}finally{W.f()}}}catch(B){E.e(B)}finally{E.f()}e.next=41;break;case 40:throw new Error("No animationGroups found");case 41:e.next=32;break;case 43:e.next=48;break;case 45:e.prev=45,e.t1=e.catch(30),w.e(e.t1);case 48:return e.prev=48,w.f(),e.finish(48);case 51:b.play(),b.onAnimationEndObservable.addOnce(f),e.next=58;break;case 55:e.prev=55,e.t2=e.catch(27),console.warn("Could not play emote=".concat(r.emote),e.t2);case 58:case"end":return e.stop()}}),e,null,[[4,11],[27,55],[30,45,48,51]])}))),$e.apply(this,arguments)}function et(e,t,n){return function(){var r=Object(v.a)(h.a.mark((function r(a){var o;return h.a.wrap((function(r){for(;;)switch(r.prev=r.next){case 0:if(!(o=t.find(ke(a)))){r.next=3;break}return r.abrupt("return",Promise.all([Ye(e,o,n),De(e,o,n)]));case 3:return r.abrupt("return",[null,null]);case 4:case"end":return r.stop()}}),r)})));return function(e){return r.apply(this,arguments)}}()}function tt(e,t,n){return nt.apply(this,arguments)}function nt(){return(nt=Object(v.a)(h.a.mark((function e(t,n,r){var a,o,c,s,u,f;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return a=et(t,n,r),e.next=3,Promise.all([a(l.WearableCategory.EYES),a(l.WearableCategory.EYEBROWS),a(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 rt(e,t,n,r,a,o){return at.apply(this,arguments)}function at(){return(at=Object(v.a)(h.a.mark((function e(t,n,r,a,o,c){var s,u,l,f,p,b,v,w,y,m,g,E;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:s=Object(d.a)(n.container.meshes);try{for(s.s();!(u=s.n()).done;)(l=u.value).name.toLowerCase().endsWith("mask_eyes")&&(f=Object(i.a)(r,2),p=f[0],b=f[1],p&&ot(t,"eyes",l,p,c.eyes,b,"#ffffff")),l.name.toLowerCase().endsWith("mask_eyebrows")&&(v=Object(i.a)(a,2),w=v[0],y=v[1],w&&ot(t,"eyebrows",l,w,c.hair,y,c.hair)),l.name.toLowerCase().endsWith("mask_mouth")&&(m=Object(i.a)(o,2),g=m[0],E=m[1],g&&ot(t,"mouth",l,g,c.skin,E,c.skin))}catch(h){s.e(h)}finally{s.f()}case 2:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function ot(e,t,n,r,a,o,c){var i=new P.StandardMaterial("".concat(t,"_standard_material"),e);i.alphaMode=P.PBRMaterial.PBRMATERIAL_ALPHABLEND,i.backFaceCulling=!0,i.specularColor=P.Color3.Black(),r.hasAlpha=!0,i.sideOrientation=P.Orientation.CW,i.diffuseTexture=r,i.diffuseColor=o?P.Color3.Black():M(c),o&&(i.emissiveTexture=o,i.diffuseColor=M(a)),n.material=i}function ct(e){var t=function(e){var t,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:l.WearableBodyShape.MALE,r={},a=Object(d.a)(e);try{for(a.s();!(t=a.n()).done;){var o=t.value;try{var c,i=F(o,n),s=Object(d.a)(i.contents);try{for(s.s();!(c=s.n()).done;){var u=c.value;r[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(n,'"'));continue}}}catch(f){a.e(f)}finally{a.f()}return r}(e.wearable?[e.wearable].concat(Object(p.a)(e.wearables)):e.wearables,e.bodyShape);P.SceneLoader.OnPluginActivatedObservable.add((function(e){"gltf"===e.name&&(e.preprocessUrlAsync=function(){var e=Object(v.a)(h.a.mark((function e(n){var r;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return"/content/contents/",r=n.split("/content/contents/"),e.abrupt("return",r.length>0&&r[1]?t[r[1]]:n);case 3:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}())}))}var it="#include<pbrBlockFinalColorComposition>",st="#include<customToonShading>";if(!P.Effect.ShadersStore.pbrPixelShader.includes(it))throw new Error("could not patch the pbrPixelShader");function ut(e,t){return lt.apply(this,arguments)}function lt(){return lt=Object(v.a)(h.a.mark((function e(t,n){var r,a,o,c,i,s,u,f,p,b,v,w,y,m=arguments;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(r=m.length>2&&void 0!==m[2]?m[2]:l.WearableBodyShape.MALE,a=m.length>3?m[3]:void 0,o=m.length>4?m[4]:void 0,!H(c=F(n,r))){e.next=6;break}throw new Error('The wearable="'.concat(n.id,'" is a texture'));case 6:return i=V(c),e.next=9,Ve(t,i);case 9:s=e.sent,u=Object(d.a)(s.materials);try{for(u.s();!(f=u.n()).done;)(p=f.value)instanceof P.PBRMaterial&&((b=p).specularIntensity=0,b.metallic&&(b.metallic=0,b.metallicF0Factor=0),b.name.toLowerCase().includes("hair")&&(o?(b.albedoColor=P.Color3.FromHexString(o).toLinearSpace(),b.specularIntensity=0,b.alpha=1):(b.alpha=0,t.removeMaterial(b))),b.name.toLowerCase().includes("skin")&&(a?(b.albedoColor=P.Color3.FromHexString(a).toLinearSpace(),b.specularIntensity=0,b.alpha=1):(b.alpha=0,t.removeMaterial(b))))}catch(h){u.e(h)}finally{u.f()}v=Object(d.a)(s.animationGroups);try{for(v.s();!(w=v.n()).done;)(y=w.value).stop(),y.reset(),y.dispose()}catch(h){v.e(h)}finally{v.f()}return e.abrupt("return",{container:s,wearable:n});case 15:case"end":return e.stop()}}),e)}))),lt.apply(this,arguments)}function ft(){return(ft=Object(v.a)(h.a.mark((function e(t,n){var r,a,o,c,i,s,u,f,p,b,v,w,y,m,g,E,O,x;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Ie(t,n);case 2:if(r=e.sent,ct(n),a=[],n.type!==l.PreviewType.AVATAR){e.next=29;break}o=Pe(n),c=Array.from(o.values()),i=Object(d.a)(c.filter(We));try{for(i.s();!(s=i.n()).done;)u=s.value,f=ut(r,u,n.bodyShape,n.skin,n.hair).catch((function(e){console.warn(e.message)})),a.push(f)}catch(h){i.e(h)}finally{i.f()}return e.next=12,Promise.all(a);case 12:p=e.sent.filter(Se),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()}if(!(w=Ce(p))){e.next=25;break}return y=c.filter(Ae),e.next=20,tt(r,y,n.bodyShape);case 20:m=e.sent,g=m.eyes,E=m.eyebrows,O=m.mouth,rt(r,w,g,E,O,n);case 25:return e.next=27,Qe(r,p,n);case 27:e.next=45;break;case 29:if(n.wearable){e.next=31;break}throw new Error("No wearable to render");case 31:return x=n.wearable,e.prev=32,e.next=35,ut(r,x,n.bodyShape,n.skin,n.hair);case 35:e.sent.container.addAllToScene(),e.next=45;break;case 39:return e.prev=39,e.t0=e.catch(32),e.next=43,ut(r,x,n.bodyShape===l.WearableBodyShape.MALE?l.WearableBodyShape.FEMALE:l.WearableBodyShape.MALE,n.skin,n.hair);case 43:e.sent.container.addAllToScene();case 45:n.centerBoundingBox&&Ue(r);case 46:case"end":return e.stop()}}),e,null,[[32,39]])})))).apply(this,arguments)}P.Effect.ShadersStore.pbrPixelShader.includes(st)||(P.Effect.ShadersStore.pbrPixelShader=P.Effect.ShadersStore.pbrPixelShader.replace(it,it+"\n"+st+"\n")),P.Effect.IncludesShadersStore.customToonShading=n(454).default;n(455);var dt=n(151),pt=function(){var e=Object(r.useState)(""),t=Object(i.a)(e,2),n=t[0],a=t[1],o=function(){var e=Object(r.useState)({width:void 0,height:void 0}),t=Object(i.a)(e,2),n=t[0],a=t[1];return Object(r.useEffect)((function(){function e(){a({width:window.innerWidth,height:window.innerHeight})}return window.addEventListener("resize",e),e(),function(){return window.removeEventListener("resize",e)}}),[]),n}(),c=o.width,s=o.height,f=Object(r.useState)({}),d=Object(i.a)(f,2),p=d[0],b=d[1],h=Object(r.useState)(!1),v=Object(i.a)(h,2),w=v[0],y=v[1],m=Object(r.useState)(!0),g=Object(i.a)(m,2),E=g[0],O=g[1],x=Object(r.useState)(!1),k=Object(i.a)(x,2),j=k[0],S=k[1],W=Object(r.useRef)(null),A=xe(),C=Object(i.a)(A,3),B=C[0],P=C[1],T=C[2],L=Object(r.useState)(""),R=Object(i.a)(L,2),M=R[0],I=R[1],_=Object(r.useState)(!0),D=Object(i.a)(_,2),F=D[0],Y=D[1],N=Object(r.useState)(!1),V=Object(i.a)(N,2),H=V[0],U=V[1],z=n||T,Z=(E||P)&&!z,G=!!M&&!F&&!Z,X=F&&!Z;return Object(r.useEffect)((function(){W.current&&B&&(b({backgroundImage:B.background.gradient?B.background.gradient:void 0,opacity:1}),B.background.image&&I(B.background.image),B.type===l.PreviewType.TEXTURE?(Y(!1),O(!1),S(!0)):function(e,t){return ft.apply(this,arguments)}(W.current,B).catch((function(e){return a(e.message)})).finally((function(){O(!1),S(!0)})))}),[W.current,B]),Object(r.useEffect)((function(){H||(j?(Object(l.sendMessage)(window.parent,l.PreviewMessageType.LOAD,null),U(!0)):z&&(Object(l.sendMessage)(window.parent,l.PreviewMessageType.ERROR,{message:z}),U(!0)))}),[j,z,H]),Object(r.useEffect)((function(){if(P){var e=!1;E||(O(!0),e=!0),H&&(U(!1),e=!0),e&&j&&S(!1)}}),[P,E,H,j]),Object(dt.jsxs)("div",{className:u()("Preview",{"is-dragging":w,"is-loading":Z,"is-loaded":j,"is-3d":F&&(null===B||void 0===B?void 0:B.camera)===l.PreviewCamera.INTERACTIVE,"has-error":!!z}),style:p,children:[Object(dt.jsx)("img",{src:M,className:u()("thumbnail",{"is-visible":G}),alt:"preview"}),Object(dt.jsx)("canvas",{id:"wearable-preview",className:u()({"is-visible":X}),width:c,height:s,ref:W,onMouseDown:function(){return y(F&&!z)},onMouseUp:function(){return y(!1)}}),z&&Object(dt.jsx)("div",{className:"error",children:z})]})},bt=a.a.memo(pt);c.a.render(Object(dt.jsx)(a.a.StrictMode,{children:Object(dt.jsx)(bt,{})}),document.getElementById("root"))}},[[459,1,2]]]);
2
+ //# sourceMappingURL=main.534e8df5.chunk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["lib/babylon/toon/new-pbr.hlsl","lib/sleep.ts","lib/json.ts","lib/api/nft.ts","lib/api/peer.ts","lib/color.ts","lib/representation.ts","lib/wearable.ts","lib/zoom.ts","lib/config.ts","lib/cache.ts","hooks/useAsync.ts","hooks/useOptions.ts","hooks/useOverrides.ts","hooks/useConfig.ts","lib/babylon/utils.ts","lib/babylon/body.ts","lib/babylon/slots.ts","lib/babylon/camera.ts","lib/env.ts","lib/babylon/scene.ts","lib/babylon/emotes.ts","lib/babylon/face.ts","lib/babylon/mappings.ts","lib/babylon/toon/index.ts","lib/babylon/wearable.ts","lib/babylon/render.ts","components/Preview/Preview.tsx","hooks/useWindowSize.ts","index.tsx"],"names":["sleep","ms","a","Promise","resolve","setTimeout","json","url","attempts","fetch","resp","ok","Error","text","nftApiByEnv","PreviewEnv","DEV","PROD","NFTApi","contractAddress","itemId","env","data","length","tokenId","nft","nftApi","peerByEnv","PeerApi","urns","map","urn","join","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","parseZoom","rawZoom","parsedZoom","parseFloat","isNaN","Math","min","max","getZoom","SKIN","DEFAULT_PROFILE","fetchWearable","fetchURNs","results","parseWearable","base64","JSON","parse","atob","fetchProfileWearables","avatar","filter","result","fetchWearables","fetchURLs","urls","promises","then","catch","all","profileMemo","cache","memo","fn","args","reset","createMemo","fetchProfile","avatars","console","log","fetchWearableFromContract","options","network","fetchNFT","Network","ETHEREUM","image","split","fetchAvatar","base64s","defaultWearableUrns","push","defaultWearables","wearablePromise","profilePromise","skin","hair","eyes","zoom","type","PreviewType","WEARABLE","background","gradient","transparentBackground","undefined","AVATAR","TEXTURE","Rarity","getGradient","rarity","light","dark","thumbnail","emote","PreviewEmote","IDLE","Object","values","camera","PreviewCamera","INTERACTIVE","autoRotateSpeed","centerBoundingBox","wheelZoom","wheelPrecision","wheelStart","isNumber","offsetX","offsetY","offsetZ","nonces","isValid","nonce","useOptions","useState","window","location","search","useMemo","params","URLSearchParams","autoRotateSpeedParam","get","offsetXParam","offsetYParam","offsetZParam","wheelZoomParam","wheelPrecisionParam","wheelStartParam","bodyShapeParam","has","getAll","reduce","selected","overrides","setOverrides","isReady","setIsReady","useEffect","handleMessage","event","PreviewMessageType","UPDATE","payload","equal","addEventListener","sendMessage","parent","READY","removeEventListener","useOverrides","useConfig","asyncFunction","deps","isLoading","setIsLoading","setResult","setError","message","finally","useAsync","createConfig","isCategory","isHidden","asset","hides","replaces","isSuccesful","isModel","isFacialFeature","getBodyShape","assets","part","BODY_SHAPE","hasSkin","hideUpperBody","hideLowerBody","hideFeet","hideHead","HEAD","container","meshes","mesh","name","toLowerCase","setEnabled","categoriesHiddenBySkin","HELMET","FACIAL_HAIR","getSlots","config","slots","Map","slot","set","reverse","alreadyRemoved","Set","replaced","hidden","toRemove","Array","from","delete","add","startAutoRotateBehavior","useAutoRotationBehavior","autoRotationBehavior","idleRotationSpeed","isIOs","navigator","platform","engine","showInspector","process","createScene","canvas","dispose","Engine","preserveDrawingBuffer","stencil","antialias","root","Scene","autoClear","clearColor","Color4","ambientColor","preventDefaultOnPointerDown","ArcRotateCamera","Vector3","mode","Camera","PERSPECTIVE_CAMERA","STATIC","position","warn","attachControl","offset","addInPlace","setTarget","lowerRadiusLimit","radius","upperRadiusLimit","DirectionalLight","intensity","SpotLight","PI","HemisphericLight","GlowLayer","runRenderLoop","render","loadMask","scene","file","reject","task","TextureAssetTask","onError","errorObject","onSuccess","texture","run","loadTexture","loadAssetContainer","load","extension","SceneLoader","LoadAssetContainerAsync","center","Mesh","setParent","children","getChildren","child","boundingInfo","getBoundingInfo","boundingBox","minimumWorld","maximumWorld","i","siblingMin","siblingMax","Minimize","Maximize","setBoundingInfo","BoundingInfo","refreshBoundingInfo","size","extendSize","scale","scaling","multiply","subtractInPlace","loopedEmotes","MONEY","CLAP","isLooped","buildEmoteUrl","baseUrl","path","URL","href","loadEmoteFromUrl","animationGroups","loadEmoteFromWearable","playEmote","onAnimationEnd","cameras","loop","emoteDataV0","emoteUrl","emoteAnimationGroup","AnimationGroup","nodes","transformNodes","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","specularColor","Black","hasAlpha","sideOrientation","Orientation","CW","diffuseTexture","diffuseColor","emissiveTexture","material","setupMappings","mappings","createMappings","OnPluginActivatedObservable","plugin","preprocessUrlAsync","parts","needle","injection","Effect","ShadersStore","loadWearable","materials","originalMaterial","specularIntensity","metallic","metallicF0Factor","albedoColor","FromHexString","toLinearSpace","alpha","removeMaterial","animationGroup","stop","promise","addAllToScene","replace","IncludesShadersStore","require","default","Preview","previewError","setPreviewError","width","height","windowSize","setWindowSize","handleResize","innerWidth","innerHeight","useWindowSize","style","setStyle","isDragging","setIsDragging","isLoadingModel","setIsLoadingModel","isLoaded","setIsLoaded","canvasRef","useRef","isLoadingConfig","configError","setImage","is3D","setIs3D","isMessageSent","setIsMessageSent","showImage","showCanvas","current","backgroundImage","opacity","LOAD","ERROR","shouldResetIsLoaded","className","classNames","src","alt","ref","onMouseDown","onMouseUp","React","ReactDOM","StrictMode","document","getElementById"],"mappings":"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","file":"static/js/main.534e8df5.chunk.js","sourcesContent":["export default \"float angleY = 3.14 / 2.0;\\n\\nmat3 rotateY = mat3(\\n cos(angleY), 0, sin(angleY),\\n 0, 1, 0,\\n -sin(angleY), 0, cos(angleY)\\n);\\n\\n// view angle DOT normal of the position\\nvec3 tray = normalize(viewDirectionW * rotateY);\\nvec3 rayDirection = normalize(tray-vPositionW);\\nfloat t=(dot(normalW,rayDirection) + 1.0) / 2.0;\\n\\nfloat ToonThresholds[3];\\nToonThresholds[0] = 0.90;\\nToonThresholds[1] = 0.80;\\nToonThresholds[2] = 0.20;\\n\\nfloat ToonBrightnessLevels[4];\\nToonBrightnessLevels[0] = 1.2;\\nToonBrightnessLevels[1] = 1.0;\\nToonBrightnessLevels[2] = 1.0;\\nToonBrightnessLevels[3] = 0.8;\\n\\nif (t > ToonThresholds[0])\\n{\\n finalColor.rgb *= ToonBrightnessLevels[0];\\n}\\nelse if (t > ToonThresholds[1])\\n{\\n finalColor.rgb *= ToonBrightnessLevels[1];\\n}\\nelse if (t > ToonThresholds[2])\\n{\\n finalColor.rgb *= ToonBrightnessLevels[2];\\n}\\nelse\\n{\\n finalColor.rgb *= ToonBrightnessLevels[3];\\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, PreviewEnv } from '@dcl/schemas'\nimport { json } from '../json'\n\nexport const nftApiByEnv: Record<PreviewEnv, string> = {\n [PreviewEnv.DEV]: 'https://nft-api.decentraland.io',\n [PreviewEnv.PROD]: 'https://nft-api.decentraland.org',\n}\n\nclass NFTApi {\n async fetchItem(contractAddress: string, itemId: string, env: PreviewEnv) {\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: PreviewEnv) {\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 { PreviewEnv, Profile, WearableDefinition } from '@dcl/schemas'\nimport { json } from '../json'\n\nexport const peerByEnv: Record<PreviewEnv, string> = {\n [PreviewEnv.DEV]: 'https://peer.decentraland.zone',\n [PreviewEnv.PROD]: 'https://peer.decentraland.org',\n}\n\nclass PeerApi {\n async fetchWearables(urns: string[], env: PreviewEnv) {\n if (urns.length === 0) {\n return []\n }\n const { wearables } = await json<{ wearables: WearableDefinition[] }>(\n `${peerByEnv[env]}/lambdas/collections/wearables?${urns.map((urn) => `wearableId=${urn}`).join('&')}`\n )\n if (wearables.length === 0) {\n throw new Error(`Wearables not found for urns=\"${urns}\"`)\n }\n return wearables\n }\n async fetchProfile(profile: string, env: PreviewEnv) {\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 { RepresentationDefinition, WearableBodyShape, WearableDefinition } from '@dcl/schemas'\n\nexport function is(representation: RepresentationDefinition, bodyShape: WearableBodyShape) {\n return representation.bodyShapes.includes(bodyShape)\n}\n\nexport function isMale(representation: RepresentationDefinition) {\n return is(representation, WearableBodyShape.MALE)\n}\n\nexport function isFemale(representation: RepresentationDefinition) {\n return is(representation, WearableBodyShape.FEMALE)\n}\n\nexport function getRepresentation(wearable: WearableDefinition, 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: WearableDefinition, 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: WearableDefinition, 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: RepresentationDefinition) {\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: RepresentationDefinition) {\n return representation.mainFile.endsWith('png')\n}\n","import { WearableBodyShape, WearableCategory, WearableDefinition } from '@dcl/schemas'\n\nexport function getWearableByCategory(wearables: WearableDefinition[], 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: WearableDefinition | void): value is WearableDefinition {\n return !!value\n}\n\nexport function getWearableBodyShape(wearabe: WearableDefinition): 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: WearableDefinition) {\n return !!wearable && `emoteDataV0` in wearable\n}\n","import { WearableCategory, WearableDefinition } from '@dcl/schemas'\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?: WearableDefinition | 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","import {\n Avatar,\n Network,\n PreviewCamera,\n PreviewConfig,\n PreviewEmote,\n PreviewEnv,\n PreviewOptions,\n PreviewType,\n Rarity,\n WearableBodyShape,\n WearableDefinition,\n} from '@dcl/schemas'\nimport { nftApi } from './api/nft'\nimport { peerApi } from './api/peer'\nimport { createMemo } from './cache'\nimport { colorToHex, formatHex } from './color'\nimport { getRepresentationOrDefault, hasRepresentation, isTexture } from './representation'\nimport { getDefaultCategories, getDefaultWearableUrn, getWearableBodyShape, getWearableByCategory, isEmote, isWearable } from './wearable'\nimport { getZoom } from './zoom'\n\nconst DEFAULT_PROFILE = 'default'\n\nasync function fetchWearable(urn: string, env: PreviewEnv) {\n const results = await fetchURNs([urn], env)\n if (results.length !== 1) {\n throw new Error(`Could not find wearable for urn=\"${urn}\"`)\n }\n return results[0]\n}\n\nfunction parseWearable(base64: string): WearableDefinition {\n return JSON.parse(atob(base64))\n}\n\nasync function fetchProfileWearables(profile: Avatar | null, env: PreviewEnv) {\n if (!profile) {\n return []\n }\n const results = await fetchURNs(profile.avatar.wearables, env)\n return results.filter((result) => !isEmote(result))\n}\n\nasync function fetchURNs(urns: string[], env: PreviewEnv) {\n if (urns.length === 0) {\n return []\n }\n return peerApi.fetchWearables(urns, env)\n}\n\nasync function fetchURLs(urls: string[]) {\n if (urls.length === 0) {\n return []\n }\n const promises = urls.map((url) =>\n fetch(url)\n .then((resp) => resp.json())\n .catch()\n )\n const results = await Promise.all(promises)\n return results.filter(isWearable)\n}\n\nexport const profileMemo = createMemo<Avatar | null>()\nasync function fetchProfile(profile: string, env: PreviewEnv) {\n return profileMemo.memo(profile, async () => {\n if (profile === DEFAULT_PROFILE) {\n return null\n }\n const resp = await 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 return resp || null\n })\n}\n\nasync function fetchWearableFromContract(options: {\n contractAddress: string\n itemId?: string | null\n tokenId?: string | null\n env: PreviewEnv\n}) {\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 === PreviewEnv.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(\n profile: Avatar | null,\n urns: string[],\n urls: string[],\n base64s: string[],\n bodyShape: WearableBodyShape,\n env: PreviewEnv\n) {\n // gather wearables from profile, urns, urls and base64s\n let wearables = [\n ...(await fetchProfileWearables(profile, env)),\n ...(await fetchURNs([bodyShape, ...urns], env)),\n ...(await fetchURLs(urls)),\n ...base64s.map(parseWearable),\n ]\n // filter out wearables that don't have a representation for the body shape\n wearables = wearables.filter((wearable) => hasRepresentation(wearable, bodyShape))\n // fill default categories\n const defaultWearableUrns: string[] = []\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 defaultWearableUrns.push(urn)\n } else {\n throw new Error(`Could not get default URN for category=\"${category}\"`)\n }\n }\n }\n if (defaultWearableUrns.length > 0) {\n const defaultWearables = await fetchURNs(defaultWearableUrns, env)\n wearables = [...wearables, ...defaultWearables]\n }\n return wearables\n}\n\nexport async function createConfig(options: PreviewOptions = {}): Promise<PreviewConfig> {\n const { contractAddress, tokenId, itemId } = options\n const env = options.env || PreviewEnv.PROD\n\n // load wearable to preview\n let wearablePromise: Promise<WearableDefinition | 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(null)\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 = [...(options.urns || [])]\n\n // urls to load wearables from\n const urls = options.urls || []\n\n // wearables passed as base64\n const base64s = options.base64s || []\n\n let wearables: WearableDefinition[] = []\n let zoom = 1.75\n let type = PreviewType.WEARABLE\n let background: PreviewConfig['background'] = {\n gradient: options.transparentBackground ? undefined : `radial-gradient(#676370, #18141b)`,\n }\n\n // if loading multiple wearables (either from URNs or URLs), or if wearable is emote, render full avatar\n if (urns.length > 0 || urls.length > 0 || base64s.length > 0 || (wearable && isEmote(wearable)) || options.profile) {\n type = PreviewType.AVATAR\n wearables = await fetchAvatar(profile, urns, urls, base64s, 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 !== PreviewType.AVATAR) {\n type = PreviewType.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 = PreviewEmote.IDLE\n if (options.emote && Object.values(PreviewEmote).includes(options.emote)) {\n emote = options.emote\n }\n\n let camera = PreviewCamera.INTERACTIVE\n if (options.camera && Object.values(PreviewCamera).includes(options.camera)) {\n camera = options.camera\n }\n const autoRotateSpeed = typeof options.autoRotateSpeed === 'number' && !isNaN(options.autoRotateSpeed) ? options.autoRotateSpeed : 0.2\n const centerBoundingBox = typeof options.centerBoundingBox === 'boolean' && options.centerBoundingBox !== false\n\n // wheel options\n let wheelZoom = 1\n let wheelPrecision = 100\n let wheelStart = 50\n if (isNumber(options.wheelZoom)) {\n wheelZoom = Math.max(options.wheelZoom!, 1) // min value 1\n }\n if (isNumber(options.wheelPrecision)) {\n wheelPrecision = Math.max(options.wheelPrecision!, 1) // min value 1\n }\n if (isNumber(options.wheelStart)) {\n wheelStart = 100 - Math.min(Math.max(options.wheelStart!, 0), 100) // value between 0 and 100\n }\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 centerBoundingBox,\n offsetX: options.offsetX || 0,\n offsetY: options.offsetY || 0,\n offsetZ: options.offsetZ || 0,\n zoom: options.zoom || zoom,\n wheelZoom,\n wheelPrecision,\n wheelStart,\n }\n}\n\nfunction isNumber(value: number | null | undefined): boolean {\n return typeof value === 'number' && !isNaN(value)\n}\n","interface IMemo<T> {\n memo: (key: string, fn: (...args: any[]) => Promise<T>, ...args: any[]) => Promise<T>\n reset: () => void\n}\n\nexport function createMemo<T>(): IMemo<T> {\n const cache: Record<string, Promise<T>> = {}\n return {\n memo: async (key, fn, ...args) => {\n const exists = key in cache\n if (!exists) {\n cache[key] = fn(...args)\n }\n return cache[key]\n },\n reset: () => {\n for (const key in cache) {\n delete cache[key]\n }\n },\n }\n}\n","import { useEffect, useState } from 'react'\n\n/* \n ids and nonces are used to identity the order on which async functions are called, \n to avoid race conditions and always keep the value of the last function call, \n regardless of the order in which they resolve \n*/\nconst nonces: Record<string, number> = {}\nfunction isValid(id: string, nonce: number) {\n return nonce === nonces[id]\n}\n\nexport function useAsync<T>(id: string, asyncFunction: (...args: any[]) => Promise<T>, deps: React.DependencyList = []) {\n // initialize state\n const [isLoading, setIsLoading] = useState(false)\n const [result, setResult] = useState<T | null>(null)\n const [error, setError] = useState('')\n\n // initialize nonce for this id\n if (typeof nonces[id] === 'undefined') {\n nonces[id] = 0\n }\n\n // run async function\n useEffect(() => {\n const nonce = ++nonces[id]\n setIsLoading(true)\n asyncFunction()\n .then((result) => {\n if (isValid(id, nonce)) {\n setResult(result)\n }\n })\n .catch((error) => {\n if (isValid(id, nonce)) {\n setError(error.message)\n }\n })\n .finally(() => {\n if (isValid(id, nonce)) {\n setIsLoading(false)\n }\n })\n }, deps) // eslint-disable-line\n\n return [result, isLoading, error] as const\n}\n","import { useMemo, useState } from 'react'\nimport { useOverrides } from './useOverrides'\n\nimport { PreviewCamera, PreviewEmote, PreviewEnv, PreviewOptions, WearableBodyShape } from '@dcl/schemas'\nimport { parseZoom } from '../lib/zoom'\n\nexport const useOptions = () => {\n // get options from url params\n const [search] = useState(window.location.search.toString())\n const options = useMemo<PreviewOptions>(() => {\n const params = new URLSearchParams(search)\n const autoRotateSpeedParam = params.get('autoRotateSpeed') as string | null\n const offsetXParam = params.get('offsetX') as string | null\n const offsetYParam = params.get('offsetY') as string | null\n const offsetZParam = params.get('offsetZ') as string | null\n const wheelZoomParam = params.get('wheelZoom') as string | null\n const wheelPrecisionParam = params.get('wheelPrecision') as string | null\n const wheelStartParam = params.get('wheelStart') as string | null\n const bodyShapeParam = params.get('bodyShape')\n const options = {\n contractAddress: params.get('contract')!,\n tokenId: params.get('token'),\n itemId: params.get('item'),\n skin: params.get('skin'),\n hair: params.get('hair'),\n eyes: params.get('eyes'),\n emote: params.get('emote') as PreviewEmote | null,\n camera: params.get('camera') as PreviewCamera | null,\n transparentBackground: params.has('transparentBackground'),\n centerBoundingBox: params.get('centerBoundingBox') !== 'false',\n autoRotateSpeed: autoRotateSpeedParam ? parseFloat(autoRotateSpeedParam) : null,\n offsetX: offsetXParam ? parseFloat(offsetXParam) : null,\n offsetY: offsetYParam ? parseFloat(offsetYParam) : null,\n offsetZ: offsetZParam ? parseFloat(offsetZParam) : null,\n wheelZoom: wheelZoomParam ? parseFloat(wheelZoomParam) : null,\n wheelPrecision: wheelPrecisionParam ? parseFloat(wheelPrecisionParam) : null,\n wheelStart: wheelStartParam ? parseFloat(wheelStartParam) : null,\n zoom: parseZoom(params.get('zoom')),\n bodyShape:\n bodyShapeParam === 'female' || bodyShapeParam === WearableBodyShape.FEMALE\n ? WearableBodyShape.FEMALE\n : bodyShapeParam === 'male' || bodyShapeParam === WearableBodyShape.MALE\n ? WearableBodyShape.MALE\n : null,\n urns: params.getAll('urn'),\n urls: params.getAll('url'),\n base64s: params.getAll('base64'),\n profile: params.get('profile'),\n env: Object.values(PreviewEnv)\n .filter((value): value is PreviewEnv => typeof value === 'string')\n .reduce((selected, value) => (value === params.get('env') ? value : selected), PreviewEnv.PROD),\n }\n return options\n }, [search])\n\n // apply overrides\n const overrides = useOverrides()\n const optionsWithOverrides = useMemo(\n () => ({\n ...options,\n ...overrides,\n }),\n [options, overrides]\n )\n\n // return options with overrides applied (if any)\n return optionsWithOverrides\n}\n","import { useState, useEffect } from 'react'\nimport equal from 'deep-equal'\nimport { PreviewMessagePayload, PreviewMessageType, PreviewOptions, sendMessage } from '@dcl/schemas'\n\nexport const useOverrides = () => {\n const [overrides, setOverrides] = useState<PreviewOptions>({})\n const [isReady, setIsReady] = useState(false)\n\n // receive message from parent window to update options\n useEffect(() => {\n function handleMessage(event: MessageEvent) {\n if (\n event.data &&\n event.data.type === PreviewMessageType.UPDATE &&\n typeof event.data.payload === 'object' &&\n typeof event.data.payload.options === 'object'\n ) {\n const { options } = event.data.payload as PreviewMessagePayload<PreviewMessageType.UPDATE>\n if (!equal(overrides, options)) {\n setOverrides(options)\n }\n }\n }\n window.addEventListener('message', handleMessage)\n if (!isReady) {\n sendMessage(window.parent, PreviewMessageType.READY, {})\n setIsReady(true)\n }\n return () => {\n window.removeEventListener('message', handleMessage)\n }\n }, [overrides, isReady])\n\n return overrides\n}\n","import { createConfig } from '../lib/config'\nimport { useAsync } from './useAsync'\nimport { useOptions } from './useOptions'\n\nexport function useConfig() {\n const options = useOptions()\n const [config, isLoading, error] = useAsync('useConfig', () => createConfig(options), [options])\n return [config, isLoading, error] as const\n}\n","import { WearableCategory, WearableDefinition } from '@dcl/schemas'\nimport { getRepresentationOrDefault, isTexture } from '../representation'\nimport { Asset } from './scene'\n\nexport function isCategory(category: WearableCategory) {\n return (wearable: WearableDefinition) => 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: WearableDefinition): boolean {\n const representation = getRepresentationOrDefault(wearable)\n return !isTexture(representation)\n}\n\nexport function isFacialFeature(wearable: WearableDefinition): 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 === WearableCategory.BODY_SHAPE)\n if (!bodyShape) {\n return null\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(WearableCategory.HEAD))\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 { PreviewConfig, WearableCategory, WearableDefinition } from '@dcl/schemas'\nimport { hasRepresentation } from '../representation'\nimport { isEmote } from '../wearable'\n\nconst categoriesHiddenBySkin = [\n WearableCategory.HELMET,\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(config: PreviewConfig) {\n const slots = new Map<WearableCategory, WearableDefinition>()\n\n let wearables: WearableDefinition[] = config.wearables.filter((wearable) => !isEmote(wearable)) // remove emotes if any\n\n // remove other wearables that hide the equipped wearable\n if (config.wearable && !isEmote(config.wearable)) {\n wearables = config.wearables.filter((wearable) => {\n if (config.wearable) {\n const { category, hides, replaces } = config.wearable.data\n if (wearable.data.category === 'skin') {\n if (categoriesHiddenBySkin.includes(category)) {\n return false\n }\n if (hides && hides.includes(WearableCategory.HEAD)) {\n return false\n }\n if (replaces && replaces.includes(WearableCategory.HEAD)) {\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(config.wearable)\n }\n\n // arrange wearbles in slots\n for (const wearable of wearables) {\n const slot = wearable.data.category\n if (hasRepresentation(wearable, config.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 { PreviewConfig } from '@dcl/schemas'\n\nexport function startAutoRotateBehavior(camera: ArcRotateCamera, config: PreviewConfig) {\n if (camera) {\n camera.useAutoRotationBehavior = true\n if (camera.autoRotationBehavior) {\n camera.autoRotationBehavior.idleRotationSpeed = config.autoRotateSpeed\n }\n }\n}\n","export const isDev = process.env.NODE_ENV !== 'production'\n\nexport function isIOs() {\n return ['iPad Simulator', 'iPhone Simulator', 'iPod Simulator', 'iPad', 'iPhone', 'iPod'].includes(navigator.platform)\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 Scene,\n SceneLoader,\n SpotLight,\n Texture,\n TextureAssetTask,\n Vector3,\n} from '@babylonjs/core'\nimport '@babylonjs/loaders'\nimport { PreviewCamera, PreviewConfig, PreviewType, WearableBodyShape, WearableDefinition } from '@dcl/schemas'\nimport { isDev, isIOs } from '../env'\nimport { getRepresentation } from '../representation'\nimport { startAutoRotateBehavior } from './camera'\n\n// needed for debugging\nconst showInspector = isDev && process.env.REACT_APP_DEBUG\nif (showInspector) {\n require('@babylonjs/inspector')\n}\n\nexport type Asset = {\n container: AssetContainer\n wearable: WearableDefinition\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 */\nlet engine: Engine\nexport async function createScene(canvas: HTMLCanvasElement, config: PreviewConfig) {\n // Create engine\n if (engine) {\n engine.dispose()\n }\n engine = new Engine(canvas, true, {\n preserveDrawingBuffer: true,\n stencil: true,\n antialias: 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.ambientColor = new Color3(1, 1, 1)\n root.preventDefaultOnPointerDown = false\n\n // Setup Camera\n const camera = new ArcRotateCamera('camera', 0, 0, 0, new Vector3(0, 0, 0), root)\n camera.mode = Camera.PERSPECTIVE_CAMERA\n switch (config.camera) {\n case PreviewCamera.INTERACTIVE: {\n switch (config.type) {\n case PreviewType.WEARABLE: {\n startAutoRotateBehavior(camera, config)\n camera.position = new Vector3(-2, 2, 2)\n break\n }\n case PreviewType.AVATAR: {\n camera.position = new Vector3(0, 1, 3.5)\n break\n }\n default: {\n console.warn(`Unexpected preview.type=\"${config.type}\"`)\n // do nothing\n }\n }\n camera.attachControl(canvas, true)\n break\n }\n case PreviewCamera.STATIC: {\n camera.position = new Vector3(0, 1, 3.5)\n break\n }\n }\n const offset = new Vector3(config.offsetX, config.offsetY, config.offsetZ)\n camera.position.addInPlace(offset)\n camera.setTarget(offset)\n\n // compute camera radius\n camera.lowerRadiusLimit = camera.radius / config.zoom\n camera.upperRadiusLimit = camera.lowerRadiusLimit * config.wheelZoom\n camera.radius = camera.lowerRadiusLimit + ((camera.upperRadiusLimit - camera.lowerRadiusLimit) * config.wheelStart) / 100\n camera.wheelPrecision = config.wheelPrecision\n\n // Setup lights\n if (config.type === PreviewType.WEARABLE) {\n const directional = new DirectionalLight('directional', new Vector3(0, 0, 1), root)\n directional.intensity = 1\n const 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 const top = new HemisphericLight('top', new Vector3(0, -1, 0), root)\n top.intensity = 1.0\n const bottom = new HemisphericLight('bottom', new Vector3(0, 1, 0), root)\n bottom.intensity = 1.0\n\n // Setup effects\n // Avoid ios since the glow effect breaks on safari: https://github.com/decentraland/wearable-preview/issues/11\n if (!isIOs()) {\n const glowLayer = new GlowLayer('glow', root)\n glowLayer.intensity = 2.5\n }\n\n // Render loop\n engine.runRenderLoop(() => {\n root.render()\n })\n\n // Dev tools\n if (showInspector) {\n root.debugLayer.show({ showExplorer: true, embedMode: true })\n }\n\n return root\n}\n\nexport async function loadMask(scene: Scene, wearable: WearableDefinition, 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: WearableDefinition, 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 * 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 const 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 { PreviewCamera, PreviewConfig, PreviewEmote, WearableDefinition } from '@dcl/schemas'\nimport { getRepresentation } from '../representation'\nimport { isEmote } from '../wearable'\nimport { startAutoRotateBehavior } from './camera'\nimport { Asset, loadAssetContainer } from './scene'\n\nconst loopedEmotes = [PreviewEmote.IDLE, PreviewEmote.MONEY, PreviewEmote.CLAP]\n\nfunction isLooped(emote: PreviewEmote) {\n return loopedEmotes.includes(emote)\n}\n\nexport function buildEmoteUrl(emote: PreviewEmote) {\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 const 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 return container\n}\n\nexport async function loadEmoteFromWearable(scene: Scene, wearable: WearableDefinition, config: PreviewConfig) {\n const representation = getRepresentation(wearable, config.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=${config.bodyShape}`)\n }\n return loadEmoteFromUrl(scene, content.url)\n}\n\nexport async function playEmote(scene: Scene, assets: Asset[], config: PreviewConfig) {\n // load asset container for emote\n let container: AssetContainer | undefined\n let loop = isLooped(config.emote)\n // if target wearable is emote, play that one\n if (config.wearable && isEmote(config.wearable)) {\n try {\n container = await loadEmoteFromWearable(scene, config.wearable, config)\n loop = !!config.wearable.emoteDataV0?.loop\n } catch (error) {\n console.warn(`Could not load emote=${config.wearable.id}`)\n }\n } else if (config.wearables.some(isEmote)) {\n // if there's some emote in the wearables list, play the last one\n const emote = config.wearables.reverse().find(isEmote)!\n container = await loadEmoteFromWearable(scene, emote, config)\n loop = !!emote.emoteDataV0?.loop\n }\n if (!container) {\n const emoteUrl = buildEmoteUrl(config.emote)\n container = await loadEmoteFromUrl(scene, emoteUrl)\n }\n\n // start camera rotation after animation ends\n async function onAnimationEnd() {\n if (config.camera !== PreviewCamera.STATIC) {\n const camera = scene.cameras[0] as ArcRotateCamera\n startAutoRotateBehavior(camera, config)\n }\n if (loop) {\n // keep playing idle animation on loop\n playEmote(scene, assets, config)\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 if (container.animationGroups.length > 0) {\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 } else {\n throw new Error(`No animationGroups found`)\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=${config.emote}`, error)\n }\n}\n","import { AbstractMesh, Color3, Orientation, PBRMaterial, Scene, StandardMaterial, Texture } from '@babylonjs/core'\nimport { PreviewConfig, WearableBodyShape, WearableCategory, WearableDefinition } from '@dcl/schemas'\nimport { hexToColor } from '../color'\nimport { Asset, loadMask, loadTexture } from './scene'\nimport { isCategory } from './utils'\n\nfunction getCategoryLoader(scene: Scene, features: WearableDefinition[], 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: WearableDefinition[], 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 config: PreviewConfig\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, config.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, config.hair, mask, config.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, config.skin, mask, config.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 newMaterial.specularColor = Color3.Black()\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.diffuseColor = hexToColor(color)\n }\n mesh.material = newMaterial\n}\n","import { SceneLoader } from '@babylonjs/core'\nimport { GLTFFileLoader } from '@babylonjs/loaders'\nimport { PreviewConfig, WearableBodyShape, WearableDefinition } from '@dcl/schemas'\nimport { getRepresentation } from '../representation'\n\nexport function createMappings(wearables: WearableDefinition[], 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(config: PreviewConfig) {\n const wearables = config.wearable ? [config.wearable, ...config.wearables] : config.wearables\n const mappings = createMappings(wearables, config.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 { Effect } from '@babylonjs/core'\n\nconst needle = `#include<pbrBlockFinalColorComposition>`\nconst injection = `#include<customToonShading>`\n\nif (Effect.ShadersStore['pbrPixelShader'].includes(needle)) {\n if (!Effect.ShadersStore['pbrPixelShader'].includes(injection)) {\n Effect.ShadersStore['pbrPixelShader'] = Effect.ShadersStore['pbrPixelShader'].replace(needle, needle + '\\n' + injection + '\\n')\n }\n} else {\n throw new Error('could not patch the pbrPixelShader')\n}\n\n// Monkey-patch the shaders with the corrected version for Decentraland\n// eslint-disable-next-line\nEffect.IncludesShadersStore['customToonShading'] = require('!!raw-loader!./new-pbr.hlsl').default\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\nimport { Color3, PBRMaterial, Scene } from '@babylonjs/core'\nimport { WearableDefinition, WearableBodyShape } from '@dcl/schemas'\nimport { getRepresentation, isTexture, getContentUrl } from '../representation'\nimport { loadAssetContainer } from './scene'\nimport './toon'\n\nexport async function loadWearable(\n scene: Scene,\n wearable: WearableDefinition,\n bodyShape = WearableBodyShape.MALE,\n skin?: string,\n hair?: string\n) {\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 (const originalMaterial of container.materials) {\n if (originalMaterial instanceof PBRMaterial) {\n const newMaterial = originalMaterial as PBRMaterial\n\n // remove metallic effect\n newMaterial.specularIntensity = 0\n if (newMaterial.metallic) {\n newMaterial.metallic = 0\n newMaterial.metallicF0Factor = 0\n }\n\n if (newMaterial.name.toLowerCase().includes('hair')) {\n if (hair) {\n newMaterial.albedoColor = Color3.FromHexString(hair).toLinearSpace()\n newMaterial.specularIntensity = 0\n newMaterial.alpha = 1\n } else {\n newMaterial.alpha = 0\n scene.removeMaterial(newMaterial)\n }\n }\n if (newMaterial.name.toLowerCase().includes('skin')) {\n if (skin) {\n newMaterial.albedoColor = Color3.FromHexString(skin).toLinearSpace()\n newMaterial.specularIntensity = 0\n newMaterial.alpha = 1\n } else {\n newMaterial.alpha = 0\n scene.removeMaterial(newMaterial)\n }\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","import { PreviewConfig, PreviewType, WearableBodyShape } from '@dcl/schemas'\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 } from './scene'\nimport { isFacialFeature, isModel, isSuccesful } from './utils'\nimport { loadWearable } from './wearable'\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, config: PreviewConfig) {\n // create the root scene\n const root = await createScene(canvas, config)\n\n // setup the mappings for all the contents\n setupMappings(config)\n\n // load all the wearables into the root scene\n const promises: Promise<void | Asset>[] = []\n\n if (config.type === PreviewType.AVATAR) {\n // get slots\n const slots = getSlots(config)\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, config.bodyShape, config.skin, config.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 if (bodyShape) {\n // apply facial features\n const features = wearables.filter(isFacialFeature)\n const { eyes, eyebrows, mouth } = await getFacialFeatures(root, features, config.bodyShape)\n applyFacialFeatures(root, bodyShape, eyes, eyebrows, mouth, config)\n }\n\n // play emote\n await playEmote(root, assets, config)\n } else {\n if (!config.wearable) {\n throw new Error('No wearable to render')\n }\n const wearable = config.wearable\n try {\n // try loading with the required body shape\n const asset = await loadWearable(root, wearable, config.bodyShape, config.skin, config.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 config.bodyShape === WearableBodyShape.MALE ? WearableBodyShape.FEMALE : WearableBodyShape.MALE,\n config.skin,\n config.hair\n )\n asset.container.addAllToScene()\n }\n }\n\n // center the root scene into the camera\n if (config.centerBoundingBox) {\n center(root)\n }\n}\n","import React, { useEffect, useRef, useState } from 'react'\nimport classNames from 'classnames'\nimport { PreviewCamera, PreviewType, PreviewMessageType, sendMessage } from '@dcl/schemas'\nimport { useWindowSize } from '../../hooks/useWindowSize'\nimport { useConfig } from '../../hooks/useConfig'\nimport { render } from '../../lib/babylon/render'\nimport './Preview.css'\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 [config, isLoadingConfig, configError] = useConfig()\n const [image, setImage] = useState('')\n const [is3D, setIs3D] = useState(true)\n const [isMessageSent, setIsMessageSent] = useState(false)\n\n const error = previewError || configError\n const isLoading = (isLoadingModel || isLoadingConfig) && !error\n const showImage = !!image && !is3D && !isLoading\n const showCanvas = is3D && !isLoading\n\n useEffect(() => {\n if (canvasRef.current && config) {\n // rarity background\n setStyle({ backgroundImage: config.background.gradient ? config.background.gradient : undefined, opacity: 1 })\n\n // set background image\n if (config.background.image) {\n setImage(config.background.image)\n }\n\n // load model or image (for texture only wearables)\n if (config.type === PreviewType.TEXTURE) {\n setIs3D(false)\n setIsLoadingModel(false)\n setIsLoaded(true)\n } else {\n // preview models\n render(canvasRef.current, config)\n .catch((error) => setPreviewError(error.message))\n .finally(() => {\n setIsLoadingModel(false)\n setIsLoaded(true)\n })\n }\n }\n }, [canvasRef.current, config]) // 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(window.parent, PreviewMessageType.LOAD, null)\n setIsMessageSent(true)\n } else if (error) {\n sendMessage(window.parent, PreviewMessageType.ERROR, { message: error })\n setIsMessageSent(true)\n }\n }\n }, [isLoaded, error, isMessageSent])\n\n // when the config is being loaded again (because the was an update to some of the options) reset all the other loading flags\n useEffect(() => {\n if (isLoadingConfig) {\n let shouldResetIsLoaded = false\n if (!isLoadingModel) {\n setIsLoadingModel(true)\n shouldResetIsLoaded = true\n }\n if (isMessageSent) {\n setIsMessageSent(false)\n shouldResetIsLoaded = true\n }\n if (shouldResetIsLoaded && isLoaded) {\n setIsLoaded(false)\n }\n }\n }, [isLoadingConfig, isLoadingModel, isMessageSent, isLoaded])\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 && config?.camera === PreviewCamera.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 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":""}
@@ -0,0 +1,2 @@
1
+ !function(e){function r(r){for(var n,a,u=r[0],c=r[1],i=r[2],f=0,s=[];f<u.length;f++)a=u[f],Object.prototype.hasOwnProperty.call(o,a)&&o[a]&&s.push(o[a][0]),o[a]=0;for(n in c)Object.prototype.hasOwnProperty.call(c,n)&&(e[n]=c[n]);for(p&&p(r);s.length;)s.shift()();return l.push.apply(l,i||[]),t()}function t(){for(var e,r=0;r<l.length;r++){for(var t=l[r],n=!0,u=1;u<t.length;u++){var c=t[u];0!==o[c]&&(n=!1)}n&&(l.splice(r--,1),e=a(a.s=t[0]))}return e}var n={},o={1:0},l=[];function a(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,a),t.l=!0,t.exports}a.m=e,a.c=n,a.d=function(e,r,t){a.o(e,r)||Object.defineProperty(e,r,{enumerable:!0,get:t})},a.r=function(e){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},a.t=function(e,r){if(1&r&&(e=a(e)),8&r)return e;if(4&r&&"object"===typeof e&&e&&e.__esModule)return e;var t=Object.create(null);if(a.r(t),Object.defineProperty(t,"default",{enumerable:!0,value:e}),2&r&&"string"!=typeof e)for(var n in e)a.d(t,n,function(r){return e[r]}.bind(null,n));return t},a.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return a.d(r,"a",r),r},a.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},a.p="https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2456669507.commit-cda58cb/";var u=this["webpackJsonp@dcl/wearable-preview"]=this["webpackJsonp@dcl/wearable-preview"]||[],c=u.push.bind(u);u.push=r,u=u.slice();for(var i=0;i<u.length;i++)r(u[i]);var p=c;t()}([]);
2
+ //# sourceMappingURL=runtime-main.b3be03d0.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":"aACE,SAASA,EAAqBC,GAQ7B,IAPA,IAMIC,EAAUC,EANVC,EAAWH,EAAK,GAChBI,EAAcJ,EAAK,GACnBK,EAAiBL,EAAK,GAIHM,EAAI,EAAGC,EAAW,GACpCD,EAAIH,EAASK,OAAQF,IACzBJ,EAAUC,EAASG,GAChBG,OAAOC,UAAUC,eAAeC,KAAKC,EAAiBX,IAAYW,EAAgBX,IACpFK,EAASO,KAAKD,EAAgBX,GAAS,IAExCW,EAAgBX,GAAW,EAE5B,IAAID,KAAYG,EACZK,OAAOC,UAAUC,eAAeC,KAAKR,EAAaH,KACpDc,EAAQd,GAAYG,EAAYH,IAKlC,IAFGe,GAAqBA,EAAoBhB,GAEtCO,EAASC,QACdD,EAASU,OAATV,GAOD,OAHAW,EAAgBJ,KAAKK,MAAMD,EAAiBb,GAAkB,IAGvDe,IAER,SAASA,IAER,IADA,IAAIC,EACIf,EAAI,EAAGA,EAAIY,EAAgBV,OAAQF,IAAK,CAG/C,IAFA,IAAIgB,EAAiBJ,EAAgBZ,GACjCiB,GAAY,EACRC,EAAI,EAAGA,EAAIF,EAAed,OAAQgB,IAAK,CAC9C,IAAIC,EAAQH,EAAeE,GACG,IAA3BX,EAAgBY,KAAcF,GAAY,GAE3CA,IACFL,EAAgBQ,OAAOpB,IAAK,GAC5Be,EAASM,EAAoBA,EAAoBC,EAAIN,EAAe,KAItE,OAAOD,EAIR,IAAIQ,EAAmB,GAKnBhB,EAAkB,CACrB,EAAG,GAGAK,EAAkB,GAGtB,SAASS,EAAoB1B,GAG5B,GAAG4B,EAAiB5B,GACnB,OAAO4B,EAAiB5B,GAAU6B,QAGnC,IAAIC,EAASF,EAAiB5B,GAAY,CACzCK,EAAGL,EACH+B,GAAG,EACHF,QAAS,IAUV,OANAf,EAAQd,GAAUW,KAAKmB,EAAOD,QAASC,EAAQA,EAAOD,QAASH,GAG/DI,EAAOC,GAAI,EAGJD,EAAOD,QAKfH,EAAoBM,EAAIlB,EAGxBY,EAAoBO,EAAIL,EAGxBF,EAAoBQ,EAAI,SAASL,EAASM,EAAMC,GAC3CV,EAAoBW,EAAER,EAASM,IAClC3B,OAAO8B,eAAeT,EAASM,EAAM,CAAEI,YAAY,EAAMC,IAAKJ,KAKhEV,EAAoBe,EAAI,SAASZ,GACX,qBAAXa,QAA0BA,OAAOC,aAC1CnC,OAAO8B,eAAeT,EAASa,OAAOC,YAAa,CAAEC,MAAO,WAE7DpC,OAAO8B,eAAeT,EAAS,aAAc,CAAEe,OAAO,KAQvDlB,EAAoBmB,EAAI,SAASD,EAAOE,GAEvC,GADU,EAAPA,IAAUF,EAAQlB,EAAoBkB,IAC/B,EAAPE,EAAU,OAAOF,EACpB,GAAW,EAAPE,GAA8B,kBAAVF,GAAsBA,GAASA,EAAMG,WAAY,OAAOH,EAChF,IAAII,EAAKxC,OAAOyC,OAAO,MAGvB,GAFAvB,EAAoBe,EAAEO,GACtBxC,OAAO8B,eAAeU,EAAI,UAAW,CAAET,YAAY,EAAMK,MAAOA,IACtD,EAAPE,GAA4B,iBAATF,EAAmB,IAAI,IAAIM,KAAON,EAAOlB,EAAoBQ,EAAEc,EAAIE,EAAK,SAASA,GAAO,OAAON,EAAMM,IAAQC,KAAK,KAAMD,IAC9I,OAAOF,GAIRtB,EAAoB0B,EAAI,SAAStB,GAChC,IAAIM,EAASN,GAAUA,EAAOiB,WAC7B,WAAwB,OAAOjB,EAAgB,SAC/C,WAA8B,OAAOA,GAEtC,OADAJ,EAAoBQ,EAAEE,EAAQ,IAAKA,GAC5BA,GAIRV,EAAoBW,EAAI,SAASgB,EAAQC,GAAY,OAAO9C,OAAOC,UAAUC,eAAeC,KAAK0C,EAAQC,IAGzG5B,EAAoB6B,EAAI,sFAExB,IAAIC,EAAaC,KAAK,qCAAuCA,KAAK,sCAAwC,GACtGC,EAAmBF,EAAW3C,KAAKsC,KAAKK,GAC5CA,EAAW3C,KAAOf,EAClB0D,EAAaA,EAAWG,QACxB,IAAI,IAAItD,EAAI,EAAGA,EAAImD,EAAWjD,OAAQF,IAAKP,EAAqB0D,EAAWnD,IAC3E,IAAIU,EAAsB2C,EAI1BvC,I","file":"static/js/runtime-main.f5ee404b.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-2449988983.commit-0534c22/\";\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.b3be03d0.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-2456669507.commit-cda58cb/\";\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":["lib/babylon/toon/new-pbr.hlsl","lib/sleep.ts","lib/json.ts","lib/api/nft.ts","lib/api/peer.ts","lib/color.ts","lib/representation.ts","lib/wearable.ts","lib/zoom.ts","lib/config.ts","lib/cache.ts","hooks/useAsync.ts","hooks/useOptions.ts","hooks/useOverrides.ts","hooks/useConfig.ts","lib/babylon/utils.ts","lib/babylon/body.ts","lib/babylon/slots.ts","lib/babylon/camera.ts","lib/env.ts","lib/babylon/scene.ts","lib/babylon/emotes.ts","lib/babylon/face.ts","lib/babylon/mappings.ts","lib/babylon/toon/index.ts","lib/babylon/wearable.ts","lib/babylon/render.ts","components/Preview/Preview.tsx","hooks/useWindowSize.ts","index.tsx"],"names":["sleep","ms","a","Promise","resolve","setTimeout","json","url","attempts","fetch","resp","ok","Error","text","nftApiByEnv","PreviewEnv","DEV","PROD","NFTApi","contractAddress","itemId","env","data","length","tokenId","nft","nftApi","peerByEnv","PeerApi","urns","map","urn","join","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","parseZoom","rawZoom","parsedZoom","parseFloat","isNaN","Math","min","max","getZoom","SKIN","DEFAULT_PROFILE","fetchWearable","fetchURNs","results","parseWearable","base64","JSON","parse","atob","fetchProfileWearables","avatar","filter","result","fetchWearables","fetchURLs","urls","promises","then","catch","all","profileMemo","cache","memo","fn","args","reset","createMemo","fetchProfile","avatars","console","log","fetchWearableFromContract","options","network","fetchNFT","Network","ETHEREUM","image","split","fetchAvatar","base64s","defaultWearableUrns","push","defaultWearables","wearablePromise","profilePromise","skin","hair","eyes","zoom","type","PreviewType","WEARABLE","background","gradient","transparentBackground","undefined","AVATAR","TEXTURE","Rarity","getGradient","rarity","light","dark","thumbnail","emote","PreviewEmote","IDLE","Object","values","camera","PreviewCamera","INTERACTIVE","autoRotateSpeed","centerBoundingBox","wheelZoom","wheelPrecision","wheelStart","isNumber","offsetX","offsetY","offsetZ","nonces","isValid","nonce","useOptions","useState","window","location","search","useMemo","params","URLSearchParams","autoRotateSpeedParam","get","offsetXParam","offsetYParam","offsetZParam","wheelZoomParam","wheelPrecisionParam","wheelStartParam","bodyShapeParam","has","getAll","reduce","selected","overrides","setOverrides","isReady","setIsReady","useEffect","handleMessage","event","PreviewMessageType","UPDATE","payload","equal","addEventListener","sendMessage","parent","READY","removeEventListener","useOverrides","useConfig","asyncFunction","deps","isLoading","setIsLoading","setResult","setError","message","finally","useAsync","createConfig","isCategory","isHidden","asset","hides","replaces","isSuccesful","isModel","isFacialFeature","getBodyShape","assets","part","BODY_SHAPE","hasSkin","hideUpperBody","hideLowerBody","hideFeet","hideHead","HEAD","container","meshes","mesh","name","toLowerCase","setEnabled","categoriesHiddenBySkin","HELMET","FACIAL_HAIR","getSlots","config","slots","Map","slot","set","reverse","alreadyRemoved","Set","replaced","hidden","toRemove","Array","from","delete","add","startAutoRotateBehavior","useAutoRotationBehavior","autoRotationBehavior","idleRotationSpeed","isIOs","navigator","platform","engine","showInspector","process","createScene","canvas","dispose","Engine","preserveDrawingBuffer","stencil","antialias","root","Scene","autoClear","clearColor","Color4","ambientColor","preventDefaultOnPointerDown","ArcRotateCamera","Vector3","mode","Camera","PERSPECTIVE_CAMERA","STATIC","position","warn","attachControl","offset","addInPlace","setTarget","lowerRadiusLimit","radius","upperRadiusLimit","DirectionalLight","intensity","SpotLight","PI","HemisphericLight","GlowLayer","runRenderLoop","render","loadMask","scene","file","reject","task","TextureAssetTask","onError","errorObject","onSuccess","texture","run","loadTexture","loadAssetContainer","load","extension","SceneLoader","LoadAssetContainerAsync","center","Mesh","setParent","children","getChildren","child","boundingInfo","getBoundingInfo","boundingBox","minimumWorld","maximumWorld","i","siblingMin","siblingMax","Minimize","Maximize","setBoundingInfo","BoundingInfo","refreshBoundingInfo","size","extendSize","scale","scaling","multiply","subtractInPlace","loopedEmotes","MONEY","CLAP","isLooped","buildEmoteUrl","baseUrl","path","URL","href","loadEmoteFromUrl","animationGroups","loadEmoteFromWearable","playEmote","onAnimationEnd","cameras","loop","emoteDataV0","emoteUrl","emoteAnimationGroup","AnimationGroup","nodes","transformNodes","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","specularColor","Black","hasAlpha","sideOrientation","Orientation","CW","diffuseTexture","diffuseColor","emissiveTexture","emissiveColor","toLinearSpace","material","setupMappings","mappings","createMappings","OnPluginActivatedObservable","plugin","preprocessUrlAsync","parts","needle","injection","Effect","ShadersStore","loadWearable","materials","originalMaterial","metallic","metallicF0Factor","albedoColor","FromHexString","specularIntensity","alpha","removeMaterial","animationGroup","stop","promise","addAllToScene","replace","IncludesShadersStore","require","default","Preview","previewError","setPreviewError","width","height","windowSize","setWindowSize","handleResize","innerWidth","innerHeight","useWindowSize","style","setStyle","isDragging","setIsDragging","isLoadingModel","setIsLoadingModel","isLoaded","setIsLoaded","canvasRef","useRef","isLoadingConfig","configError","setImage","is3D","setIs3D","isMessageSent","setIsMessageSent","showImage","showCanvas","current","backgroundImage","opacity","LOAD","ERROR","shouldResetIsLoaded","className","classNames","src","alt","ref","onMouseDown","onMouseUp","React","ReactDOM","StrictMode","document","getElementById"],"mappings":"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","file":"static/js/main.db7754ff.chunk.js","sourcesContent":["export default \"float angleY = 3.14 / 2.0;\\n\\nmat3 rotateY = mat3(\\n cos(angleY), 0, sin(angleY),\\n 0, 1, 0,\\n -sin(angleY), 0, cos(angleY)\\n);\\n\\n// view angle DOT normal of the position\\nvec3 tray = normalize(viewDirectionW * rotateY);\\nvec3 rayDirection = normalize(tray-vPositionW);\\nfloat t=(dot(normalW,rayDirection) + 1.0) / 2.0;\\n\\nfloat ToonThresholds[3];\\nToonThresholds[0] = 0.90;\\nToonThresholds[1] = 0.80;\\nToonThresholds[2] = 0.20;\\n\\nfloat ToonBrightnessLevels[4];\\nToonBrightnessLevels[0] = 1.2;\\nToonBrightnessLevels[1] = 1.0;\\nToonBrightnessLevels[2] = 1.0;\\nToonBrightnessLevels[3] = 0.8;\\n\\nif (t > ToonThresholds[0])\\n{\\n finalColor.rgb *= ToonBrightnessLevels[0];\\n}\\nelse if (t > ToonThresholds[1])\\n{\\n finalColor.rgb *= ToonBrightnessLevels[1];\\n}\\nelse if (t > ToonThresholds[2])\\n{\\n finalColor.rgb *= ToonBrightnessLevels[2];\\n}\\nelse\\n{\\n finalColor.rgb *= ToonBrightnessLevels[3];\\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, PreviewEnv } from '@dcl/schemas'\nimport { json } from '../json'\n\nexport const nftApiByEnv: Record<PreviewEnv, string> = {\n [PreviewEnv.DEV]: 'https://nft-api.decentraland.io',\n [PreviewEnv.PROD]: 'https://nft-api.decentraland.org',\n}\n\nclass NFTApi {\n async fetchItem(contractAddress: string, itemId: string, env: PreviewEnv) {\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: PreviewEnv) {\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 { PreviewEnv, Profile, WearableDefinition } from '@dcl/schemas'\nimport { json } from '../json'\n\nexport const peerByEnv: Record<PreviewEnv, string> = {\n [PreviewEnv.DEV]: 'https://peer.decentraland.zone',\n [PreviewEnv.PROD]: 'https://peer.decentraland.org',\n}\n\nclass PeerApi {\n async fetchWearables(urns: string[], env: PreviewEnv) {\n if (urns.length === 0) {\n return []\n }\n const { wearables } = await json<{ wearables: WearableDefinition[] }>(\n `${peerByEnv[env]}/lambdas/collections/wearables?${urns.map((urn) => `wearableId=${urn}`).join('&')}`\n )\n if (wearables.length === 0) {\n throw new Error(`Wearables not found for urns=\"${urns}\"`)\n }\n return wearables\n }\n async fetchProfile(profile: string, env: PreviewEnv) {\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 { RepresentationDefinition, WearableBodyShape, WearableDefinition } from '@dcl/schemas'\n\nexport function is(representation: RepresentationDefinition, bodyShape: WearableBodyShape) {\n return representation.bodyShapes.includes(bodyShape)\n}\n\nexport function isMale(representation: RepresentationDefinition) {\n return is(representation, WearableBodyShape.MALE)\n}\n\nexport function isFemale(representation: RepresentationDefinition) {\n return is(representation, WearableBodyShape.FEMALE)\n}\n\nexport function getRepresentation(wearable: WearableDefinition, 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: WearableDefinition, 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: WearableDefinition, 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: RepresentationDefinition) {\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: RepresentationDefinition) {\n return representation.mainFile.endsWith('png')\n}\n","import { WearableBodyShape, WearableCategory, WearableDefinition } from '@dcl/schemas'\n\nexport function getWearableByCategory(wearables: WearableDefinition[], 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: WearableDefinition | void): value is WearableDefinition {\n return !!value\n}\n\nexport function getWearableBodyShape(wearabe: WearableDefinition): 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: WearableDefinition) {\n return !!wearable && `emoteDataV0` in wearable\n}\n","import { WearableCategory, WearableDefinition } from '@dcl/schemas'\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?: WearableDefinition | 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","import {\n Avatar,\n Network,\n PreviewCamera,\n PreviewConfig,\n PreviewEmote,\n PreviewEnv,\n PreviewOptions,\n PreviewType,\n Rarity,\n WearableBodyShape,\n WearableDefinition,\n} from '@dcl/schemas'\nimport { nftApi } from './api/nft'\nimport { peerApi } from './api/peer'\nimport { createMemo } from './cache'\nimport { colorToHex, formatHex } from './color'\nimport { getRepresentationOrDefault, hasRepresentation, isTexture } from './representation'\nimport { getDefaultCategories, getDefaultWearableUrn, getWearableBodyShape, getWearableByCategory, isEmote, isWearable } from './wearable'\nimport { getZoom } from './zoom'\n\nconst DEFAULT_PROFILE = 'default'\n\nasync function fetchWearable(urn: string, env: PreviewEnv) {\n const results = await fetchURNs([urn], env)\n if (results.length !== 1) {\n throw new Error(`Could not find wearable for urn=\"${urn}\"`)\n }\n return results[0]\n}\n\nfunction parseWearable(base64: string): WearableDefinition {\n return JSON.parse(atob(base64))\n}\n\nasync function fetchProfileWearables(profile: Avatar | null, env: PreviewEnv) {\n if (!profile) {\n return []\n }\n const results = await fetchURNs(profile.avatar.wearables, env)\n return results.filter((result) => !isEmote(result))\n}\n\nasync function fetchURNs(urns: string[], env: PreviewEnv) {\n if (urns.length === 0) {\n return []\n }\n return peerApi.fetchWearables(urns, env)\n}\n\nasync function fetchURLs(urls: string[]) {\n if (urls.length === 0) {\n return []\n }\n const promises = urls.map((url) =>\n fetch(url)\n .then((resp) => resp.json())\n .catch()\n )\n const results = await Promise.all(promises)\n return results.filter(isWearable)\n}\n\nexport const profileMemo = createMemo<Avatar | null>()\nasync function fetchProfile(profile: string, env: PreviewEnv) {\n return profileMemo.memo(profile, async () => {\n if (profile === DEFAULT_PROFILE) {\n return null\n }\n const resp = await 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 return resp || null\n })\n}\n\nasync function fetchWearableFromContract(options: {\n contractAddress: string\n itemId?: string | null\n tokenId?: string | null\n env: PreviewEnv\n}) {\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 === PreviewEnv.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(\n profile: Avatar | null,\n urns: string[],\n urls: string[],\n base64s: string[],\n bodyShape: WearableBodyShape,\n env: PreviewEnv\n) {\n // gather wearables from profile, urns, urls and base64s\n let wearables = [\n ...(await fetchProfileWearables(profile, env)),\n ...(await fetchURNs([bodyShape, ...urns], env)),\n ...(await fetchURLs(urls)),\n ...base64s.map(parseWearable),\n ]\n // filter out wearables that don't have a representation for the body shape\n wearables = wearables.filter((wearable) => hasRepresentation(wearable, bodyShape))\n // fill default categories\n const defaultWearableUrns: string[] = []\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 defaultWearableUrns.push(urn)\n } else {\n throw new Error(`Could not get default URN for category=\"${category}\"`)\n }\n }\n }\n if (defaultWearableUrns.length > 0) {\n const defaultWearables = await fetchURNs(defaultWearableUrns, env)\n wearables = [...wearables, ...defaultWearables]\n }\n return wearables\n}\n\nexport async function createConfig(options: PreviewOptions = {}): Promise<PreviewConfig> {\n const { contractAddress, tokenId, itemId } = options\n const env = options.env || PreviewEnv.PROD\n\n // load wearable to preview\n let wearablePromise: Promise<WearableDefinition | 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(null)\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 = [...(options.urns || [])]\n\n // urls to load wearables from\n const urls = options.urls || []\n\n // wearables passed as base64\n const base64s = options.base64s || []\n\n let wearables: WearableDefinition[] = []\n let zoom = 1.75\n let type = PreviewType.WEARABLE\n let background: PreviewConfig['background'] = {\n gradient: options.transparentBackground ? undefined : `radial-gradient(#676370, #18141b)`,\n }\n\n // if loading multiple wearables (either from URNs or URLs), or if wearable is emote, render full avatar\n if (urns.length > 0 || urls.length > 0 || base64s.length > 0 || (wearable && isEmote(wearable)) || options.profile) {\n type = PreviewType.AVATAR\n wearables = await fetchAvatar(profile, urns, urls, base64s, 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 !== PreviewType.AVATAR) {\n type = PreviewType.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 = PreviewEmote.IDLE\n if (options.emote && Object.values(PreviewEmote).includes(options.emote)) {\n emote = options.emote\n }\n\n let camera = PreviewCamera.INTERACTIVE\n if (options.camera && Object.values(PreviewCamera).includes(options.camera)) {\n camera = options.camera\n }\n const autoRotateSpeed = typeof options.autoRotateSpeed === 'number' && !isNaN(options.autoRotateSpeed) ? options.autoRotateSpeed : 0.2\n const centerBoundingBox = typeof options.centerBoundingBox === 'boolean' && options.centerBoundingBox !== false\n\n // wheel options\n let wheelZoom = 1\n let wheelPrecision = 100\n let wheelStart = 50\n if (isNumber(options.wheelZoom)) {\n wheelZoom = Math.max(options.wheelZoom!, 1) // min value 1\n }\n if (isNumber(options.wheelPrecision)) {\n wheelPrecision = Math.max(options.wheelPrecision!, 1) // min value 1\n }\n if (isNumber(options.wheelStart)) {\n wheelStart = 100 - Math.min(Math.max(options.wheelStart!, 0), 100) // value between 0 and 100\n }\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 centerBoundingBox,\n offsetX: options.offsetX || 0,\n offsetY: options.offsetY || 0,\n offsetZ: options.offsetZ || 0,\n zoom: options.zoom || zoom,\n wheelZoom,\n wheelPrecision,\n wheelStart,\n }\n}\n\nfunction isNumber(value: number | null | undefined): boolean {\n return typeof value === 'number' && !isNaN(value)\n}\n","interface IMemo<T> {\n memo: (key: string, fn: (...args: any[]) => Promise<T>, ...args: any[]) => Promise<T>\n reset: () => void\n}\n\nexport function createMemo<T>(): IMemo<T> {\n const cache: Record<string, Promise<T>> = {}\n return {\n memo: async (key, fn, ...args) => {\n const exists = key in cache\n if (!exists) {\n cache[key] = fn(...args)\n }\n return cache[key]\n },\n reset: () => {\n for (const key in cache) {\n delete cache[key]\n }\n },\n }\n}\n","import { useEffect, useState } from 'react'\n\n/* \n ids and nonces are used to identity the order on which async functions are called, \n to avoid race conditions and always keep the value of the last function call, \n regardless of the order in which they resolve \n*/\nconst nonces: Record<string, number> = {}\nfunction isValid(id: string, nonce: number) {\n return nonce === nonces[id]\n}\n\nexport function useAsync<T>(id: string, asyncFunction: (...args: any[]) => Promise<T>, deps: React.DependencyList = []) {\n // initialize state\n const [isLoading, setIsLoading] = useState(false)\n const [result, setResult] = useState<T | null>(null)\n const [error, setError] = useState('')\n\n // initialize nonce for this id\n if (typeof nonces[id] === 'undefined') {\n nonces[id] = 0\n }\n\n // run async function\n useEffect(() => {\n const nonce = ++nonces[id]\n setIsLoading(true)\n asyncFunction()\n .then((result) => {\n if (isValid(id, nonce)) {\n setResult(result)\n }\n })\n .catch((error) => {\n if (isValid(id, nonce)) {\n setError(error.message)\n }\n })\n .finally(() => {\n if (isValid(id, nonce)) {\n setIsLoading(false)\n }\n })\n }, deps) // eslint-disable-line\n\n return [result, isLoading, error] as const\n}\n","import { useMemo, useState } from 'react'\nimport { useOverrides } from './useOverrides'\n\nimport { PreviewCamera, PreviewEmote, PreviewEnv, PreviewOptions, WearableBodyShape } from '@dcl/schemas'\nimport { parseZoom } from '../lib/zoom'\n\nexport const useOptions = () => {\n // get options from url params\n const [search] = useState(window.location.search.toString())\n const options = useMemo<PreviewOptions>(() => {\n const params = new URLSearchParams(search)\n const autoRotateSpeedParam = params.get('autoRotateSpeed') as string | null\n const offsetXParam = params.get('offsetX') as string | null\n const offsetYParam = params.get('offsetY') as string | null\n const offsetZParam = params.get('offsetZ') as string | null\n const wheelZoomParam = params.get('wheelZoom') as string | null\n const wheelPrecisionParam = params.get('wheelPrecision') as string | null\n const wheelStartParam = params.get('wheelStart') as string | null\n const bodyShapeParam = params.get('bodyShape')\n const options = {\n contractAddress: params.get('contract')!,\n tokenId: params.get('token'),\n itemId: params.get('item'),\n skin: params.get('skin'),\n hair: params.get('hair'),\n eyes: params.get('eyes'),\n emote: params.get('emote') as PreviewEmote | null,\n camera: params.get('camera') as PreviewCamera | null,\n transparentBackground: params.has('transparentBackground'),\n centerBoundingBox: params.get('centerBoundingBox') !== 'false',\n autoRotateSpeed: autoRotateSpeedParam ? parseFloat(autoRotateSpeedParam) : null,\n offsetX: offsetXParam ? parseFloat(offsetXParam) : null,\n offsetY: offsetYParam ? parseFloat(offsetYParam) : null,\n offsetZ: offsetZParam ? parseFloat(offsetZParam) : null,\n wheelZoom: wheelZoomParam ? parseFloat(wheelZoomParam) : null,\n wheelPrecision: wheelPrecisionParam ? parseFloat(wheelPrecisionParam) : null,\n wheelStart: wheelStartParam ? parseFloat(wheelStartParam) : null,\n zoom: parseZoom(params.get('zoom')),\n bodyShape:\n bodyShapeParam === 'female' || bodyShapeParam === WearableBodyShape.FEMALE\n ? WearableBodyShape.FEMALE\n : bodyShapeParam === 'male' || bodyShapeParam === WearableBodyShape.MALE\n ? WearableBodyShape.MALE\n : null,\n urns: params.getAll('urn'),\n urls: params.getAll('url'),\n base64s: params.getAll('base64'),\n profile: params.get('profile'),\n env: Object.values(PreviewEnv)\n .filter((value): value is PreviewEnv => typeof value === 'string')\n .reduce((selected, value) => (value === params.get('env') ? value : selected), PreviewEnv.PROD),\n }\n return options\n }, [search])\n\n // apply overrides\n const overrides = useOverrides()\n const optionsWithOverrides = useMemo(\n () => ({\n ...options,\n ...overrides,\n }),\n [options, overrides]\n )\n\n // return options with overrides applied (if any)\n return optionsWithOverrides\n}\n","import { useState, useEffect } from 'react'\nimport equal from 'deep-equal'\nimport { PreviewMessagePayload, PreviewMessageType, PreviewOptions, sendMessage } from '@dcl/schemas'\n\nexport const useOverrides = () => {\n const [overrides, setOverrides] = useState<PreviewOptions>({})\n const [isReady, setIsReady] = useState(false)\n\n // receive message from parent window to update options\n useEffect(() => {\n function handleMessage(event: MessageEvent) {\n if (\n event.data &&\n event.data.type === PreviewMessageType.UPDATE &&\n typeof event.data.payload === 'object' &&\n typeof event.data.payload.options === 'object'\n ) {\n const { options } = event.data.payload as PreviewMessagePayload<PreviewMessageType.UPDATE>\n if (!equal(overrides, options)) {\n setOverrides(options)\n }\n }\n }\n window.addEventListener('message', handleMessage)\n if (!isReady) {\n sendMessage(window.parent, PreviewMessageType.READY, {})\n setIsReady(true)\n }\n return () => {\n window.removeEventListener('message', handleMessage)\n }\n }, [overrides, isReady])\n\n return overrides\n}\n","import { createConfig } from '../lib/config'\nimport { useAsync } from './useAsync'\nimport { useOptions } from './useOptions'\n\nexport function useConfig() {\n const options = useOptions()\n const [config, isLoading, error] = useAsync('useConfig', () => createConfig(options), [options])\n return [config, isLoading, error] as const\n}\n","import { WearableCategory, WearableDefinition } from '@dcl/schemas'\nimport { getRepresentationOrDefault, isTexture } from '../representation'\nimport { Asset } from './scene'\n\nexport function isCategory(category: WearableCategory) {\n return (wearable: WearableDefinition) => 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: WearableDefinition): boolean {\n const representation = getRepresentationOrDefault(wearable)\n return !isTexture(representation)\n}\n\nexport function isFacialFeature(wearable: WearableDefinition): 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 === WearableCategory.BODY_SHAPE)\n if (!bodyShape) {\n return null\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(WearableCategory.HEAD))\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 { PreviewConfig, WearableCategory, WearableDefinition } from '@dcl/schemas'\nimport { hasRepresentation } from '../representation'\nimport { isEmote } from '../wearable'\n\nconst categoriesHiddenBySkin = [\n WearableCategory.HELMET,\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(config: PreviewConfig) {\n const slots = new Map<WearableCategory, WearableDefinition>()\n\n let wearables: WearableDefinition[] = config.wearables.filter((wearable) => !isEmote(wearable)) // remove emotes if any\n\n // remove other wearables that hide the equipped wearable\n if (config.wearable && !isEmote(config.wearable)) {\n wearables = config.wearables.filter((wearable) => {\n if (config.wearable) {\n const { category, hides, replaces } = config.wearable.data\n if (wearable.data.category === 'skin') {\n if (categoriesHiddenBySkin.includes(category)) {\n return false\n }\n if (hides && hides.includes(WearableCategory.HEAD)) {\n return false\n }\n if (replaces && replaces.includes(WearableCategory.HEAD)) {\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(config.wearable)\n }\n\n // arrange wearbles in slots\n for (const wearable of wearables) {\n const slot = wearable.data.category\n if (hasRepresentation(wearable, config.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 { PreviewConfig } from '@dcl/schemas'\n\nexport function startAutoRotateBehavior(camera: ArcRotateCamera, config: PreviewConfig) {\n if (camera) {\n camera.useAutoRotationBehavior = true\n if (camera.autoRotationBehavior) {\n camera.autoRotationBehavior.idleRotationSpeed = config.autoRotateSpeed\n }\n }\n}\n","export const isDev = process.env.NODE_ENV !== 'production'\n\nexport function isIOs() {\n return ['iPad Simulator', 'iPhone Simulator', 'iPod Simulator', 'iPad', 'iPhone', 'iPod'].includes(navigator.platform)\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 Scene,\n SceneLoader,\n SpotLight,\n Texture,\n TextureAssetTask,\n Vector3,\n} from '@babylonjs/core'\nimport '@babylonjs/loaders'\nimport { PreviewCamera, PreviewConfig, PreviewType, WearableBodyShape, WearableDefinition } from '@dcl/schemas'\nimport { isDev, isIOs } from '../env'\nimport { getRepresentation } from '../representation'\nimport { startAutoRotateBehavior } from './camera'\n\n// needed for debugging\nconst showInspector = isDev && process.env.REACT_APP_DEBUG\nif (showInspector) {\n require('@babylonjs/inspector')\n}\n\nexport type Asset = {\n container: AssetContainer\n wearable: WearableDefinition\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 */\nlet engine: Engine\nexport async function createScene(canvas: HTMLCanvasElement, config: PreviewConfig) {\n // Create engine\n if (engine) {\n engine.dispose()\n }\n engine = new Engine(canvas, true, {\n preserveDrawingBuffer: true,\n stencil: true,\n antialias: 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.ambientColor = new Color3(1, 1, 1)\n root.preventDefaultOnPointerDown = false\n\n // Setup Camera\n const camera = new ArcRotateCamera('camera', 0, 0, 0, new Vector3(0, 0, 0), root)\n camera.mode = Camera.PERSPECTIVE_CAMERA\n switch (config.camera) {\n case PreviewCamera.INTERACTIVE: {\n switch (config.type) {\n case PreviewType.WEARABLE: {\n startAutoRotateBehavior(camera, config)\n camera.position = new Vector3(-2, 2, 2)\n break\n }\n case PreviewType.AVATAR: {\n camera.position = new Vector3(0, 1, 3.5)\n break\n }\n default: {\n console.warn(`Unexpected preview.type=\"${config.type}\"`)\n // do nothing\n }\n }\n camera.attachControl(canvas, true)\n break\n }\n case PreviewCamera.STATIC: {\n camera.position = new Vector3(0, 1, 3.5)\n break\n }\n }\n const offset = new Vector3(config.offsetX, config.offsetY, config.offsetZ)\n camera.position.addInPlace(offset)\n camera.setTarget(offset)\n\n // compute camera radius\n camera.lowerRadiusLimit = camera.radius / config.zoom\n camera.upperRadiusLimit = camera.lowerRadiusLimit * config.wheelZoom\n camera.radius = camera.lowerRadiusLimit + ((camera.upperRadiusLimit - camera.lowerRadiusLimit) * config.wheelStart) / 100\n camera.wheelPrecision = config.wheelPrecision\n\n // Setup lights\n if (config.type === PreviewType.WEARABLE) {\n const directional = new DirectionalLight('directional', new Vector3(0, 0, 1), root)\n directional.intensity = 1\n const 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 const top = new HemisphericLight('top', new Vector3(0, -1, 0), root)\n top.intensity = 1.0\n const bottom = new HemisphericLight('bottom', new Vector3(0, 1, 0), root)\n bottom.intensity = 1.0\n\n // Setup effects\n // Avoid ios since the glow effect breaks on safari: https://github.com/decentraland/wearable-preview/issues/11\n if (!isIOs()) {\n const glowLayer = new GlowLayer('glow', root)\n glowLayer.intensity = 0.4\n }\n\n // Render loop\n engine.runRenderLoop(() => {\n root.render()\n })\n\n // Dev tools\n if (showInspector) {\n root.debugLayer.show({ showExplorer: true, embedMode: true })\n }\n\n return root\n}\n\nexport async function loadMask(scene: Scene, wearable: WearableDefinition, 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: WearableDefinition, 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 * 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 const 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 { PreviewCamera, PreviewConfig, PreviewEmote, WearableDefinition } from '@dcl/schemas'\nimport { getRepresentation } from '../representation'\nimport { isEmote } from '../wearable'\nimport { startAutoRotateBehavior } from './camera'\nimport { Asset, loadAssetContainer } from './scene'\n\nconst loopedEmotes = [PreviewEmote.IDLE, PreviewEmote.MONEY, PreviewEmote.CLAP]\n\nfunction isLooped(emote: PreviewEmote) {\n return loopedEmotes.includes(emote)\n}\n\nexport function buildEmoteUrl(emote: PreviewEmote) {\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 const 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 return container\n}\n\nexport async function loadEmoteFromWearable(scene: Scene, wearable: WearableDefinition, config: PreviewConfig) {\n const representation = getRepresentation(wearable, config.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=${config.bodyShape}`)\n }\n return loadEmoteFromUrl(scene, content.url)\n}\n\nexport async function playEmote(scene: Scene, assets: Asset[], config: PreviewConfig) {\n // load asset container for emote\n let container: AssetContainer | undefined\n let loop = isLooped(config.emote)\n // if target wearable is emote, play that one\n if (config.wearable && isEmote(config.wearable)) {\n try {\n container = await loadEmoteFromWearable(scene, config.wearable, config)\n loop = !!config.wearable.emoteDataV0?.loop\n } catch (error) {\n console.warn(`Could not load emote=${config.wearable.id}`)\n }\n } else if (config.wearables.some(isEmote)) {\n // if there's some emote in the wearables list, play the last one\n const emote = config.wearables.reverse().find(isEmote)!\n container = await loadEmoteFromWearable(scene, emote, config)\n loop = !!emote.emoteDataV0?.loop\n }\n if (!container) {\n const emoteUrl = buildEmoteUrl(config.emote)\n container = await loadEmoteFromUrl(scene, emoteUrl)\n }\n\n // start camera rotation after animation ends\n async function onAnimationEnd() {\n if (config.camera !== PreviewCamera.STATIC) {\n const camera = scene.cameras[0] as ArcRotateCamera\n startAutoRotateBehavior(camera, config)\n }\n if (loop) {\n // keep playing idle animation on loop\n playEmote(scene, assets, config)\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 if (container.animationGroups.length > 0) {\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 } else {\n throw new Error(`No animationGroups found`)\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=${config.emote}`, error)\n }\n}\n","import { AbstractMesh, Color3, Orientation, PBRMaterial, Scene, StandardMaterial, Texture } from '@babylonjs/core'\nimport { PreviewConfig, WearableBodyShape, WearableCategory, WearableDefinition } from '@dcl/schemas'\nimport { hexToColor } from '../color'\nimport { Asset, loadMask, loadTexture } from './scene'\nimport { isCategory } from './utils'\n\nfunction getCategoryLoader(scene: Scene, features: WearableDefinition[], 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: WearableDefinition[], 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 config: PreviewConfig\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, config.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, config.hair, mask, config.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, config.skin, mask, config.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 newMaterial.specularColor = Color3.Black()\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).toLinearSpace()\n }\n mesh.material = newMaterial\n}\n","import { SceneLoader } from '@babylonjs/core'\nimport { GLTFFileLoader } from '@babylonjs/loaders'\nimport { PreviewConfig, WearableBodyShape, WearableDefinition } from '@dcl/schemas'\nimport { getRepresentation } from '../representation'\n\nexport function createMappings(wearables: WearableDefinition[], 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(config: PreviewConfig) {\n const wearables = config.wearable ? [config.wearable, ...config.wearables] : config.wearables\n const mappings = createMappings(wearables, config.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 { Effect } from '@babylonjs/core'\n\nconst needle = `#include<pbrBlockFinalColorComposition>`\nconst injection = `#include<customToonShading>`\n\nif (Effect.ShadersStore['pbrPixelShader'].includes(needle)) {\n if (!Effect.ShadersStore['pbrPixelShader'].includes(injection)) {\n Effect.ShadersStore['pbrPixelShader'] = Effect.ShadersStore['pbrPixelShader'].replace(needle, needle + '\\n' + injection + '\\n')\n }\n} else {\n throw new Error('could not patch the pbrPixelShader')\n}\n\n// Monkey-patch the shaders with the corrected version for Decentraland\n// eslint-disable-next-line\nEffect.IncludesShadersStore['customToonShading'] = require('!!raw-loader!./new-pbr.hlsl').default\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\nimport { Color3, PBRMaterial, Scene } from '@babylonjs/core'\nimport { WearableDefinition, WearableBodyShape } from '@dcl/schemas'\nimport { getRepresentation, isTexture, getContentUrl } from '../representation'\nimport { loadAssetContainer } from './scene'\nimport './toon'\n\nexport async function loadWearable(\n scene: Scene,\n wearable: WearableDefinition,\n bodyShape = WearableBodyShape.MALE,\n skin?: string,\n hair?: string\n) {\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 (const originalMaterial of container.materials) {\n if (originalMaterial instanceof PBRMaterial) {\n const newMaterial = originalMaterial as PBRMaterial\n\n // remove metallic effect\n if (newMaterial.metallic) {\n newMaterial.metallic = 0\n newMaterial.metallicF0Factor = 0\n }\n\n if (newMaterial.name.toLowerCase().includes('hair')) {\n if (hair) {\n newMaterial.albedoColor = Color3.FromHexString(hair).toLinearSpace()\n newMaterial.specularIntensity = 0\n newMaterial.alpha = 1\n } else {\n newMaterial.alpha = 0\n scene.removeMaterial(newMaterial)\n }\n }\n if (newMaterial.name.toLowerCase().includes('skin')) {\n if (skin) {\n newMaterial.albedoColor = Color3.FromHexString(skin).toLinearSpace()\n newMaterial.specularIntensity = 0\n newMaterial.alpha = 1\n } else {\n newMaterial.alpha = 0\n scene.removeMaterial(newMaterial)\n }\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","import { PreviewConfig, PreviewType, WearableBodyShape } from '@dcl/schemas'\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 } from './scene'\nimport { isFacialFeature, isModel, isSuccesful } from './utils'\nimport { loadWearable } from './wearable'\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, config: PreviewConfig) {\n // create the root scene\n const root = await createScene(canvas, config)\n\n // setup the mappings for all the contents\n setupMappings(config)\n\n // load all the wearables into the root scene\n const promises: Promise<void | Asset>[] = []\n\n if (config.type === PreviewType.AVATAR) {\n // get slots\n const slots = getSlots(config)\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, config.bodyShape, config.skin, config.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 if (bodyShape) {\n // apply facial features\n const features = wearables.filter(isFacialFeature)\n const { eyes, eyebrows, mouth } = await getFacialFeatures(root, features, config.bodyShape)\n applyFacialFeatures(root, bodyShape, eyes, eyebrows, mouth, config)\n }\n\n // play emote\n await playEmote(root, assets, config)\n } else {\n if (!config.wearable) {\n throw new Error('No wearable to render')\n }\n const wearable = config.wearable\n try {\n // try loading with the required body shape\n const asset = await loadWearable(root, wearable, config.bodyShape, config.skin, config.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 config.bodyShape === WearableBodyShape.MALE ? WearableBodyShape.FEMALE : WearableBodyShape.MALE,\n config.skin,\n config.hair\n )\n asset.container.addAllToScene()\n }\n }\n\n // center the root scene into the camera\n if (config.centerBoundingBox) {\n center(root)\n }\n}\n","import React, { useEffect, useRef, useState } from 'react'\nimport classNames from 'classnames'\nimport { PreviewCamera, PreviewType, PreviewMessageType, sendMessage } from '@dcl/schemas'\nimport { useWindowSize } from '../../hooks/useWindowSize'\nimport { useConfig } from '../../hooks/useConfig'\nimport { render } from '../../lib/babylon/render'\nimport './Preview.css'\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 [config, isLoadingConfig, configError] = useConfig()\n const [image, setImage] = useState('')\n const [is3D, setIs3D] = useState(true)\n const [isMessageSent, setIsMessageSent] = useState(false)\n\n const error = previewError || configError\n const isLoading = (isLoadingModel || isLoadingConfig) && !error\n const showImage = !!image && !is3D && !isLoading\n const showCanvas = is3D && !isLoading\n\n useEffect(() => {\n if (canvasRef.current && config) {\n // rarity background\n setStyle({ backgroundImage: config.background.gradient ? config.background.gradient : undefined, opacity: 1 })\n\n // set background image\n if (config.background.image) {\n setImage(config.background.image)\n }\n\n // load model or image (for texture only wearables)\n if (config.type === PreviewType.TEXTURE) {\n setIs3D(false)\n setIsLoadingModel(false)\n setIsLoaded(true)\n } else {\n // preview models\n render(canvasRef.current, config)\n .catch((error) => setPreviewError(error.message))\n .finally(() => {\n setIsLoadingModel(false)\n setIsLoaded(true)\n })\n }\n }\n }, [canvasRef.current, config]) // 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(window.parent, PreviewMessageType.LOAD, null)\n setIsMessageSent(true)\n } else if (error) {\n sendMessage(window.parent, PreviewMessageType.ERROR, { message: error })\n setIsMessageSent(true)\n }\n }\n }, [isLoaded, error, isMessageSent])\n\n // when the config is being loaded again (because the was an update to some of the options) reset all the other loading flags\n useEffect(() => {\n if (isLoadingConfig) {\n let shouldResetIsLoaded = false\n if (!isLoadingModel) {\n setIsLoadingModel(true)\n shouldResetIsLoaded = true\n }\n if (isMessageSent) {\n setIsMessageSent(false)\n shouldResetIsLoaded = true\n }\n if (shouldResetIsLoaded && isLoaded) {\n setIsLoaded(false)\n }\n }\n }, [isLoadingConfig, isLoadingModel, isMessageSent, isLoaded])\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 && config?.camera === PreviewCamera.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 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 +0,0 @@
1
- !function(e){function r(r){for(var n,u,a=r[0],c=r[1],i=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 c)Object.prototype.hasOwnProperty.call(c,n)&&(e[n]=c[n]);for(p&&p(r);s.length;)s.shift()();return l.push.apply(l,i||[]),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 c=t[a];0!==o[c]&&(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-2449988983.commit-0534c22/";var a=this["webpackJsonp@dcl/wearable-preview"]=this["webpackJsonp@dcl/wearable-preview"]||[],c=a.push.bind(a);a.push=r,a=a.slice();for(var i=0;i<a.length;i++)r(a[i]);var p=c;t()}([]);
2
- //# sourceMappingURL=runtime-main.f5ee404b.js.map