@dcl/wearable-preview 1.0.0-2203908270.commit-85bf374 → 1.0.0-2204201705.commit-bda1c02
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/asset-manifest.json +12 -12
- package/index.html +1 -1
- package/package.json +3 -3
- package/static/js/main.cd6cf408.chunk.js +2 -0
- package/static/js/main.cd6cf408.chunk.js.map +1 -0
- package/static/js/runtime-main.5c526d71.js +2 -0
- package/static/js/{runtime-main.284a3982.js.map → runtime-main.5c526d71.js.map} +1 -1
- package/static/js/main.c54e91f9.chunk.js +0 -2
- package/static/js/main.c54e91f9.chunk.js.map +0 -1
- package/static/js/runtime-main.284a3982.js +0 -2
package/asset-manifest.json
CHANGED
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
{
|
|
2
2
|
"files": {
|
|
3
|
-
"main.css": "https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-
|
|
4
|
-
"main.js": "https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-
|
|
5
|
-
"main.js.map": "https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-
|
|
6
|
-
"runtime-main.js": "https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-
|
|
7
|
-
"runtime-main.js.map": "https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-
|
|
8
|
-
"static/js/2.883dec52.chunk.js": "https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-
|
|
9
|
-
"static/js/2.883dec52.chunk.js.map": "https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-
|
|
10
|
-
"index.html": "https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-
|
|
11
|
-
"static/css/main.bcd9c703.chunk.css.map": "https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-
|
|
12
|
-
"static/js/2.883dec52.chunk.js.LICENSE.txt": "https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-
|
|
3
|
+
"main.css": "https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2204201705.commit-bda1c02/static/css/main.bcd9c703.chunk.css",
|
|
4
|
+
"main.js": "https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2204201705.commit-bda1c02/static/js/main.cd6cf408.chunk.js",
|
|
5
|
+
"main.js.map": "https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2204201705.commit-bda1c02/static/js/main.cd6cf408.chunk.js.map",
|
|
6
|
+
"runtime-main.js": "https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2204201705.commit-bda1c02/static/js/runtime-main.5c526d71.js",
|
|
7
|
+
"runtime-main.js.map": "https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2204201705.commit-bda1c02/static/js/runtime-main.5c526d71.js.map",
|
|
8
|
+
"static/js/2.883dec52.chunk.js": "https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2204201705.commit-bda1c02/static/js/2.883dec52.chunk.js",
|
|
9
|
+
"static/js/2.883dec52.chunk.js.map": "https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2204201705.commit-bda1c02/static/js/2.883dec52.chunk.js.map",
|
|
10
|
+
"index.html": "https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2204201705.commit-bda1c02/index.html",
|
|
11
|
+
"static/css/main.bcd9c703.chunk.css.map": "https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2204201705.commit-bda1c02/static/css/main.bcd9c703.chunk.css.map",
|
|
12
|
+
"static/js/2.883dec52.chunk.js.LICENSE.txt": "https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2204201705.commit-bda1c02/static/js/2.883dec52.chunk.js.LICENSE.txt"
|
|
13
13
|
},
|
|
14
14
|
"entrypoints": [
|
|
15
|
-
"static/js/runtime-main.
|
|
15
|
+
"static/js/runtime-main.5c526d71.js",
|
|
16
16
|
"static/js/2.883dec52.chunk.js",
|
|
17
17
|
"static/css/main.bcd9c703.chunk.css",
|
|
18
|
-
"static/js/main.
|
|
18
|
+
"static/js/main.cd6cf408.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-
|
|
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-2204201705.commit-bda1c02/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-2204201705.commit-bda1c02/logo192.png"/><link rel="manifest" href="https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2204201705.commit-bda1c02/manifest.json"/><title>Decentraland | Wearable Preview</title><link href="https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2204201705.commit-bda1c02/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-2204201705.commit-bda1c02/";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-2204201705.commit-bda1c02/static/js/2.883dec52.chunk.js"></script><script src="https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2204201705.commit-bda1c02/static/js/main.cd6cf408.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-
|
|
3
|
+
"version": "1.0.0-2204201705.commit-bda1c02",
|
|
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-
|
|
13
|
-
"commit": "
|
|
12
|
+
"homepage": "https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2204201705.commit-bda1c02",
|
|
13
|
+
"commit": "bda1c0212f8c529d73ae76a26b2468a3c5f24ff6"
|
|
14
14
|
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
(this["webpackJsonp@dcl/wearable-preview"]=this["webpackJsonp@dcl/wearable-preview"]||[]).push([[0],{284:function(e,t,r){},379:function(e,t,r){},382:function(e,t,r){"use strict";r.r(t);var a=r(50),n=r.n(a),o=r(279),c=r.n(o),i=(r(284),r(56)),s=r(221),u=r.n(s),l=r(20);var f,d=r(61),p=r(85),b=r(29),h=r.n(b),v=r(39),w=r(218),y=r(219),m=r(135);function g(e){return O.apply(this,arguments)}function O(){return(O=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 E(e){return j.apply(this,arguments)}function j(){return j=Object(v.a)(h.a.mark((function e(t){var r,a,n=arguments;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=n.length>1&&void 0!==n[1]?n[1]:3,e.prev=1,e.next=4,fetch(t);case 4:if((a=e.sent).ok){e.next=11;break}return e.t0=Error,e.next=9,a.text();case 9:throw e.t1=e.sent,new e.t0(e.t1);case 11:return e.abrupt("return",a.json());case 14:if(e.prev=14,e.t2=e.catch(1),!(r>0)){e.next=22;break}return e.next=19,g(100);case 19:return e.abrupt("return",E(t,r-1));case 22:throw e.t2;case 23:case"end":return e.stop()}}),e,null,[[1,14]])}))),j.apply(this,arguments)}var k,x=(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),W=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,r,a){var n,o;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,E("".concat(x[a],"/v1/items?contractAddress=").concat(t,"&itemId=").concat(r));case 2:if(n=e.sent,0!==(o=n.data).length){e.next=6;break}throw new Error('Item not found for contractAddress="'.concat(t,'" itemId="').concat(r,'"'));case 6:return e.abrupt("return",o[0]);case 7:case"end":return e.stop()}}),e)})));return function(t,r,a){return e.apply(this,arguments)}}()},{key:"fetchNFT",value:function(){var e=Object(v.a)(h.a.mark((function e(t,r,a){var n,o;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,E("".concat(x[a],"/v1/nfts?contractAddress=").concat(t,"&tokenId=").concat(r));case 2:if(n=e.sent,0!==(o=n.data).length){e.next=6;break}throw new Error('NFT not found for contractAddress="'.concat(t,'" tokenId="').concat(r,'"'));case 6:return e.abrupt("return",o[0].nft);case 7:case"end":return e.stop()}}),e)})));return function(t,r,a){return e.apply(this,arguments)}}()}]),e}(),S=new W,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,r){var a,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.next=4,E("".concat(A[r],"/lambdas/collections/wearables?").concat(t.map((function(e){return"wearableId=".concat(e)})).join("&")));case 4:if(a=e.sent,0!==(n=a.wearables).length){e.next=8;break}throw new Error('Wearables not found for urns="'.concat(t,'"'));case 8:return e.abrupt("return",n);case 9:case"end":return e.stop()}}),e)})));return function(t,r){return e.apply(this,arguments)}}()},{key:"fetchProfile",value:function(){var e=Object(v.a)(h.a.mark((function e(t,r){var a;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,E("".concat(A[r],"/lambdas/profiles?id=").concat(t));case 2:return a=e.sent,e.abrupt("return",a.length>0?a[0]:null);case 4:case"end":return e.stop()}}),e)})));return function(t,r){return e.apply(this,arguments)}}()}]),e}(),P=new C;var B=r(40);function L(e){return e.startsWith("#")?e:"#"+e}function R(e){return("0"+(255*e|0).toString(16)).slice(-2)}function M(e){return R(e.r)+R(e.g)+R(e.b)}function T(e){var t=function(e){return e.startsWith("#")?e.slice(1):e}(e);return new B.e(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 F(e){return I(e,l.WearableBodyShape.FEMALE)}function D(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(F))throw new Error('Could not find a BaseFemale representation for wearable="'.concat(e.id,'"'));return e.data.representations.find(F);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 N(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:l.WearableBodyShape.MALE;if(Y(e,t))return D(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 Y(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:l.WearableBodyShape.MALE;try{return D(e,t),!0}catch(r){return!1}}function U(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 V(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 X(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 Z(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,r){var a;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,re([t],r);case 2:if(1===(a=e.sent).length){e.next=5;break}throw new Error('Could not find wearable for urn="'.concat(t,'"'));case 5:return e.abrupt("return",a[0]);case 6:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function te(e){return JSON.parse(atob(e))}function re(e,t){return ae.apply(this,arguments)}function ae(){return(ae=Object(v.a)(h.a.mark((function e(t,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 e.abrupt("return",P.fetchWearables(t,r));case 3:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function ne(e){return oe.apply(this,arguments)}function oe(){return(oe=Object(v.a)(h.a.mark((function e(t){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 r=t.map((function(e){return fetch(e).then((function(e){return e.json()})).catch()})),e.next=5,Promise.all(r);case 5:return a=e.sent,e.abrupt("return",a.filter(G));case 7:case"end":return e.stop()}}),e)})))).apply(this,arguments)}var ce=function(){var e={};return{memo:function(){var t=Object(v.a)(h.a.mark((function t(r,a){var n,o,c,i=arguments;return h.a.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(!(r in e)){for(n=i.length,o=new Array(n>2?n-2:0),c=2;c<n;c++)o[c-2]=i[c];e[r]=a.apply(void 0,o)}return t.abrupt("return",e[r]);case 3:case"end":return t.stop()}}),t)})));return function(e,r){return t.apply(this,arguments)}}(),reset:function(){for(var t in e)delete e[t]}}}();function ie(e,t){return se.apply(this,arguments)}function se(){return(se=Object(v.a)(h.a.mark((function e(t,r){return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt("return",ce.memo(t,Object(v.a)(h.a.mark((function e(){var a;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,P.fetchProfile(t,r).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 a=e.sent,e.abrupt("return",a||null);case 6:case"end":return e.stop()}}),e)})))));case 1:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function ue(e){return le.apply(this,arguments)}function le(){return(le=Object(v.a)(h.a.mark((function e(t){var r,a,n,o,c,i,s;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(r=t.contractAddress,a=t.itemId,n=t.tokenId,o=t.env,a||n){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(r,":").concat(a),a||n){e.next=9;break}throw new Error("You must provide either tokenId or itemId");case 9:if(a||!n){e.next=14;break}return e.next=12,S.fetchNFT(r,n,o);case 12:s=e.sent,i=s.network!==l.Network.ETHEREUM?"urn:decentraland:".concat(c,":collections-v2:").concat(r,":").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 fe(e,t,r,a,n){return de.apply(this,arguments)}function de(){return(de=Object(v.a)(h.a.mark((function e(t,r,a,n,o){var c,i,s,u,l,f,b;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.t0=[],e.t1=p.a,e.next=4,re([n].concat(Object(p.a)(t)),o);case 4:return e.t2=e.sent,e.t3=(0,e.t1)(e.t2),e.t4=p.a,e.next=9,ne(r);case 9:e.t5=e.sent,e.t6=(0,e.t4)(e.t5),e.t7=Object(p.a)(a.map(te)),c=(c=e.t0.concat.call(e.t0,e.t3,e.t6,e.t7)).filter((function(e){return Y(e,n)})),i=[],s=Object(d.a)(z(n)),e.prev=16,s.s();case 18:if((u=s.n()).done){e.next=30;break}if(l=u.value,V(c,l)){e.next=28;break}if(!(f=X(l,n))){e.next=27;break}i.push(f),e.next=28;break;case 27:throw new Error('Could not get default URN for category="'.concat(l,'"'));case 28:e.next=18;break;case 30:e.next=35;break;case 32:e.prev=32,e.t8=e.catch(16),s.e(e.t8);case 35:return e.prev=35,s.f(),e.finish(35);case 38:if(!(i.length>0)){e.next=43;break}return e.next=41,re(i,o);case 41:b=e.sent,c=[].concat(Object(p.a)(c),Object(p.a)(b));case 43:return e.abrupt("return",c);case 44:case"end":return e.stop()}}),e,null,[[16,32,35,38]])})))).apply(this,arguments)}function pe(){return pe=Object(v.a)(h.a.mark((function e(){var t,r,a,n,o,c,s,u,f,d,b,v,w,y,m,g,O,E,j,k,x,W,S,A,C,P,B,R,T,I,_=arguments;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=_.length>0&&void 0!==_[0]?_[0]:{},r=t.contractAddress,a=t.tokenId,n=t.itemId,o=t.env||l.PreviewEnv.PROD,c=Promise.resolve(),r&&(c=ue({contractAddress:r,tokenId:a,itemId:n,env:o})),s=t.profile?ie(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?Z(d):l.WearableBodyShape.MALE),w=L(t.skin||b&&M(b.avatar.skin.color)||"cc9b76"),y=L(t.hair||b&&M(b.avatar.hair.color)||"000000"),m=L(t.eyes||b&&M(b.avatar.eyes.color)||"000000"),g=[].concat(Object(p.a)(b?b.avatar.wearables:[]),Object(p.a)(t.urns||[])),O=t.urls||[],E=t.base64s||[],j=[],k=1.75,x=l.PreviewType.WEARABLE,W={gradient:t.transparentBackground?void 0:"radial-gradient(#676370, #18141b)"},!(g.length>0||O.length>0||E.length>0||d&&J(d)||t.profile===Q)){e.next=28;break}return x=l.PreviewType.AVATAR,e.next=27,fe(g,O,E,v,o);case 27:j=e.sent;case 28:return d&&(k=j.length>0?k:q(d),H(N(d))&&x!==l.PreviewType.AVATAR&&(x=l.PreviewType.TEXTURE),S=l.Rarity.getGradient(d.rarity),A=Object(i.a)(S,2),C=A[0],P=A[1],B="radial-gradient(".concat(C,", ").concat(P,")"),W={image:d.thumbnail,gradient:B}),R=l.PreviewEmote.IDLE,t.emote&&Object.values(l.PreviewEmote).includes(t.emote)&&(R=t.emote),T=l.PreviewCamera.INTERACTIVE,t.camera&&Object.values(l.PreviewCamera).includes(t.camera)&&(T=t.camera),I="number"!==typeof t.autoRotateSpeed||isNaN(t.autoRotateSpeed)?.2:t.autoRotateSpeed,e.abrupt("return",{wearable:null!==d&&void 0!==d?d:void 0,wearables:j,bodyShape:v,skin:w,hair:y,eyes:m,type:x,background:W,emote:R,camera:T,autoRotateSpeed:I,offsetX:t.offsetX||0,offsetY:t.offsetY||0,offsetZ:t.offsetZ||0,zoom:t.zoom||k});case 35:case"end":return e.stop()}}),e)}))),pe.apply(this,arguments)}var be={};function he(e,t){return t===be[e]}var ve=r(237),we=function(){var e=Object(a.useState)(window.location.search.toString()),t=Object(i.a)(e,1)[0],r=Object(a.useMemo)((function(){var e=new URLSearchParams(t),r=e.get("autoRotateSpeed"),a=e.get("offsetX"),n=e.get("offsetY"),o=e.get("offsetZ"),c=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"),autoRotateSpeed:r?parseFloat(r):null,offsetX:a?parseFloat(a):null,offsetY:n?parseFloat(n):null,offsetZ:o?parseFloat(o):null,zoom:K(e.get("zoom")),bodyShape:"female"===c||c===l.WearableBodyShape.FEMALE?l.WearableBodyShape.FEMALE:"male"===c||c===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,r){return r===e.get("env")?r:t}),l.PreviewEnv.PROD)}}),[t]),n=function(){var e=Object(a.useState)({}),t=Object(i.a)(e,2),r=t[0],n=t[1];return Object(a.useEffect)((function(){var e=window.onmessage;return window.onmessage=function(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;n(t)}},function(){window.onmessage=e}}),[]),r}();return Object(a.useMemo)((function(){return Object(ve.a)(Object(ve.a)({},r),n)}),[r,n])};function ye(){var e=we(),t=function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[],n=Object(a.useState)(!1),o=Object(i.a)(n,2),c=o[0],s=o[1],u=Object(a.useState)(null),l=Object(i.a)(u,2),f=l[0],d=l[1],p=Object(a.useState)(""),b=Object(i.a)(p,2),h=b[0],v=b[1];return"undefined"===typeof be[e]&&(be[e]=0),Object(a.useEffect)((function(){var r=++be[e];s(!0),t().then((function(t){he(e,r)&&d(t)})).catch((function(t){he(e,r)&&v(t.message)})).finally((function(){he(e,r)&&s(!1)}))}),r),[f,c,h]}("useConfig",(function(){return function(){return pe.apply(this,arguments)}(e)}),[e]),r=Object(i.a)(t,3);return[r[0],r[1],r[2]]}function me(e){return function(t){return t.data.category===e}}function ge(e){return function(t){return t.wearable.data.category===e||(t.wearable.data.hides||[]).includes(e)||(t.wearable.data.replaces||[]).includes(e)}}function Oe(e){return!!e}function Ee(e){return!H(N(e))}function je(e){return!Ee(e)}function ke(e){var t=e.find((function(e){return"body_shape"===e.wearable.data.category}));if(!t)throw new Error("Could not find a bodyShape when trying to hide base body parts");var r,a=e.some((function(e){return e.wearable.data.category===l.WearableCategory.SKIN})),n=a||e.some(ge(l.WearableCategory.UPPER_BODY)),o=a||e.some(ge(l.WearableCategory.LOWER_BODY)),c=a||e.some(ge(l.WearableCategory.FEET)),i=a||e.some(ge("head")),s=Object(d.a)(t.container.meshes);try{for(s.s();!(r=s.n()).done;){var u=r.value,f=u.name.toLowerCase();f.endsWith("ubody_basemesh")&&n&&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 xe=[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 We(e){var t=new Map,r=e.wearables.filter((function(e){return!J(e)}));e.wearable&&!J(e.wearable)&&(r=e.wearables.filter((function(t){if(e.wearable){var r=e.wearable.data,a=r.category,n=r.hides,o=r.replaces;if("skin"===t.data.category){if(xe.includes(a))return!1;if(n&&n.includes("head"))return!1;if(o&&o.includes("head"))return!1}if(t.data.hides&&t.data.hides.includes(a))return!1;if(t.data.replaces&&t.data.replaces.includes(a))return!1}return!0})),r.push(e.wearable));var a,n=Object(d.a)(r);try{for(n.s();!(a=n.n()).done;){var o=a.value,c=o.data.category;Y(o,e.bodyShape)&&t.set(c,o)}}catch(x){n.e(x)}finally{n.f()}var i=!1;r=r.filter((function(e){return t.get(e.data.category)===e})).reverse();var s,u=new Set,f=Object(d.a)(r);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 O=g[m];O!==h&&(t.delete(O),u.add(O))}b.data.category===l.WearableCategory.SKIN&&(i=!0)}}}catch(x){f.e(x)}finally{f.f()}if(i){var E,j=Object(d.a)(xe);try{for(j.s();!(E=j.n()).done;){var k=E.value;t.delete(k)}}catch(x){j.e(x)}finally{j.f()}}return t}function Se(e,t){e&&(e.useAutoRotationBehavior=!0,e.autoRotationBehavior&&(e.autoRotationBehavior.idleRotationSpeed=t.autoRotateSpeed))}var Ae;r(381);function Ce(e,t){return Pe.apply(this,arguments)}function Pe(){return(Pe=Object(v.a)(h.a.mark((function e(t,r){var a,n,o;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:Ae&&Ae.dispose(),Ae=new B.h(t,!0,{preserveDrawingBuffer:!0,stencil:!0,antialias:!0}),(a=new B.m(Ae)).autoClear=!0,a.clearColor=new B.f(0,0,0,0),a.preventDefaultOnPointerDown=!1,(n=new B.b("camera",0,0,0,new B.r(0,0,0),a)).mode=B.d.PERSPECTIVE_CAMERA,e.t0=r.camera,e.next=e.t0===l.PreviewCamera.INTERACTIVE?11:e.t0===l.PreviewCamera.STATIC?22:24;break;case 11:e.t1=r.type,e.next=e.t1===l.PreviewType.WEARABLE?14:e.t1===l.PreviewType.AVATAR?17:19;break;case 14:return Se(n,r),n.position=new B.r(-2,2,2),e.abrupt("break",20);case 17:return n.position=new B.r(0,1,3.5),e.abrupt("break",20);case 19:console.warn('Unexpected preview.type="'.concat(r.type,'"'));case 20:return n.attachControl(t,!0),e.abrupt("break",24);case 22:return n.position=new B.r(0,1,3.5),e.abrupt("break",24);case 24:return o=new B.r(r.offsetX,r.offsetY,r.offsetZ),n.position.addInPlace(o),n.setTarget(o),n.lowerRadiusLimit=n.upperRadiusLimit=n.radius/r.zoom,new B.g("directional",new B.r(0,0,1),a).intensity=1,new B.i("top",new B.r(0,-1,0),a).intensity=1,new B.i("bottom",new B.r(0,1,0),a).intensity=1,new B.o("spot",new B.r(-2,2,2),new B.r(2,-2,-2),Math.PI/2,1e3,a).intensity=1,Ae.runRenderLoop((function(){return a.render()})),e.abrupt("return",a);case 38:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function Be(e,t,r){return Le.apply(this,arguments)}function Le(){return(Le=Object(v.a)(h.a.mark((function e(t,r,a){var n,o,c;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n=r.id,o=D(r,a),!(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,r){var a=new B.q(n,c.url,!0,!1);a.onError=function(){return r(a.errorObject)},a.onSuccess=function(){e(a.texture)},a.run(t,(function(){return e(a.texture)}),r)})));case 5:return e.abrupt("return",null);case 6:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function Re(e,t,r){return Me.apply(this,arguments)}function Me(){return(Me=Object(v.a)(h.a.mark((function e(t,r,a){var n,o,c;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n=r.id,o=D(r,a),!(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,r){var a=new B.q(n,c.url,!0,!1);a.onError=function(){return r(a.errorObject)},a.onSuccess=function(){e(a.texture)},a.run(t,(function(){return e(a.texture)}),r)})));case 5:return e.abrupt("return",null);case 6:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function Te(e,t){return Ie.apply(this,arguments)}function Ie(){return Ie=Object(v.a)(h.a.mark((function e(t,r){var a;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return a=function(){var e=Object(v.a)(h.a.mark((function e(r,a){return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt("return",B.n.LoadAssetContainerAsync(r,"",t,null,a));case 1:case"end":return e.stop()}}),e)})));return function(t,r){return e.apply(this,arguments)}}(),e.prev=1,e.next=4,a(r,".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,a(r,".gltf");case 12:case"end":return e.stop()}}),e,null,[[1,7]])}))),Ie.apply(this,arguments)}function _e(e){var t,r=new B.j("parent",e),a=Object(d.a)(e.meshes);try{for(a.s();!(t=a.n()).done;){var n=t.value;n!==r&&n.setParent(r)}}catch(s){a.e(s)}finally{a.f()}!function(e){var t=e.getChildren().filter((function(e){return"__root__"!==e.id}));if(t.length>0){for(var r=t[0],a=r.getBoundingInfo(),n=a.boundingBox.minimumWorld.add(r.position),o=a.boundingBox.maximumWorld.add(r.position),c=1;c<t.length;c++){var i=t[c],s=(a=i.getBoundingInfo()).boundingBox.minimumWorld.add(i.position),u=a.boundingBox.maximumWorld.add(i.position);n=B.r.Minimize(n,s),o=B.r.Maximize(o,u)}e.setBoundingInfo(new B.c(n,o))}}(r);var o=r.getBoundingInfo().boundingBox.extendSize.length(),c=new B.r(1/o,1/o,1/o);r.scaling=c;var i=r.getBoundingInfo().boundingBox.center.multiply(c);r.position.subtractInPlace(i)}var Fe=[l.PreviewEmote.IDLE,l.PreviewEmote.MONEY,l.PreviewEmote.CLAP];function De(e){return Fe.includes(e)}function Ne(e){var t="https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2204201705.commit-bda1c02";t.endsWith("/")||(t+="/");var r="./emotes/".concat(e,".glb");return t.startsWith("http")?new URL(r,t).href:r}function Ye(e,t){return Ue.apply(this,arguments)}function Ue(){return(Ue=Object(v.a)(h.a.mark((function e(t,r){var a;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Te(t,r);case 2:if(0!==(a=e.sent).animationGroups.length){e.next=5;break}throw new Error("No animation groups found for emote with url=".concat(r));case 5:return e.abrupt("return",a);case 6:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function He(e,t,r){return Ve.apply(this,arguments)}function Ve(){return(Ve=Object(v.a)(h.a.mark((function e(t,r,a){var n,o;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n=D(r,a.bodyShape),o=n.contents.find((function(e){return e.key===n.mainFile}))){e.next=4;break}throw new Error("Could not find a valid content in representation for wearable=".concat(r.id," and bodyShape=").concat(a.bodyShape));case 4:return e.abrupt("return",Ye(t,o.url));case 5:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function ze(e,t,r){return Xe.apply(this,arguments)}function Xe(){return Xe=Object(v.a)(h.a.mark((function e(t,r,a){var n,o,c,i,s,u,f,p,b,w,y,m,g,O,E,j,k,x,W,S;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(u=function(){return(u=Object(v.a)(h.a.mark((function e(){return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:a.camera!==l.PreviewCamera.STATIC&&Se(t.cameras[0],a),o&&ze(t,r,a);case 2:case"end":return e.stop()}}),e)})))).apply(this,arguments)},s=function(){return u.apply(this,arguments)},o=De(a.emote),!a.wearable||!J(a.wearable)){e.next=14;break}return e.prev=4,e.next=7,He(t,a.wearable,a);case 7:n=e.sent,o=!!(null===(c=a.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(a.wearable.id));case 14:if(n){e.next=19;break}return i=Ne(a.emote),e.next=18,Ye(t,i);case 18:n=e.sent;case 19:e.prev=19,f=new B.a("emote",t),p=Object(d.a)(r),e.prev=22,p.s();case 24:if((b=p.n()).done){e.next=35;break}if(w=b.value,y=w.container.transformNodes.reduce((function(e,t){var r=e.get(t.id)||[];return r.push(t),e.set(t.id,r)}),new Map),!(n.animationGroups.length>0)){e.next=32;break}m=Object(d.a)(n.animationGroups[0].targetedAnimations);try{for(m.s();!(g=m.n()).done;)if(O=g.value,E=O.animation,j=O.target,(k=y.get(j.id))&&k.length>0){x=Object(d.a)(k);try{for(x.s();!(W=x.n()).done;)S=W.value,f.addTargetedAnimation(E,S)}catch(A){x.e(A)}finally{x.f()}}}catch(A){m.e(A)}finally{m.f()}e.next=33;break;case 32:throw new Error("No animationGroups found");case 33:e.next=24;break;case 35:e.next=40;break;case 37:e.prev=37,e.t1=e.catch(22),p.e(e.t1);case 40:return e.prev=40,p.f(),e.finish(40);case 43:f.play(),f.onAnimationEndObservable.addOnce(s),e.next=50;break;case 47:e.prev=47,e.t2=e.catch(19),console.warn("Could not play emote=".concat(a.emote),e.t2);case 50:case"end":return e.stop()}}),e,null,[[4,11],[19,47],[22,37,40,43]])}))),Xe.apply(this,arguments)}function Ge(e,t,r){return function(){var a=Object(v.a)(h.a.mark((function a(n){var o;return h.a.wrap((function(a){for(;;)switch(a.prev=a.next){case 0:if(!(o=t.find(me(n)))){a.next=3;break}return a.abrupt("return",Promise.all([Re(e,o,r),Be(e,o,r)]));case 3:return a.abrupt("return",[null,null]);case 4:case"end":return a.stop()}}),a)})));return function(e){return a.apply(this,arguments)}}()}function Ze(e,t,r){return Je.apply(this,arguments)}function Je(){return(Je=Object(v.a)(h.a.mark((function e(t,r,a){var n,o,c,s,u,f;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=Ge(t,r,a),e.next=3,Promise.all([n(l.WearableCategory.EYES),n(l.WearableCategory.EYEBROWS),n(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 Ke(e,t,r,a,n,o){return qe.apply(this,arguments)}function qe(){return(qe=Object(v.a)(h.a.mark((function e(t,r,a,n,o,c){var s,u,l,f,p,b,v,w,y,m,g,O;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:s=Object(d.a)(r.container.meshes);try{for(s.s();!(u=s.n()).done;)(l=u.value).name.toLowerCase().endsWith("mask_eyes")&&(f=Object(i.a)(a,2),p=f[0],b=f[1],p&&Qe(t,"eyes",l,p,c.eyes,b,"#ffffff")),l.name.toLowerCase().endsWith("mask_eyebrows")&&(v=Object(i.a)(n,2),w=v[0],y=v[1],w&&Qe(t,"eyebrows",l,w,c.hair,y,c.hair)),l.name.toLowerCase().endsWith("mask_mouth")&&(m=Object(i.a)(o,2),g=m[0],O=m[1],g&&Qe(t,"mouth",l,g,c.skin,O,c.skin))}catch(h){s.e(h)}finally{s.f()}case 2:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function Qe(e,t,r,a,n,o,c){var i=new B.p("".concat(t,"_standard_material"),e);i.alphaMode=B.l.PBRMATERIAL_ALPHABLEND,i.backFaceCulling=!0,a.hasAlpha=!0,i.sideOrientation=B.k.CW,i.diffuseTexture=a,i.diffuseColor=o?B.e.Black():T(c),o&&(i.emissiveTexture=o,i.emissiveColor=T(n)),r.material=i}function $e(e){var t=function(e){var t,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:l.WearableBodyShape.MALE,a={},n=Object(d.a)(e);try{for(n.s();!(t=n.n()).done;){var o=t.value;try{var c,i=D(o,r),s=Object(d.a)(i.contents);try{for(s.s();!(c=s.n()).done;){var u=c.value;a[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(r,'"'));continue}}}catch(f){n.e(f)}finally{n.f()}return a}(e.wearable?[e.wearable].concat(Object(p.a)(e.wearables)):e.wearables,e.bodyShape);B.n.OnPluginActivatedObservable.add((function(e){"gltf"===e.name&&(e.preprocessUrlAsync=function(){var e=Object(v.a)(h.a.mark((function e(r){var a;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return"/content/contents/",a=r.split("/content/contents/"),e.abrupt("return",a.length>0&&a[1]?t[a[1]]:r);case 3:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}())}))}function et(e,t){return tt.apply(this,arguments)}function tt(){return tt=Object(v.a)(h.a.mark((function e(t,r){var a,n,o,c,i,s,u,f,p,b,v,w,y,m,g=arguments;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(a=g.length>2&&void 0!==g[2]?g[2]:l.WearableBodyShape.MALE,n=g.length>3?g[3]:void 0,o=g.length>4?g[4]:void 0,!H(c=D(r,a))){e.next=6;break}throw new Error('The wearable="'.concat(r.id,'" is a texture'));case 6:return i=U(c),e.next=9,Te(t,i);case 9:s=e.sent,u=Object(d.a)(s.materials);try{for(u.s();!(f=u.n()).done;)(p=f.value).name.toLowerCase().includes("hair")&&(o?((b=p).albedoColor=B.e.FromHexString(o),b.alpha=1):(p.alpha=0,t.removeMaterial(p))),p.name.toLowerCase().includes("skin")&&(n?((v=p).albedoColor=B.e.FromHexString(n),v.alpha=1):(p.alpha=0,t.removeMaterial(p)))}catch(h){u.e(h)}finally{u.f()}w=Object(d.a)(s.animationGroups);try{for(w.s();!(y=w.n()).done;)(m=y.value).stop(),m.reset(),m.dispose()}catch(h){w.e(h)}finally{w.f()}return e.abrupt("return",{container:s,wearable:r});case 15:case"end":return e.stop()}}),e)}))),tt.apply(this,arguments)}function rt(){return(rt=Object(v.a)(h.a.mark((function e(t,r){var a,n,o,c,i,s,u,f,p,b,v,w,y,m,g,O,E,j;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Ce(t,r);case 2:if(a=e.sent,$e(r),n=[],r.type!==l.PreviewType.AVATAR){e.next=28;break}o=We(r),c=Array.from(o.values()),i=Object(d.a)(c.filter(Ee));try{for(i.s();!(s=i.n()).done;)u=s.value,f=et(a,u,r.bodyShape,r.skin,r.hair).catch((function(e){console.warn(e.message)})),n.push(f)}catch(h){i.e(h)}finally{i.f()}return e.next=12,Promise.all(n);case 12:p=e.sent.filter(Oe),b=Object(d.a)(p);try{for(b.s();!(v=b.n()).done;)v.value.container.addAllToScene()}catch(h){b.e(h)}finally{b.f()}return w=ke(p),y=c.filter(je),e.next=19,Ze(a,y,r.bodyShape);case 19:return m=e.sent,g=m.eyes,O=m.eyebrows,E=m.mouth,Ke(a,w,g,O,E,r),e.next=26,ze(a,p,r);case 26:e.next=44;break;case 28:if(r.wearable){e.next=30;break}throw new Error("No wearable to render");case 30:return j=r.wearable,e.prev=31,e.next=34,et(a,j,r.bodyShape,r.skin,r.hair);case 34:e.sent.container.addAllToScene(),e.next=44;break;case 38:return e.prev=38,e.t0=e.catch(31),e.next=42,et(a,j,r.bodyShape===l.WearableBodyShape.MALE?l.WearableBodyShape.FEMALE:l.WearableBodyShape.MALE,r.skin,r.hair);case 42:e.sent.container.addAllToScene();case 44:_e(a);case 45:case"end":return e.stop()}}),e,null,[[31,38]])})))).apply(this,arguments)}r(379);var at=r(123),nt=function(){var e=Object(a.useState)(""),t=Object(i.a)(e,2),r=t[0],n=t[1],o=function(){var e=Object(a.useState)({width:void 0,height:void 0}),t=Object(i.a)(e,2),r=t[0],n=t[1];return Object(a.useEffect)((function(){function e(){n({width:window.innerWidth,height:window.innerHeight})}return window.addEventListener("resize",e),e(),function(){return window.removeEventListener("resize",e)}}),[]),r}(),c=o.width,s=o.height,f=Object(a.useState)({}),d=Object(i.a)(f,2),p=d[0],b=d[1],h=Object(a.useState)(!1),v=Object(i.a)(h,2),w=v[0],y=v[1],m=Object(a.useState)(!0),g=Object(i.a)(m,2),O=g[0],E=g[1],j=Object(a.useState)(!1),k=Object(i.a)(j,2),x=k[0],W=k[1],S=Object(a.useRef)(null),A=ye(),C=Object(i.a)(A,3),P=C[0],B=C[1],L=C[2],R=Object(a.useState)(""),M=Object(i.a)(R,2),T=M[0],I=M[1],_=Object(a.useState)(!0),F=Object(i.a)(_,2),D=F[0],N=F[1],Y=Object(a.useState)(!1),U=Object(i.a)(Y,2),H=U[0],V=U[1],z=r||L,X=(O||B)&&!z,G=!!T&&!D&&!X,Z=D&&!X;return Object(a.useEffect)((function(){S.current&&P&&(b({backgroundImage:P.background.gradient?P.background.gradient:void 0,opacity:1}),P.background.image&&I(P.background.image),P.type===l.PreviewType.TEXTURE?(N(!1),E(!1),W(!0)):function(e,t){return rt.apply(this,arguments)}(S.current,P).catch((function(e){return n(e.message)})).finally((function(){E(!1),W(!0)})))}),[S.current,P]),Object(a.useEffect)((function(){H||(x?(Object(l.sendMessage)(window.parent,l.PreviewMessageType.LOAD,null),V(!0)):z&&(Object(l.sendMessage)(window.parent,l.PreviewMessageType.ERROR,{message:z}),V(!0)))}),[x,z,H]),Object(a.useEffect)((function(){if(B){var e=!1;O||(E(!0),e=!0),H&&(V(!1),e=!0),e&&x&&W(!1)}}),[B,O,H,x]),Object(at.jsxs)("div",{className:u()("Preview",{"is-dragging":w,"is-loading":X,"is-loaded":x,"is-3d":D&&(null===P||void 0===P?void 0:P.camera)===l.PreviewCamera.INTERACTIVE,"has-error":!!z}),style:p,children:[Object(at.jsx)("img",{src:T,className:u()("thumbnail",{"is-visible":G}),alt:"preview"}),Object(at.jsx)("canvas",{id:"wearable-preview",className:u()({"is-visible":Z}),width:c,height:s,ref:S,onMouseDown:function(){return y(D&&!z)},onMouseUp:function(){return y(!1)}}),z&&Object(at.jsx)("div",{className:"error",children:z})]})},ot=n.a.memo(nt);c.a.render(Object(at.jsx)(n.a.StrictMode,{children:Object(at.jsx)(ot,{})}),document.getElementById("root"))}},[[382,1,2]]]);
|
|
2
|
+
//# sourceMappingURL=main.cd6cf408.chunk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["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/babylon/scene.ts","lib/babylon/emotes.ts","lib/babylon/face.ts","lib/babylon/mappings.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","toWearable","base64","JSON","parse","atob","fetchWearables","fetchURLs","urls","promises","then","catch","all","filter","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","avatar","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","offsetX","offsetY","offsetZ","nonces","isValid","nonce","useOptions","useState","window","location","search","useMemo","params","URLSearchParams","autoRotateSpeedParam","get","offsetXParam","offsetYParam","offsetZParam","bodyShapeParam","has","getAll","reduce","selected","overrides","setOverrides","useEffect","previous","onmessage","event","PreviewMessageType","UPDATE","payload","useOverrides","useConfig","asyncFunction","deps","isLoading","setIsLoading","result","setResult","setError","message","finally","useAsync","createConfig","isCategory","isHidden","asset","hides","replaces","isSuccesful","isModel","isFacialFeature","getBodyShape","assets","part","hasSkin","hideUpperBody","hideLowerBody","hideFeet","hideHead","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","engine","createScene","canvas","dispose","Engine","preserveDrawingBuffer","stencil","antialias","root","Scene","autoClear","clearColor","Color4","preventDefaultOnPointerDown","ArcRotateCamera","Vector3","mode","Camera","PERSPECTIVE_CAMERA","STATIC","position","warn","attachControl","offset","addInPlace","setTarget","lowerRadiusLimit","upperRadiusLimit","radius","DirectionalLight","intensity","HemisphericLight","SpotLight","PI","runRenderLoop","render","loadMask","scene","file","reject","task","TextureAssetTask","onError","errorObject","onSuccess","texture","run","loadTexture","loadAssetContainer","load","extension","SceneLoader","LoadAssetContainerAsync","center","parent","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","process","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","hasAlpha","sideOrientation","Orientation","CW","diffuseTexture","diffuseColor","Black","emissiveTexture","emissiveColor","material","setupMappings","mappings","createMappings","OnPluginActivatedObservable","plugin","preprocessUrlAsync","parts","loadWearable","materials","pbr","albedoColor","FromHexString","alpha","removeMaterial","animationGroup","stop","promise","addAllToScene","Preview","previewError","setPreviewError","width","height","windowSize","setWindowSize","handleResize","innerWidth","innerHeight","addEventListener","removeEventListener","useWindowSize","style","setStyle","isDragging","setIsDragging","isLoadingModel","setIsLoadingModel","isLoaded","setIsLoaded","canvasRef","useRef","isLoadingConfig","configError","setImage","is3D","setIs3D","isMessageSent","setIsMessageSent","showImage","showCanvas","current","backgroundImage","opacity","sendMessage","LOAD","ERROR","shouldResetIsLoaded","className","classNames","src","alt","ref","onMouseDown","onMouseUp","React","ReactDOM","StrictMode","document","getElementById"],"mappings":"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","file":"static/js/main.cd6cf408.chunk.js","sourcesContent":["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 toWearable(base64: string): WearableDefinition {\n return JSON.parse(atob(base64))\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(urns: string[], urls: string[], base64s: string[], bodyShape: WearableBodyShape, env: PreviewEnv) {\n // fetch wearables from urns, urls and base64s\n let wearables = [...(await fetchURNs([bodyShape, ...urns], env)), ...(await fetchURLs(urls)), ...base64s.map(toWearable)]\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 = [...(profile ? profile.avatar.wearables : []), ...(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 === DEFAULT_PROFILE) {\n type = PreviewType.AVATAR\n wearables = await fetchAvatar(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\n return {\n wearable: wearable ?? undefined,\n wearables,\n bodyShape,\n skin,\n hair,\n eyes,\n type,\n background,\n emote,\n camera,\n autoRotateSpeed,\n offsetX: options.offsetX || 0,\n offsetY: options.offsetY || 0,\n offsetZ: options.offsetZ || 0,\n zoom: options.zoom || zoom,\n }\n}\n","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 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 autoRotateSpeed: autoRotateSpeedParam ? parseFloat(autoRotateSpeedParam) : null,\n offsetX: offsetXParam ? parseFloat(offsetXParam) : null,\n offsetY: offsetYParam ? parseFloat(offsetYParam) : null,\n offsetZ: offsetZParam ? parseFloat(offsetZParam) : 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 { PreviewMessagePayload, PreviewMessageType, PreviewOptions } from '@dcl/schemas'\n\nexport const useOverrides = () => {\n const [overrides, setOverrides] = useState<PreviewOptions>({})\n\n // receive message from parent window to update options\n useEffect(() => {\n const previous = window.onmessage\n window.onmessage = function (event: MessageEvent) {\n if (\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 setOverrides(options)\n }\n }\n return () => {\n window.onmessage = previous\n }\n }, [])\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 === ('body_shape' as WearableCategory))\n\n if (!bodyShape) {\n throw new Error(`Could not find a bodyShape when trying to hide base body parts`)\n }\n\n // hide base body parts if necessary\n const hasSkin = assets.some((part) => part.wearable.data.category === WearableCategory.SKIN)\n const hideUpperBody = hasSkin || assets.some(isHidden(WearableCategory.UPPER_BODY))\n const hideLowerBody = hasSkin || assets.some(isHidden(WearableCategory.LOWER_BODY))\n const hideFeet = hasSkin || assets.some(isHidden(WearableCategory.FEET))\n const hideHead = hasSkin || assets.some(isHidden('head' as WearableCategory))\n\n for (const mesh of bodyShape.container.meshes) {\n const name = mesh.name.toLowerCase()\n if (name.endsWith('ubody_basemesh') && hideUpperBody) {\n mesh.setEnabled(false)\n }\n if (name.endsWith('lbody_basemesh') && hideLowerBody) {\n mesh.setEnabled(false)\n }\n if (name.endsWith('feet_basemesh') && hideFeet) {\n mesh.setEnabled(false)\n }\n if (name.endsWith('head') && hideHead) {\n mesh.setEnabled(false)\n }\n if (name.endsWith('head_basemesh') && hideHead) {\n mesh.setEnabled(false)\n }\n if (name.endsWith('mask_eyes') && hideHead) {\n mesh.setEnabled(false)\n }\n if (name.endsWith('mask_eyebrows') && hideHead) {\n mesh.setEnabled(false)\n }\n if (name.endsWith('mask_mouth') && hideHead) {\n mesh.setEnabled(false)\n }\n }\n\n return bodyShape\n}\n","import { 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('head' as WearableCategory)) {\n return false\n }\n if (replaces && replaces.includes('head' as WearableCategory)) {\n return false\n }\n }\n if (wearable.data.hides && wearable.data.hides.includes(category)) {\n return false\n }\n if (wearable.data.replaces && wearable.data.replaces.includes(category)) {\n return false\n }\n }\n return true\n })\n // add the equipped wearable at the end\n wearables.push(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","import {\n ArcRotateCamera,\n AssetContainer,\n BoundingInfo,\n Camera,\n Color4,\n DirectionalLight,\n Engine,\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 { getRepresentation } from '../representation'\nimport { startAutoRotateBehavior } from './camera'\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.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 camera.lowerRadiusLimit = camera.upperRadiusLimit = camera.radius / config.zoom\n\n // Setup lights\n const directional = new DirectionalLight('directional', new Vector3(0, 0, 1), root)\n directional.intensity = 1\n const top = new HemisphericLight('top', new Vector3(0, -1, 0), root)\n top.intensity = 1\n const bottom = new HemisphericLight('bottom', new Vector3(0, 1, 0), root)\n bottom.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 // render loop\n engine.runRenderLoop(() => root.render())\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 (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 }\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 texture.hasAlpha = true\n newMaterial.sideOrientation = Orientation.CW\n newMaterial.diffuseTexture = texture\n newMaterial.diffuseColor = mask ? Color3.Black() : hexToColor(maskColor)\n if (mask) {\n newMaterial.emissiveTexture = mask\n newMaterial.emissiveColor = hexToColor(color)\n }\n mesh.material = newMaterial\n}\n","import { SceneLoader } from '@babylonjs/core'\nimport { GLTFFileLoader } from '@babylonjs/loaders'\nimport { 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","/**\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'\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 (let material of container.materials) {\n if (material.name.toLowerCase().includes('hair')) {\n if (hair) {\n const pbr = material as PBRMaterial\n pbr.albedoColor = Color3.FromHexString(hair)\n pbr.alpha = 1\n } else {\n material.alpha = 0\n scene.removeMaterial(material)\n }\n }\n if (material.name.toLowerCase().includes('skin')) {\n if (skin) {\n const pbr = material as PBRMaterial\n pbr.albedoColor = Color3.FromHexString(skin)\n pbr.alpha = 1\n } else {\n material.alpha = 0\n scene.removeMaterial(material)\n }\n }\n }\n\n // Stop any animations\n for (const animationGroup of container.animationGroups) {\n animationGroup.stop()\n animationGroup.reset()\n animationGroup.dispose()\n }\n\n return { container, wearable }\n}\n","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 // 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 // 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 center(root)\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-2204201705.commit-bda1c02/";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.5c526d71.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../webpack/bootstrap"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","executeModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","deferredModules","apply","checkDeferredModules","result","deferredModule","fulfilled","j","depId","splice","__webpack_require__","s","installedModules","exports","module","l","m","c","d","name","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","p","jsonpArray","this","oldJsonpFunction","slice"],"mappings":"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","file":"static/js/runtime-main.
|
|
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.5c526d71.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-2204201705.commit-bda1c02/\";\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,2 +0,0 @@
|
|
|
1
|
-
(this["webpackJsonp@dcl/wearable-preview"]=this["webpackJsonp@dcl/wearable-preview"]||[]).push([[0],{284:function(e,t,r){},379:function(e,t,r){},382:function(e,t,r){"use strict";r.r(t);var a=r(50),n=r.n(a),o=r(279),c=r.n(o),i=(r(284),r(56)),s=r(221),u=r.n(s),l=r(20);var f,d=r(61),p=r(85),b=r(29),h=r.n(b),v=r(39),w=r(218),y=r(219),m=r(135);function g(e){return O.apply(this,arguments)}function O(){return(O=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 E(e){return j.apply(this,arguments)}function j(){return j=Object(v.a)(h.a.mark((function e(t){var r,a,n=arguments;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return r=n.length>1&&void 0!==n[1]?n[1]:3,e.prev=1,e.next=4,fetch(t);case 4:if((a=e.sent).ok){e.next=11;break}return e.t0=Error,e.next=9,a.text();case 9:throw e.t1=e.sent,new e.t0(e.t1);case 11:return e.abrupt("return",a.json());case 14:if(e.prev=14,e.t2=e.catch(1),!(r>0)){e.next=22;break}return e.next=19,g(100);case 19:return e.abrupt("return",E(t,r-1));case 22:throw e.t2;case 23:case"end":return e.stop()}}),e,null,[[1,14]])}))),j.apply(this,arguments)}var k,x=(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),W=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,r,a){var n,o;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,E("".concat(x[a],"/v1/items?contractAddress=").concat(t,"&itemId=").concat(r));case 2:if(n=e.sent,0!==(o=n.data).length){e.next=6;break}throw new Error('Item not found for contractAddress="'.concat(t,'" itemId="').concat(r,'"'));case 6:return e.abrupt("return",o[0]);case 7:case"end":return e.stop()}}),e)})));return function(t,r,a){return e.apply(this,arguments)}}()},{key:"fetchNFT",value:function(){var e=Object(v.a)(h.a.mark((function e(t,r,a){var n,o;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,E("".concat(x[a],"/v1/nfts?contractAddress=").concat(t,"&tokenId=").concat(r));case 2:if(n=e.sent,0!==(o=n.data).length){e.next=6;break}throw new Error('NFT not found for contractAddress="'.concat(t,'" tokenId="').concat(r,'"'));case 6:return e.abrupt("return",o[0].nft);case 7:case"end":return e.stop()}}),e)})));return function(t,r,a){return e.apply(this,arguments)}}()}]),e}(),S=new W,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,r){var a,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.next=4,E("".concat(A[r],"/lambdas/collections/wearables?").concat(t.map((function(e){return"wearableId=".concat(e)})).join("&")));case 4:if(a=e.sent,0!==(n=a.wearables).length){e.next=8;break}throw new Error('Wearables not found for urns="'.concat(t,'"'));case 8:return e.abrupt("return",n);case 9:case"end":return e.stop()}}),e)})));return function(t,r){return e.apply(this,arguments)}}()},{key:"fetchProfile",value:function(){var e=Object(v.a)(h.a.mark((function e(t,r){var a;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,E("".concat(A[r],"/lambdas/profiles?id=").concat(t));case 2:return a=e.sent,e.abrupt("return",a.length>0?a[0]:null);case 4:case"end":return e.stop()}}),e)})));return function(t,r){return e.apply(this,arguments)}}()}]),e}(),P=new C;var B=r(40);function R(e){return e.startsWith("#")?e:"#"+e}function L(e){return("0"+(255*e|0).toString(16)).slice(-2)}function M(e){return L(e.r)+L(e.g)+L(e.b)}function T(e){var t=function(e){return e.startsWith("#")?e.slice(1):e}(e);return new B.e(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 N(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:l.WearableBodyShape.MALE;if(Y(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 Y(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:l.WearableBodyShape.MALE;try{return F(e,t),!0}catch(r){return!1}}function U(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 V(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 X(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 Z(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,r){var a;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,re([t],r);case 2:if(1===(a=e.sent).length){e.next=5;break}throw new Error('Could not find wearable for urn="'.concat(t,'"'));case 5:return e.abrupt("return",a[0]);case 6:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function te(e){return JSON.parse(atob(e))}function re(e,t){return ae.apply(this,arguments)}function ae(){return(ae=Object(v.a)(h.a.mark((function e(t,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 e.abrupt("return",P.fetchWearables(t,r));case 3:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function ne(e){return oe.apply(this,arguments)}function oe(){return(oe=Object(v.a)(h.a.mark((function e(t){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 r=t.map((function(e){return fetch(e).then((function(e){return e.json()})).catch()})),e.next=5,Promise.all(r);case 5:return a=e.sent,e.abrupt("return",a.filter(G));case 7:case"end":return e.stop()}}),e)})))).apply(this,arguments)}var ce=function(){var e={};return{memo:function(){var t=Object(v.a)(h.a.mark((function t(r,a){var n,o,c,i=arguments;return h.a.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:if(!(r in e)){for(n=i.length,o=new Array(n>2?n-2:0),c=2;c<n;c++)o[c-2]=i[c];e[r]=a.apply(void 0,o)}return t.abrupt("return",e[r]);case 3:case"end":return t.stop()}}),t)})));return function(e,r){return t.apply(this,arguments)}}(),reset:function(){for(var t in e)delete e[t]}}}();function ie(e,t){return se.apply(this,arguments)}function se(){return(se=Object(v.a)(h.a.mark((function e(t,r){return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt("return",ce.memo(t,Object(v.a)(h.a.mark((function e(){var a;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,P.fetchProfile(t,r).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 a=e.sent,e.abrupt("return",a||null);case 6:case"end":return e.stop()}}),e)})))));case 1:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function ue(e){return le.apply(this,arguments)}function le(){return(le=Object(v.a)(h.a.mark((function e(t){var r,a,n,o,c,i,s;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(r=t.contractAddress,a=t.itemId,n=t.tokenId,o=t.env,a||n){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(r,":").concat(a),a||n){e.next=9;break}throw new Error("You must provide either tokenId or itemId");case 9:if(a||!n){e.next=14;break}return e.next=12,S.fetchNFT(r,n,o);case 12:s=e.sent,i=s.network!==l.Network.ETHEREUM?"urn:decentraland:".concat(c,":collections-v2:").concat(r,":").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 fe(e,t,r,a,n){return de.apply(this,arguments)}function de(){return(de=Object(v.a)(h.a.mark((function e(t,r,a,n,o){var c,i,s,u,l,f,b;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.t0=[],e.t1=p.a,e.next=4,re([n].concat(Object(p.a)(t)),o);case 4:return e.t2=e.sent,e.t3=(0,e.t1)(e.t2),e.t4=p.a,e.next=9,ne(r);case 9:e.t5=e.sent,e.t6=(0,e.t4)(e.t5),e.t7=Object(p.a)(a.map(te)),c=(c=e.t0.concat.call(e.t0,e.t3,e.t6,e.t7)).filter((function(e){return Y(e,n)})),i=[],s=Object(d.a)(z(n)),e.prev=16,s.s();case 18:if((u=s.n()).done){e.next=30;break}if(l=u.value,V(c,l)){e.next=28;break}if(!(f=X(l,n))){e.next=27;break}i.push(f),e.next=28;break;case 27:throw new Error('Could not get default URN for category="'.concat(l,'"'));case 28:e.next=18;break;case 30:e.next=35;break;case 32:e.prev=32,e.t8=e.catch(16),s.e(e.t8);case 35:return e.prev=35,s.f(),e.finish(35);case 38:if(!(i.length>0)){e.next=43;break}return e.next=41,re(i,o);case 41:b=e.sent,c=[].concat(Object(p.a)(c),Object(p.a)(b));case 43:return e.abrupt("return",c);case 44:case"end":return e.stop()}}),e,null,[[16,32,35,38]])})))).apply(this,arguments)}function pe(){return pe=Object(v.a)(h.a.mark((function e(){var t,r,a,n,o,c,s,u,f,d,b,v,w,y,m,g,O,E,j,k,x,W,S,A,C,P,B,L,T,I,_=arguments;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t=_.length>0&&void 0!==_[0]?_[0]:{},r=t.contractAddress,a=t.tokenId,n=t.itemId,o=t.env||l.PreviewEnv.PROD,c=Promise.resolve(),r&&(c=ue({contractAddress:r,tokenId:a,itemId:n,env:o})),s=t.profile?ie(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?Z(d):l.WearableBodyShape.MALE),w=R(t.skin||b&&M(b.avatar.skin.color)||"cc9b76"),y=R(t.hair||b&&M(b.avatar.hair.color)||"000000"),m=R(t.eyes||b&&M(b.avatar.eyes.color)||"000000"),g=[].concat(Object(p.a)(b?b.avatar.wearables:[]),Object(p.a)(t.urns||[])),O=t.urls||[],E=t.base64s||[],j=[],k=1.75,x=l.PreviewType.WEARABLE,W={gradient:t.transparentBackground?void 0:"radial-gradient(#676370, #18141b)"},!(g.length>0||O.length>0||E.length>0||d&&J(d)||t.profile===Q)){e.next=28;break}return x=l.PreviewType.AVATAR,e.next=27,fe(g,O,E,v,o);case 27:j=e.sent;case 28:return d&&(k=j.length>0?k:q(d),H(N(d))&&x!==l.PreviewType.AVATAR&&(x=l.PreviewType.TEXTURE),S=l.Rarity.getGradient(d.rarity),A=Object(i.a)(S,2),C=A[0],P=A[1],B="radial-gradient(".concat(C,", ").concat(P,")"),W={image:d.thumbnail,gradient:B}),L=l.PreviewEmote.IDLE,t.emote&&Object.values(l.PreviewEmote).includes(t.emote)&&(L=t.emote),T=l.PreviewCamera.INTERACTIVE,t.camera&&Object.values(l.PreviewCamera).includes(t.camera)&&(T=t.camera),I="number"!==typeof t.autoRotateSpeed||isNaN(t.autoRotateSpeed)?.2:t.autoRotateSpeed,e.abrupt("return",{wearable:null!==d&&void 0!==d?d:void 0,wearables:j,bodyShape:v,skin:w,hair:y,eyes:m,type:x,background:W,emote:L,camera:T,autoRotateSpeed:I,offsetX:t.offsetX||0,offsetY:t.offsetY||0,offsetZ:t.offsetZ||0,zoom:t.zoom||k});case 35:case"end":return e.stop()}}),e)}))),pe.apply(this,arguments)}var be={};function he(e,t){return t===be[e]}var ve=r(237),we=function(){var e=Object(a.useState)(window.location.search.toString()),t=Object(i.a)(e,1)[0],r=Object(a.useMemo)((function(){var e=new URLSearchParams(t),r=e.get("autoRotateSpeed"),a=e.get("offsetX"),n=e.get("offsetY"),o=e.get("offsetZ"),c=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"),autoRotateSpeed:r?parseFloat(r):null,offsetX:a?parseFloat(a):null,offsetY:n?parseFloat(n):null,offsetZ:o?parseFloat(o):null,zoom:K(e.get("zoom")),bodyShape:"female"===c?l.WearableBodyShape.FEMALE:"male"===c?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,r){return r===e.get("env")?r:t}),l.PreviewEnv.PROD)}}),[t]),n=function(){var e=Object(a.useState)({}),t=Object(i.a)(e,2),r=t[0],n=t[1];return Object(a.useEffect)((function(){var e=window.onmessage;return window.onmessage=function(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;n(t)}},function(){window.onmessage=e}}),[]),r}();return Object(a.useMemo)((function(){return Object(ve.a)(Object(ve.a)({},r),n)}),[r,n])};function ye(){var e=we(),t=function(e,t){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[],n=Object(a.useState)(!1),o=Object(i.a)(n,2),c=o[0],s=o[1],u=Object(a.useState)(null),l=Object(i.a)(u,2),f=l[0],d=l[1],p=Object(a.useState)(""),b=Object(i.a)(p,2),h=b[0],v=b[1];return"undefined"===typeof be[e]&&(be[e]=0),Object(a.useEffect)((function(){var r=++be[e];s(!0),t().then((function(t){he(e,r)&&d(t)})).catch((function(t){he(e,r)&&v(t.message)})).finally((function(){he(e,r)&&s(!1)}))}),r),[f,c,h]}("useConfig",(function(){return function(){return pe.apply(this,arguments)}(e)}),[e]),r=Object(i.a)(t,3);return[r[0],r[1],r[2]]}function me(e){return function(t){return t.data.category===e}}function ge(e){return function(t){return t.wearable.data.category===e||(t.wearable.data.hides||[]).includes(e)||(t.wearable.data.replaces||[]).includes(e)}}function Oe(e){return!!e}function Ee(e){return!H(N(e))}function je(e){return!Ee(e)}function ke(e){var t=e.find((function(e){return"body_shape"===e.wearable.data.category}));if(!t)throw new Error("Could not find a bodyShape when trying to hide base body parts");var r,a=e.some((function(e){return e.wearable.data.category===l.WearableCategory.SKIN})),n=a||e.some(ge(l.WearableCategory.UPPER_BODY)),o=a||e.some(ge(l.WearableCategory.LOWER_BODY)),c=a||e.some(ge(l.WearableCategory.FEET)),i=a||e.some(ge("head")),s=Object(d.a)(t.container.meshes);try{for(s.s();!(r=s.n()).done;){var u=r.value,f=u.name.toLowerCase();f.endsWith("ubody_basemesh")&&n&&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 xe=[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 We(e){var t=new Map,r=e.wearables.filter((function(e){return!J(e)}));e.wearable&&!J(e.wearable)&&(r=e.wearables.filter((function(t){if(e.wearable){var r=e.wearable.data,a=r.category,n=r.hides,o=r.replaces;if("skin"===t.data.category){if(xe.includes(a))return!1;if(n&&n.includes("head"))return!1;if(o&&o.includes("head"))return!1}if(t.data.hides&&t.data.hides.includes(a))return!1;if(t.data.replaces&&t.data.replaces.includes(a))return!1}return!0})),r.push(e.wearable));var a,n=Object(d.a)(r);try{for(n.s();!(a=n.n()).done;){var o=a.value,c=o.data.category;Y(o,e.bodyShape)&&t.set(c,o)}}catch(x){n.e(x)}finally{n.f()}var i=!1;r=r.filter((function(e){return t.get(e.data.category)===e})).reverse();var s,u=new Set,f=Object(d.a)(r);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 O=g[m];O!==h&&(t.delete(O),u.add(O))}b.data.category===l.WearableCategory.SKIN&&(i=!0)}}}catch(x){f.e(x)}finally{f.f()}if(i){var E,j=Object(d.a)(xe);try{for(j.s();!(E=j.n()).done;){var k=E.value;t.delete(k)}}catch(x){j.e(x)}finally{j.f()}}return t}function Se(e,t){e&&(e.useAutoRotationBehavior=!0,e.autoRotationBehavior&&(e.autoRotationBehavior.idleRotationSpeed=t.autoRotateSpeed))}var Ae;r(381);function Ce(e,t){return Pe.apply(this,arguments)}function Pe(){return(Pe=Object(v.a)(h.a.mark((function e(t,r){var a,n,o;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:Ae&&Ae.dispose(),Ae=new B.h(t,!0,{preserveDrawingBuffer:!0,stencil:!0,antialias:!0}),(a=new B.m(Ae)).autoClear=!0,a.clearColor=new B.f(0,0,0,0),a.preventDefaultOnPointerDown=!1,(n=new B.b("camera",0,0,0,new B.r(0,0,0),a)).mode=B.d.PERSPECTIVE_CAMERA,e.t0=r.camera,e.next=e.t0===l.PreviewCamera.INTERACTIVE?11:e.t0===l.PreviewCamera.STATIC?22:24;break;case 11:e.t1=r.type,e.next=e.t1===l.PreviewType.WEARABLE?14:e.t1===l.PreviewType.AVATAR?17:19;break;case 14:return Se(n,r),n.position=new B.r(-2,2,2),e.abrupt("break",20);case 17:return n.position=new B.r(0,1,3.5),e.abrupt("break",20);case 19:console.warn('Unexpected preview.type="'.concat(r.type,'"'));case 20:return n.attachControl(t,!0),e.abrupt("break",24);case 22:return n.position=new B.r(0,1,3.5),e.abrupt("break",24);case 24:return o=new B.r(r.offsetX,r.offsetY,r.offsetZ),n.position.addInPlace(o),n.setTarget(o),n.lowerRadiusLimit=n.upperRadiusLimit=n.radius/r.zoom,new B.g("directional",new B.r(0,0,1),a).intensity=1,new B.i("top",new B.r(0,-1,0),a).intensity=1,new B.i("bottom",new B.r(0,1,0),a).intensity=1,new B.o("spot",new B.r(-2,2,2),new B.r(2,-2,-2),Math.PI/2,1e3,a).intensity=1,Ae.runRenderLoop((function(){return a.render()})),e.abrupt("return",a);case 38:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function Be(e,t,r){return Re.apply(this,arguments)}function Re(){return(Re=Object(v.a)(h.a.mark((function e(t,r,a){var n,o,c;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n=r.id,o=F(r,a),!(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,r){var a=new B.q(n,c.url,!0,!1);a.onError=function(){return r(a.errorObject)},a.onSuccess=function(){e(a.texture)},a.run(t,(function(){return e(a.texture)}),r)})));case 5:return e.abrupt("return",null);case 6:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function Le(e,t,r){return Me.apply(this,arguments)}function Me(){return(Me=Object(v.a)(h.a.mark((function e(t,r,a){var n,o,c;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n=r.id,o=F(r,a),!(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,r){var a=new B.q(n,c.url,!0,!1);a.onError=function(){return r(a.errorObject)},a.onSuccess=function(){e(a.texture)},a.run(t,(function(){return e(a.texture)}),r)})));case 5:return e.abrupt("return",null);case 6:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function Te(e,t){return Ie.apply(this,arguments)}function Ie(){return Ie=Object(v.a)(h.a.mark((function e(t,r){var a;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return a=function(){var e=Object(v.a)(h.a.mark((function e(r,a){return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.abrupt("return",B.n.LoadAssetContainerAsync(r,"",t,null,a));case 1:case"end":return e.stop()}}),e)})));return function(t,r){return e.apply(this,arguments)}}(),e.prev=1,e.next=4,a(r,".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,a(r,".gltf");case 12:case"end":return e.stop()}}),e,null,[[1,7]])}))),Ie.apply(this,arguments)}function _e(e){var t,r=new B.j("parent",e),a=Object(d.a)(e.meshes);try{for(a.s();!(t=a.n()).done;){var n=t.value;n!==r&&n.setParent(r)}}catch(s){a.e(s)}finally{a.f()}!function(e){var t=e.getChildren().filter((function(e){return"__root__"!==e.id}));if(t.length>0){for(var r=t[0],a=r.getBoundingInfo(),n=a.boundingBox.minimumWorld.add(r.position),o=a.boundingBox.maximumWorld.add(r.position),c=1;c<t.length;c++){var i=t[c],s=(a=i.getBoundingInfo()).boundingBox.minimumWorld.add(i.position),u=a.boundingBox.maximumWorld.add(i.position);n=B.r.Minimize(n,s),o=B.r.Maximize(o,u)}e.setBoundingInfo(new B.c(n,o))}}(r);var o=r.getBoundingInfo().boundingBox.extendSize.length(),c=new B.r(1/o,1/o,1/o);r.scaling=c;var i=r.getBoundingInfo().boundingBox.center.multiply(c);r.position.subtractInPlace(i)}var De=[l.PreviewEmote.IDLE,l.PreviewEmote.MONEY,l.PreviewEmote.CLAP];function Fe(e){return De.includes(e)}function Ne(e){var t="https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2203908270.commit-85bf374";t.endsWith("/")||(t+="/");var r="./emotes/".concat(e,".glb");return t.startsWith("http")?new URL(r,t).href:r}function Ye(e,t){return Ue.apply(this,arguments)}function Ue(){return(Ue=Object(v.a)(h.a.mark((function e(t,r){var a;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Te(t,r);case 2:if(0!==(a=e.sent).animationGroups.length){e.next=5;break}throw new Error("No animation groups found for emote with url=".concat(r));case 5:return e.abrupt("return",a);case 6:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function He(e,t,r){return Ve.apply(this,arguments)}function Ve(){return(Ve=Object(v.a)(h.a.mark((function e(t,r,a){var n,o;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(n=F(r,a.bodyShape),o=n.contents.find((function(e){return e.key===n.mainFile}))){e.next=4;break}throw new Error("Could not find a valid content in representation for wearable=".concat(r.id," and bodyShape=").concat(a.bodyShape));case 4:return e.abrupt("return",Ye(t,o.url));case 5:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function ze(e,t,r){return Xe.apply(this,arguments)}function Xe(){return Xe=Object(v.a)(h.a.mark((function e(t,r,a){var n,o,c,i,s,u,f,p,b,w,y,m,g,O,E,j,k,x,W,S;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(u=function(){return(u=Object(v.a)(h.a.mark((function e(){return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:a.camera!==l.PreviewCamera.STATIC&&Se(t.cameras[0],a),o&&ze(t,r,a);case 2:case"end":return e.stop()}}),e)})))).apply(this,arguments)},s=function(){return u.apply(this,arguments)},o=Fe(a.emote),!a.wearable||!J(a.wearable)){e.next=14;break}return e.prev=4,e.next=7,He(t,a.wearable,a);case 7:n=e.sent,o=!!(null===(c=a.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(a.wearable.id));case 14:if(n){e.next=19;break}return i=Ne(a.emote),e.next=18,Ye(t,i);case 18:n=e.sent;case 19:e.prev=19,f=new B.a("emote",t),p=Object(d.a)(r),e.prev=22,p.s();case 24:if((b=p.n()).done){e.next=35;break}if(w=b.value,y=w.container.transformNodes.reduce((function(e,t){var r=e.get(t.id)||[];return r.push(t),e.set(t.id,r)}),new Map),!(n.animationGroups.length>0)){e.next=32;break}m=Object(d.a)(n.animationGroups[0].targetedAnimations);try{for(m.s();!(g=m.n()).done;)if(O=g.value,E=O.animation,j=O.target,(k=y.get(j.id))&&k.length>0){x=Object(d.a)(k);try{for(x.s();!(W=x.n()).done;)S=W.value,f.addTargetedAnimation(E,S)}catch(A){x.e(A)}finally{x.f()}}}catch(A){m.e(A)}finally{m.f()}e.next=33;break;case 32:throw new Error("No animationGroups found");case 33:e.next=24;break;case 35:e.next=40;break;case 37:e.prev=37,e.t1=e.catch(22),p.e(e.t1);case 40:return e.prev=40,p.f(),e.finish(40);case 43:f.play(),f.onAnimationEndObservable.addOnce(s),e.next=50;break;case 47:e.prev=47,e.t2=e.catch(19),console.warn("Could not play emote=".concat(a.emote),e.t2);case 50:case"end":return e.stop()}}),e,null,[[4,11],[19,47],[22,37,40,43]])}))),Xe.apply(this,arguments)}function Ge(e,t,r){return function(){var a=Object(v.a)(h.a.mark((function a(n){var o;return h.a.wrap((function(a){for(;;)switch(a.prev=a.next){case 0:if(!(o=t.find(me(n)))){a.next=3;break}return a.abrupt("return",Promise.all([Le(e,o,r),Be(e,o,r)]));case 3:return a.abrupt("return",[null,null]);case 4:case"end":return a.stop()}}),a)})));return function(e){return a.apply(this,arguments)}}()}function Ze(e,t,r){return Je.apply(this,arguments)}function Je(){return(Je=Object(v.a)(h.a.mark((function e(t,r,a){var n,o,c,s,u,f;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return n=Ge(t,r,a),e.next=3,Promise.all([n(l.WearableCategory.EYES),n(l.WearableCategory.EYEBROWS),n(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 Ke(e,t,r,a,n,o){return qe.apply(this,arguments)}function qe(){return(qe=Object(v.a)(h.a.mark((function e(t,r,a,n,o,c){var s,u,l,f,p,b,v,w,y,m,g,O;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:s=Object(d.a)(r.container.meshes);try{for(s.s();!(u=s.n()).done;)(l=u.value).name.toLowerCase().endsWith("mask_eyes")&&(f=Object(i.a)(a,2),p=f[0],b=f[1],p&&Qe(t,"eyes",l,p,c.eyes,b,"#ffffff")),l.name.toLowerCase().endsWith("mask_eyebrows")&&(v=Object(i.a)(n,2),w=v[0],y=v[1],w&&Qe(t,"eyebrows",l,w,c.hair,y,c.hair)),l.name.toLowerCase().endsWith("mask_mouth")&&(m=Object(i.a)(o,2),g=m[0],O=m[1],g&&Qe(t,"mouth",l,g,c.skin,O,c.skin))}catch(h){s.e(h)}finally{s.f()}case 2:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function Qe(e,t,r,a,n,o,c){var i=new B.p("".concat(t,"_standard_material"),e);i.alphaMode=B.l.PBRMATERIAL_ALPHABLEND,i.backFaceCulling=!0,a.hasAlpha=!0,i.sideOrientation=B.k.CW,i.diffuseTexture=a,i.diffuseColor=o?B.e.Black():T(c),o&&(i.emissiveTexture=o,i.emissiveColor=T(n)),r.material=i}function $e(e){var t=function(e){var t,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:l.WearableBodyShape.MALE,a={},n=Object(d.a)(e);try{for(n.s();!(t=n.n()).done;){var o=t.value;try{var c,i=F(o,r),s=Object(d.a)(i.contents);try{for(s.s();!(c=s.n()).done;){var u=c.value;a[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(r,'"'));continue}}}catch(f){n.e(f)}finally{n.f()}return a}(e.wearable?[e.wearable].concat(Object(p.a)(e.wearables)):e.wearables,e.bodyShape);B.n.OnPluginActivatedObservable.add((function(e){"gltf"===e.name&&(e.preprocessUrlAsync=function(){var e=Object(v.a)(h.a.mark((function e(r){var a;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return"/content/contents/",a=r.split("/content/contents/"),e.abrupt("return",a.length>0&&a[1]?t[a[1]]:r);case 3:case"end":return e.stop()}}),e)})));return function(t){return e.apply(this,arguments)}}())}))}function et(e,t){return tt.apply(this,arguments)}function tt(){return tt=Object(v.a)(h.a.mark((function e(t,r){var a,n,o,c,i,s,u,f,p,b,v,w,y,m,g=arguments;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(a=g.length>2&&void 0!==g[2]?g[2]:l.WearableBodyShape.MALE,n=g.length>3?g[3]:void 0,o=g.length>4?g[4]:void 0,!H(c=F(r,a))){e.next=6;break}throw new Error('The wearable="'.concat(r.id,'" is a texture'));case 6:return i=U(c),e.next=9,Te(t,i);case 9:s=e.sent,u=Object(d.a)(s.materials);try{for(u.s();!(f=u.n()).done;)(p=f.value).name.toLowerCase().includes("hair")&&(o?((b=p).albedoColor=B.e.FromHexString(o),b.alpha=1):(p.alpha=0,t.removeMaterial(p))),p.name.toLowerCase().includes("skin")&&(n?((v=p).albedoColor=B.e.FromHexString(n),v.alpha=1):(p.alpha=0,t.removeMaterial(p)))}catch(h){u.e(h)}finally{u.f()}w=Object(d.a)(s.animationGroups);try{for(w.s();!(y=w.n()).done;)(m=y.value).stop(),m.reset(),m.dispose()}catch(h){w.e(h)}finally{w.f()}return e.abrupt("return",{container:s,wearable:r});case 15:case"end":return e.stop()}}),e)}))),tt.apply(this,arguments)}function rt(){return(rt=Object(v.a)(h.a.mark((function e(t,r){var a,n,o,c,i,s,u,f,p,b,v,w,y,m,g,O,E,j;return h.a.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Ce(t,r);case 2:if(a=e.sent,$e(r),n=[],r.type!==l.PreviewType.AVATAR){e.next=28;break}o=We(r),c=Array.from(o.values()),i=Object(d.a)(c.filter(Ee));try{for(i.s();!(s=i.n()).done;)u=s.value,f=et(a,u,r.bodyShape,r.skin,r.hair).catch((function(e){console.warn(e.message)})),n.push(f)}catch(h){i.e(h)}finally{i.f()}return e.next=12,Promise.all(n);case 12:p=e.sent.filter(Oe),b=Object(d.a)(p);try{for(b.s();!(v=b.n()).done;)v.value.container.addAllToScene()}catch(h){b.e(h)}finally{b.f()}return w=ke(p),y=c.filter(je),e.next=19,Ze(a,y,r.bodyShape);case 19:return m=e.sent,g=m.eyes,O=m.eyebrows,E=m.mouth,Ke(a,w,g,O,E,r),e.next=26,ze(a,p,r);case 26:e.next=44;break;case 28:if(r.wearable){e.next=30;break}throw new Error("No wearable to render");case 30:return j=r.wearable,e.prev=31,e.next=34,et(a,j,r.bodyShape,r.skin,r.hair);case 34:e.sent.container.addAllToScene(),e.next=44;break;case 38:return e.prev=38,e.t0=e.catch(31),e.next=42,et(a,j,r.bodyShape===l.WearableBodyShape.MALE?l.WearableBodyShape.FEMALE:l.WearableBodyShape.MALE,r.skin,r.hair);case 42:e.sent.container.addAllToScene();case 44:_e(a);case 45:case"end":return e.stop()}}),e,null,[[31,38]])})))).apply(this,arguments)}r(379);var at=r(123),nt=function(){var e=Object(a.useState)(""),t=Object(i.a)(e,2),r=t[0],n=t[1],o=function(){var e=Object(a.useState)({width:void 0,height:void 0}),t=Object(i.a)(e,2),r=t[0],n=t[1];return Object(a.useEffect)((function(){function e(){n({width:window.innerWidth,height:window.innerHeight})}return window.addEventListener("resize",e),e(),function(){return window.removeEventListener("resize",e)}}),[]),r}(),c=o.width,s=o.height,f=Object(a.useState)({}),d=Object(i.a)(f,2),p=d[0],b=d[1],h=Object(a.useState)(!1),v=Object(i.a)(h,2),w=v[0],y=v[1],m=Object(a.useState)(!0),g=Object(i.a)(m,2),O=g[0],E=g[1],j=Object(a.useState)(!1),k=Object(i.a)(j,2),x=k[0],W=k[1],S=Object(a.useRef)(null),A=ye(),C=Object(i.a)(A,3),P=C[0],B=C[1],R=C[2],L=Object(a.useState)(""),M=Object(i.a)(L,2),T=M[0],I=M[1],_=Object(a.useState)(!0),D=Object(i.a)(_,2),F=D[0],N=D[1],Y=Object(a.useState)(!1),U=Object(i.a)(Y,2),H=U[0],V=U[1],z=r||R,X=(O||B)&&!z,G=!!T&&!F&&!X,Z=F&&!X;return Object(a.useEffect)((function(){S.current&&P&&(b({backgroundImage:P.background.gradient?P.background.gradient:void 0,opacity:1}),P.background.image&&I(P.background.image),P.type===l.PreviewType.TEXTURE?(N(!1),E(!1),W(!0)):function(e,t){return rt.apply(this,arguments)}(S.current,P).catch((function(e){return n(e.message)})).finally((function(){E(!1),W(!0)})))}),[S.current,P]),Object(a.useEffect)((function(){H||(x?(Object(l.sendMessage)(window.parent,l.PreviewMessageType.LOAD,null),V(!0)):z&&(Object(l.sendMessage)(window.parent,l.PreviewMessageType.ERROR,{message:z}),V(!0)))}),[x,z,H]),Object(a.useEffect)((function(){if(B){var e=!1;O||(E(!0),e=!0),H&&(V(!1),e=!0),e&&x&&W(!1)}}),[B,O,H,x]),Object(at.jsxs)("div",{className:u()("Preview",{"is-dragging":w,"is-loading":X,"is-loaded":x,"is-3d":F&&(null===P||void 0===P?void 0:P.camera)===l.PreviewCamera.INTERACTIVE,"has-error":!!z}),style:p,children:[Object(at.jsx)("img",{src:T,className:u()("thumbnail",{"is-visible":G}),alt:"preview"}),Object(at.jsx)("canvas",{id:"wearable-preview",className:u()({"is-visible":Z}),width:c,height:s,ref:S,onMouseDown:function(){return y(F&&!z)},onMouseUp:function(){return y(!1)}}),z&&Object(at.jsx)("div",{className:"error",children:z})]})},ot=n.a.memo(nt);c.a.render(Object(at.jsx)(n.a.StrictMode,{children:Object(at.jsx)(ot,{})}),document.getElementById("root"))}},[[382,1,2]]]);
|
|
2
|
-
//# sourceMappingURL=main.c54e91f9.chunk.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["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/babylon/scene.ts","lib/babylon/emotes.ts","lib/babylon/face.ts","lib/babylon/mappings.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","toWearable","base64","JSON","parse","atob","fetchWearables","fetchURLs","urls","promises","then","catch","all","filter","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","avatar","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","offsetX","offsetY","offsetZ","nonces","isValid","nonce","useOptions","useState","window","location","search","useMemo","params","URLSearchParams","autoRotateSpeedParam","get","offsetXParam","offsetYParam","offsetZParam","bodyShapeParam","has","getAll","reduce","selected","overrides","setOverrides","useEffect","previous","onmessage","event","PreviewMessageType","UPDATE","payload","useOverrides","useConfig","asyncFunction","deps","isLoading","setIsLoading","result","setResult","setError","message","finally","useAsync","createConfig","isCategory","isHidden","asset","hides","replaces","isSuccesful","isModel","isFacialFeature","getBodyShape","assets","part","hasSkin","hideUpperBody","hideLowerBody","hideFeet","hideHead","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","engine","createScene","canvas","dispose","Engine","preserveDrawingBuffer","stencil","antialias","root","Scene","autoClear","clearColor","Color4","preventDefaultOnPointerDown","ArcRotateCamera","Vector3","mode","Camera","PERSPECTIVE_CAMERA","STATIC","position","warn","attachControl","offset","addInPlace","setTarget","lowerRadiusLimit","upperRadiusLimit","radius","DirectionalLight","intensity","HemisphericLight","SpotLight","PI","runRenderLoop","render","loadMask","scene","file","reject","task","TextureAssetTask","onError","errorObject","onSuccess","texture","run","loadTexture","loadAssetContainer","load","extension","SceneLoader","LoadAssetContainerAsync","center","parent","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","process","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","hasAlpha","sideOrientation","Orientation","CW","diffuseTexture","diffuseColor","Black","emissiveTexture","emissiveColor","material","setupMappings","mappings","createMappings","OnPluginActivatedObservable","plugin","preprocessUrlAsync","parts","loadWearable","materials","pbr","albedoColor","FromHexString","alpha","removeMaterial","animationGroup","stop","promise","addAllToScene","Preview","previewError","setPreviewError","width","height","windowSize","setWindowSize","handleResize","innerWidth","innerHeight","addEventListener","removeEventListener","useWindowSize","style","setStyle","isDragging","setIsDragging","isLoadingModel","setIsLoadingModel","isLoaded","setIsLoaded","canvasRef","useRef","isLoadingConfig","configError","setImage","is3D","setIs3D","isMessageSent","setIsMessageSent","showImage","showCanvas","current","backgroundImage","opacity","sendMessage","LOAD","ERROR","shouldResetIsLoaded","className","classNames","src","alt","ref","onMouseDown","onMouseUp","React","ReactDOM","StrictMode","document","getElementById"],"mappings":"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","file":"static/js/main.c54e91f9.chunk.js","sourcesContent":["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 toWearable(base64: string): WearableDefinition {\n return JSON.parse(atob(base64))\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(urns: string[], urls: string[], base64s: string[], bodyShape: WearableBodyShape, env: PreviewEnv) {\n // fetch wearables from urns, urls and base64s\n let wearables = [...(await fetchURNs([bodyShape, ...urns], env)), ...(await fetchURLs(urls)), ...base64s.map(toWearable)]\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 = [...(profile ? profile.avatar.wearables : []), ...(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 === DEFAULT_PROFILE) {\n type = PreviewType.AVATAR\n wearables = await fetchAvatar(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\n return {\n wearable: wearable ?? undefined,\n wearables,\n bodyShape,\n skin,\n hair,\n eyes,\n type,\n background,\n emote,\n camera,\n autoRotateSpeed,\n offsetX: options.offsetX || 0,\n offsetY: options.offsetY || 0,\n offsetZ: options.offsetZ || 0,\n zoom: options.zoom || zoom,\n }\n}\n","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 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 autoRotateSpeed: autoRotateSpeedParam ? parseFloat(autoRotateSpeedParam) : null,\n offsetX: offsetXParam ? parseFloat(offsetXParam) : null,\n offsetY: offsetYParam ? parseFloat(offsetYParam) : null,\n offsetZ: offsetZParam ? parseFloat(offsetZParam) : null,\n zoom: parseZoom(params.get('zoom')),\n bodyShape: bodyShapeParam === 'female' ? WearableBodyShape.FEMALE : bodyShapeParam === 'male' ? WearableBodyShape.MALE : 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 { PreviewMessagePayload, PreviewMessageType, PreviewOptions } from '@dcl/schemas'\n\nexport const useOverrides = () => {\n const [overrides, setOverrides] = useState<PreviewOptions>({})\n\n // receive message from parent window to update options\n useEffect(() => {\n const previous = window.onmessage\n window.onmessage = function (event: MessageEvent) {\n if (\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 setOverrides(options)\n }\n }\n return () => {\n window.onmessage = previous\n }\n }, [])\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 === ('body_shape' as WearableCategory))\n\n if (!bodyShape) {\n throw new Error(`Could not find a bodyShape when trying to hide base body parts`)\n }\n\n // hide base body parts if necessary\n const hasSkin = assets.some((part) => part.wearable.data.category === WearableCategory.SKIN)\n const hideUpperBody = hasSkin || assets.some(isHidden(WearableCategory.UPPER_BODY))\n const hideLowerBody = hasSkin || assets.some(isHidden(WearableCategory.LOWER_BODY))\n const hideFeet = hasSkin || assets.some(isHidden(WearableCategory.FEET))\n const hideHead = hasSkin || assets.some(isHidden('head' as WearableCategory))\n\n for (const mesh of bodyShape.container.meshes) {\n const name = mesh.name.toLowerCase()\n if (name.endsWith('ubody_basemesh') && hideUpperBody) {\n mesh.setEnabled(false)\n }\n if (name.endsWith('lbody_basemesh') && hideLowerBody) {\n mesh.setEnabled(false)\n }\n if (name.endsWith('feet_basemesh') && hideFeet) {\n mesh.setEnabled(false)\n }\n if (name.endsWith('head') && hideHead) {\n mesh.setEnabled(false)\n }\n if (name.endsWith('head_basemesh') && hideHead) {\n mesh.setEnabled(false)\n }\n if (name.endsWith('mask_eyes') && hideHead) {\n mesh.setEnabled(false)\n }\n if (name.endsWith('mask_eyebrows') && hideHead) {\n mesh.setEnabled(false)\n }\n if (name.endsWith('mask_mouth') && hideHead) {\n mesh.setEnabled(false)\n }\n }\n\n return bodyShape\n}\n","import { 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('head' as WearableCategory)) {\n return false\n }\n if (replaces && replaces.includes('head' as WearableCategory)) {\n return false\n }\n }\n if (wearable.data.hides && wearable.data.hides.includes(category)) {\n return false\n }\n if (wearable.data.replaces && wearable.data.replaces.includes(category)) {\n return false\n }\n }\n return true\n })\n // add the equipped wearable at the end\n wearables.push(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","import {\n ArcRotateCamera,\n AssetContainer,\n BoundingInfo,\n Camera,\n Color4,\n DirectionalLight,\n Engine,\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 { getRepresentation } from '../representation'\nimport { startAutoRotateBehavior } from './camera'\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.preventDefaultOnPointerDown = false\n\n // Setup Camera\n var camera = new ArcRotateCamera('camera', 0, 0, 0, new Vector3(0, 0, 0), root)\n camera.mode = Camera.PERSPECTIVE_CAMERA\n switch (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 camera.lowerRadiusLimit = camera.upperRadiusLimit = camera.radius / config.zoom\n\n // Setup lights\n var directional = new DirectionalLight('directional', new Vector3(0, 0, 1), root)\n directional.intensity = 1\n var top = new HemisphericLight('top', new Vector3(0, -1, 0), root)\n top.intensity = 1\n var bottom = new HemisphericLight('bottom', new Vector3(0, 1, 0), root)\n bottom.intensity = 1\n var spot = new SpotLight('spot', new Vector3(-2, 2, 2), new Vector3(2, -2, -2), Math.PI / 2, 1000, root)\n spot.intensity = 1\n\n // render loop\n engine.runRenderLoop(() => root.render())\n\n return root\n}\n\nexport async function loadMask(scene: Scene, wearable: 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 var parent = new Mesh('parent', scene)\n for (const mesh of scene.meshes) {\n if (mesh !== parent) {\n mesh.setParent(parent)\n }\n }\n\n // resize and center\n refreshBoundingInfo(parent)\n const bounds = parent.getBoundingInfo().boundingBox.extendSize\n const size = bounds.length()\n const scale = new Vector3(1 / size, 1 / size, 1 / size)\n parent.scaling = scale\n const center = parent.getBoundingInfo().boundingBox.center.multiply(scale)\n parent.position.subtractInPlace(center)\n}\n","import { AnimationGroup, ArcRotateCamera, AssetContainer, Scene, TransformNode } from '@babylonjs/core'\nimport { 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 (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 }\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\nexport function shouldPlayEmote(config: PreviewConfig) {\n return config.emote\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 texture.hasAlpha = true\n newMaterial.sideOrientation = Orientation.CW\n newMaterial.diffuseTexture = texture\n newMaterial.diffuseColor = mask ? Color3.Black() : hexToColor(maskColor)\n if (mask) {\n newMaterial.emissiveTexture = mask\n newMaterial.emissiveColor = hexToColor(color)\n }\n mesh.material = newMaterial\n}\n","import { SceneLoader } from '@babylonjs/core'\nimport { GLTFFileLoader } from '@babylonjs/loaders'\nimport { 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","/**\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'\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 (let material of container.materials) {\n if (material.name.toLowerCase().includes('hair')) {\n if (hair) {\n const pbr = material as PBRMaterial\n pbr.albedoColor = Color3.FromHexString(hair)\n pbr.alpha = 1\n } else {\n material.alpha = 0\n scene.removeMaterial(material)\n }\n }\n if (material.name.toLowerCase().includes('skin')) {\n if (skin) {\n const pbr = material as PBRMaterial\n pbr.albedoColor = Color3.FromHexString(skin)\n pbr.alpha = 1\n } else {\n material.alpha = 0\n scene.removeMaterial(material)\n }\n }\n }\n\n // Stop any animations\n for (const animationGroup of container.animationGroups) {\n animationGroup.stop()\n animationGroup.reset()\n animationGroup.dispose()\n }\n\n return { container, wearable }\n}\n","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 // 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 // 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 center(root)\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],i=r[1],c=r[2],f=0,s=[];f<a.length;f++)u=a[f],Object.prototype.hasOwnProperty.call(o,u)&&o[u]&&s.push(o[u][0]),o[u]=0;for(n in i)Object.prototype.hasOwnProperty.call(i,n)&&(e[n]=i[n]);for(p&&p(r);s.length;)s.shift()();return l.push.apply(l,c||[]),t()}function t(){for(var e,r=0;r<l.length;r++){for(var t=l[r],n=!0,a=1;a<t.length;a++){var i=t[a];0!==o[i]&&(n=!1)}n&&(l.splice(r--,1),e=u(u.s=t[0]))}return e}var n={},o={1:0},l=[];function u(r){if(n[r])return n[r].exports;var t=n[r]={i:r,l:!1,exports:{}};return e[r].call(t.exports,t,t.exports,u),t.l=!0,t.exports}u.m=e,u.c=n,u.d=function(e,r,t){u.o(e,r)||Object.defineProperty(e,r,{enumerable:!0,get:t})},u.r=function(e){"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},u.t=function(e,r){if(1&r&&(e=u(e)),8&r)return e;if(4&r&&"object"===typeof e&&e&&e.__esModule)return e;var t=Object.create(null);if(u.r(t),Object.defineProperty(t,"default",{enumerable:!0,value:e}),2&r&&"string"!=typeof e)for(var n in e)u.d(t,n,function(r){return e[r]}.bind(null,n));return t},u.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return u.d(r,"a",r),r},u.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},u.p="https://cdn.decentraland.org/@dcl/wearable-preview/1.0.0-2203908270.commit-85bf374/";var a=this["webpackJsonp@dcl/wearable-preview"]=this["webpackJsonp@dcl/wearable-preview"]||[],i=a.push.bind(a);a.push=r,a=a.slice();for(var c=0;c<a.length;c++)r(a[c]);var p=i;t()}([]);
|
|
2
|
-
//# sourceMappingURL=runtime-main.284a3982.js.map
|