mirror of
https://github.com/exogen/t2-model-skinner.git
synced 2026-07-13 07:24:59 +00:00
Rebuild with Halloween skins in list
This commit is contained in:
parent
a53e7faf4f
commit
d7cf51a37f
23 changed files with 104 additions and 61 deletions
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
40
docs/_next/static/chunks/470-094a8f589946fc6b.js
Normal file
40
docs/_next/static/chunks/470-094a8f589946fc6b.js
Normal file
File diff suppressed because one or more lines are too long
1
docs/_next/static/chunks/470-094a8f589946fc6b.js.map
Normal file
1
docs/_next/static/chunks/470-094a8f589946fc6b.js.map
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
2
docs/_next/static/chunks/767.0dd6b240996f3455.js
Normal file
2
docs/_next/static/chunks/767.0dd6b240996f3455.js
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[767],{3162:function(t,n,o){var a,i;void 0!==(i="function"==typeof(a=function(){"use strict";function c(t,n,o){var a=new XMLHttpRequest;a.open("GET",t),a.responseType="blob",a.onload=function(){i(a.response,n,o)},a.onerror=function(){console.error("could not download file")},a.send()}function d(t){var n=new XMLHttpRequest;n.open("HEAD",t,!1);try{n.send()}catch(t){}return 200<=n.status&&299>=n.status}function e(t){try{t.dispatchEvent(new MouseEvent("click"))}catch(o){var n=document.createEvent("MouseEvents");n.initMouseEvent("click",!0,!0,window,0,0,0,80,20,!1,!1,!1,!1,0,null),t.dispatchEvent(n)}}var n="object"==typeof window&&window.window===window?window:"object"==typeof self&&self.self===self?self:"object"==typeof o.g&&o.g.global===o.g?o.g:void 0,a=n.navigator&&/Macintosh/.test(navigator.userAgent)&&/AppleWebKit/.test(navigator.userAgent)&&!/Safari/.test(navigator.userAgent),i=n.saveAs||("object"!=typeof window||window!==n?function(){}:"download"in HTMLAnchorElement.prototype&&!a?function(t,o,a){var i=n.URL||n.webkitURL,r=document.createElement("a");o=o||t.name||"download",r.download=o,r.rel="noopener","string"==typeof t?(r.href=t,r.origin===location.origin?e(r):d(r.href)?c(t,o,a):e(r,r.target="_blank")):(r.href=i.createObjectURL(t),setTimeout(function(){i.revokeObjectURL(r.href)},4e4),setTimeout(function(){e(r)},0))}:"msSaveOrOpenBlob"in navigator?function(t,n,o){if(n=n||t.name||"download","string"!=typeof t){var a;navigator.msSaveOrOpenBlob((void 0===(a=o)?a={autoBom:!1}:"object"!=typeof a&&(console.warn("Deprecated: Expected third argument to be a object"),a={autoBom:!a}),a.autoBom&&/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(t.type)?new Blob(["\uFEFF",t],{type:t.type}):t),n)}else if(d(t))c(t,n,o);else{var i=document.createElement("a");i.href=t,i.target="_blank",setTimeout(function(){e(i)})}}:function(t,o,i,r){if((r=r||open("","_blank"))&&(r.document.title=r.document.body.innerText="downloading..."),"string"==typeof t)return c(t,o,i);var s="application/octet-stream"===t.type,l=/constructor/i.test(n.HTMLElement)||n.safari,u=/CriOS\/[\d]+/.test(navigator.userAgent);if((u||s&&l||a)&&"undefined"!=typeof FileReader){var f=new FileReader;f.onloadend=function(){var t=f.result;t=u?t:t.replace(/^data:[^;]*;/,"data:attachment/file;"),r?r.location.href=t:location=t,r=null},f.readAsDataURL(t)}else{var p=n.URL||n.webkitURL,v=p.createObjectURL(t);r?r.location=v:location.href=v,r=null,setTimeout(function(){p.revokeObjectURL(v)},4e4)}});n.saveAs=i.saveAs=i,t.exports=i})?a.apply(n,[]):a)&&(t.exports=i)},767:function(t,n,o){"use strict";o.d(n,{createZipFile:function(){return createZipFile},savePngFile:function(){return savePngFile},saveZipFile:function(){return saveZipFile}});var a=o(5733),i=o.n(a),r=o(3162);function createZipFile(t){let n=new(i());for(let o of t)n.file("textures/skins/".concat(o.name),o.data);return n}async function saveZipFile(t,n){let o=await t.generateAsync({type:"blob"});(0,r.saveAs)(o,n)}function savePngFile(t,n){(0,r.saveAs)(t,n)}}}]);
|
||||
//# sourceMappingURL=767.0dd6b240996f3455.js.map
|
||||
1
docs/_next/static/chunks/767.0dd6b240996f3455.js.map
Normal file
1
docs/_next/static/chunks/767.0dd6b240996f3455.js.map
Normal file
File diff suppressed because one or more lines are too long
|
|
@ -1,2 +0,0 @@
|
|||
"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[767],{767:function(e,n,i){i.d(n,{createZipFile:function(){return createZipFile},savePngFile:function(){return savePngFile},saveZipFile:function(){return saveZipFile}});var t=i(5733),a=i.n(t),s=i(3162);function createZipFile(e){let n=new(a());for(let i of e)n.file("textures/skins/".concat(i.name),i.data);return n}async function saveZipFile(e,n){let i=await e.generateAsync({type:"blob"});(0,s.saveAs)(i,n)}function savePngFile(e,n){(0,s.saveAs)(e,n)}}}]);
|
||||
//# sourceMappingURL=767.5a1b83173dac696e.js.map
|
||||
|
|
@ -1 +0,0 @@
|
|||
{"version":3,"file":"static/chunks/767.5a1b83173dac696e.js","mappings":"+QAGO,SAASA,cACdC,CAAiD,EAEjD,IAAMC,EAAM,GAAIC,CAAAA,GAAAA,EAChB,IAAK,IAAMC,KAAQH,EACjBC,EAAIE,IAAI,CAAC,kBAA4BC,MAAA,CAAVD,EAAKE,IAAI,EAAIF,EAAKG,IAAI,EAEnD,OAAOL,CACT,CAEO,eAAeM,YAAYN,CAAU,CAAEI,CAAY,EACxD,IAAMG,EAAO,MAAMP,EAAIQ,aAAa,CAAC,CAAEC,KAAM,MAAO,GACpDC,CAAAA,EAAAA,EAAAA,MAAAA,EAAOH,EAAMH,EACf,CAEO,SAASO,YAAYC,CAAgB,CAAER,CAAY,EACxDM,CAAAA,EAAAA,EAAAA,MAAAA,EAAOE,EAAUR,EACnB","sources":["webpack://_N_E/./src/exportUtils.ts","webpack://_N_E/<anon>"],"sourcesContent":["import JSZip from \"jszip\";\nimport { saveAs } from \"file-saver\";\n\nexport function createZipFile(\n files: Array<{ name: string; data: ArrayBuffer }>\n) {\n const zip = new JSZip();\n for (const file of files) {\n zip.file(`textures/skins/${file.name}`, file.data);\n }\n return zip;\n}\n\nexport async function saveZipFile(zip: JSZip, name: string) {\n const blob = await zip.generateAsync({ type: \"blob\" });\n saveAs(blob, name);\n}\n\nexport function savePngFile(imageUrl: string, name: string) {\n saveAs(imageUrl, name);\n}\n"],"names":["createZipFile","files","zip","JSZip","file","concat","name","data","saveZipFile","blob","generateAsync","type","saveAs","savePngFile","imageUrl"],"sourceRoot":""}
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
2
docs/_next/static/chunks/pages/index-e4bee972682e54f9.js
Normal file
2
docs/_next/static/chunks/pages/index-e4bee972682e54f9.js
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
|
@ -1,2 +0,0 @@
|
|||
!function(){"use strict";var e,r,_,t,n,i,u,c={},o={};function __webpack_require__(e){var r=o[e];if(void 0!==r)return r.exports;var _=o[e]={exports:{}},t=!0;try{c[e].call(_.exports,_,_.exports,__webpack_require__),t=!1}finally{t&&delete o[e]}return _.exports}__webpack_require__.m=c,e=[],__webpack_require__.O=function(r,_,t,n){if(_){n=n||0;for(var i=e.length;i>0&&e[i-1][2]>n;i--)e[i]=e[i-1];e[i]=[_,t,n];return}for(var u=1/0,i=0;i<e.length;i++){for(var _=e[i][0],t=e[i][1],n=e[i][2],c=!0,o=0;o<_.length;o++)u>=n&&Object.keys(__webpack_require__.O).every(function(e){return __webpack_require__.O[e](_[o])})?_.splice(o--,1):(c=!1,n<u&&(u=n));if(c){e.splice(i--,1);var a=t()}}return a},__webpack_require__.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return __webpack_require__.d(r,{a:r}),r},__webpack_require__.d=function(e,r){for(var _ in r)__webpack_require__.o(r,_)&&!__webpack_require__.o(e,_)&&Object.defineProperty(e,_,{enumerable:!0,get:r[_]})},__webpack_require__.f={},__webpack_require__.e=function(e){return Promise.all(Object.keys(__webpack_require__.f).reduce(function(r,_){return __webpack_require__.f[_](e,r),r},[]))},__webpack_require__.u=function(e){return"static/chunks/"+(737===e?"fb7d5399":e)+"."+({250:"10c119307e239c98",354:"c8f476539d33c65e",737:"bc4a70b34221e8c8",767:"5a1b83173dac696e",848:"fc0fe21cdc2e6431"})[e]+".js"},__webpack_require__.miniCssF=function(e){return"static/css/481d64a53a5033ec.css"},__webpack_require__.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||Function("return this")()}catch(e){if("object"==typeof window)return window}}(),__webpack_require__.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},r={},_="_N_E:",__webpack_require__.l=function(e,t,n,i){if(r[e]){r[e].push(t);return}if(void 0!==n)for(var u,c,o=document.getElementsByTagName("script"),a=0;a<o.length;a++){var p=o[a];if(p.getAttribute("src")==e||p.getAttribute("data-webpack")==_+n){u=p;break}}u||(c=!0,(u=document.createElement("script")).charset="utf-8",u.timeout=120,__webpack_require__.nc&&u.setAttribute("nonce",__webpack_require__.nc),u.setAttribute("data-webpack",_+n),u.src=__webpack_require__.tu(e)),r[e]=[t];var onScriptComplete=function(_,t){u.onerror=u.onload=null,clearTimeout(b);var n=r[e];if(delete r[e],u.parentNode&&u.parentNode.removeChild(u),n&&n.forEach(function(e){return e(t)}),_)return _(t)},b=setTimeout(onScriptComplete.bind(null,void 0,{type:"timeout",target:u}),12e4);u.onerror=onScriptComplete.bind(null,u.onerror),u.onload=onScriptComplete.bind(null,u.onload),c&&document.head.appendChild(u)},__webpack_require__.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},__webpack_require__.tt=function(){return void 0===t&&(t={createScriptURL:function(e){return e}},"undefined"!=typeof trustedTypes&&trustedTypes.createPolicy&&(t=trustedTypes.createPolicy("nextjs#bundler",t))),t},__webpack_require__.tu=function(e){return __webpack_require__.tt().createScriptURL(e)},__webpack_require__.p="/t2-model-skinner/_next/",n={272:0},__webpack_require__.f.j=function(e,r){var _=__webpack_require__.o(n,e)?n[e]:void 0;if(0!==_){if(_)r.push(_[2]);else if(272!=e){var t=new Promise(function(r,t){_=n[e]=[r,t]});r.push(_[2]=t);var i=__webpack_require__.p+__webpack_require__.u(e),u=Error();__webpack_require__.l(i,function(r){if(__webpack_require__.o(n,e)&&(0!==(_=n[e])&&(n[e]=void 0),_)){var t=r&&("load"===r.type?"missing":r.type),i=r&&r.target&&r.target.src;u.message="Loading chunk "+e+" failed.\n("+t+": "+i+")",u.name="ChunkLoadError",u.type=t,u.request=i,_[1](u)}},"chunk-"+e,e)}else n[e]=0}},__webpack_require__.O.j=function(e){return 0===n[e]},i=function(e,r){var _,t,i=r[0],u=r[1],c=r[2],o=0;if(i.some(function(e){return 0!==n[e]})){for(_ in u)__webpack_require__.o(u,_)&&(__webpack_require__.m[_]=u[_]);if(c)var a=c(__webpack_require__)}for(e&&e(r);o<i.length;o++)t=i[o],__webpack_require__.o(n,t)&&n[t]&&n[t][0](),n[t]=0;return __webpack_require__.O(a)},(u=self.webpackChunk_N_E=self.webpackChunk_N_E||[]).forEach(i.bind(null,0)),u.push=i.bind(null,u.push.bind(u))}();
|
||||
//# sourceMappingURL=webpack-3ea3efe6e241ba4e.js.map
|
||||
2
docs/_next/static/chunks/webpack-51b12156dbf89258.js
Normal file
2
docs/_next/static/chunks/webpack-51b12156dbf89258.js
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
!function(){"use strict";var e,r,_,t,n,i,u,c={},o={};function __webpack_require__(e){var r=o[e];if(void 0!==r)return r.exports;var _=o[e]={exports:{}},t=!0;try{c[e].call(_.exports,_,_.exports,__webpack_require__),t=!1}finally{t&&delete o[e]}return _.exports}__webpack_require__.m=c,e=[],__webpack_require__.O=function(r,_,t,n){if(_){n=n||0;for(var i=e.length;i>0&&e[i-1][2]>n;i--)e[i]=e[i-1];e[i]=[_,t,n];return}for(var u=1/0,i=0;i<e.length;i++){for(var _=e[i][0],t=e[i][1],n=e[i][2],c=!0,o=0;o<_.length;o++)u>=n&&Object.keys(__webpack_require__.O).every(function(e){return __webpack_require__.O[e](_[o])})?_.splice(o--,1):(c=!1,n<u&&(u=n));if(c){e.splice(i--,1);var a=t()}}return a},__webpack_require__.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return __webpack_require__.d(r,{a:r}),r},__webpack_require__.d=function(e,r){for(var _ in r)__webpack_require__.o(r,_)&&!__webpack_require__.o(e,_)&&Object.defineProperty(e,_,{enumerable:!0,get:r[_]})},__webpack_require__.f={},__webpack_require__.e=function(e){return Promise.all(Object.keys(__webpack_require__.f).reduce(function(r,_){return __webpack_require__.f[_](e,r),r},[]))},__webpack_require__.u=function(e){return"static/chunks/"+(737===e?"fb7d5399":e)+"."+({250:"10c119307e239c98",737:"bc4a70b34221e8c8",767:"0dd6b240996f3455",848:"fc0fe21cdc2e6431"})[e]+".js"},__webpack_require__.miniCssF=function(e){return"static/css/481d64a53a5033ec.css"},__webpack_require__.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||Function("return this")()}catch(e){if("object"==typeof window)return window}}(),__webpack_require__.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},r={},_="_N_E:",__webpack_require__.l=function(e,t,n,i){if(r[e]){r[e].push(t);return}if(void 0!==n)for(var u,c,o=document.getElementsByTagName("script"),a=0;a<o.length;a++){var p=o[a];if(p.getAttribute("src")==e||p.getAttribute("data-webpack")==_+n){u=p;break}}u||(c=!0,(u=document.createElement("script")).charset="utf-8",u.timeout=120,__webpack_require__.nc&&u.setAttribute("nonce",__webpack_require__.nc),u.setAttribute("data-webpack",_+n),u.src=__webpack_require__.tu(e)),r[e]=[t];var onScriptComplete=function(_,t){u.onerror=u.onload=null,clearTimeout(b);var n=r[e];if(delete r[e],u.parentNode&&u.parentNode.removeChild(u),n&&n.forEach(function(e){return e(t)}),_)return _(t)},b=setTimeout(onScriptComplete.bind(null,void 0,{type:"timeout",target:u}),12e4);u.onerror=onScriptComplete.bind(null,u.onerror),u.onload=onScriptComplete.bind(null,u.onload),c&&document.head.appendChild(u)},__webpack_require__.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},__webpack_require__.tt=function(){return void 0===t&&(t={createScriptURL:function(e){return e}},"undefined"!=typeof trustedTypes&&trustedTypes.createPolicy&&(t=trustedTypes.createPolicy("nextjs#bundler",t))),t},__webpack_require__.tu=function(e){return __webpack_require__.tt().createScriptURL(e)},__webpack_require__.p="/t2-model-skinner/_next/",n={272:0},__webpack_require__.f.j=function(e,r){var _=__webpack_require__.o(n,e)?n[e]:void 0;if(0!==_){if(_)r.push(_[2]);else if(272!=e){var t=new Promise(function(r,t){_=n[e]=[r,t]});r.push(_[2]=t);var i=__webpack_require__.p+__webpack_require__.u(e),u=Error();__webpack_require__.l(i,function(r){if(__webpack_require__.o(n,e)&&(0!==(_=n[e])&&(n[e]=void 0),_)){var t=r&&("load"===r.type?"missing":r.type),i=r&&r.target&&r.target.src;u.message="Loading chunk "+e+" failed.\n("+t+": "+i+")",u.name="ChunkLoadError",u.type=t,u.request=i,_[1](u)}},"chunk-"+e,e)}else n[e]=0}},__webpack_require__.O.j=function(e){return 0===n[e]},i=function(e,r){var _,t,i=r[0],u=r[1],c=r[2],o=0;if(i.some(function(e){return 0!==n[e]})){for(_ in u)__webpack_require__.o(u,_)&&(__webpack_require__.m[_]=u[_]);if(c)var a=c(__webpack_require__)}for(e&&e(r);o<i.length;o++)t=i[o],__webpack_require__.o(n,t)&&n[t]&&n[t][0](),n[t]=0;return __webpack_require__.O(a)},(u=self.webpackChunk_N_E=self.webpackChunk_N_E||[]).forEach(i.bind(null,0)),u.push=i.bind(null,u.push.bind(u))}();
|
||||
//# sourceMappingURL=webpack-51b12156dbf89258.js.map
|
||||
File diff suppressed because one or more lines are too long
|
|
@ -1 +1 @@
|
|||
self.__BUILD_MANIFEST={__rewrites:{afterFiles:[],beforeFiles:[],fallback:[]},"/":["static/chunks/78e521c3-3739cc27b3254d35.js","static/chunks/95b64a6e-a0ff77d56afeed48.js","static/chunks/31664189-69d752d1129a4958.js","static/chunks/545f34e4-3e66c340444ca8b2.js","static/chunks/1bfc9850-b4ceccea4b74407c.js","static/chunks/d7eeaac4-d223ea230e13423c.js","static/chunks/f580fadb-2911e2fbf64aae5a.js","static/chunks/50-a8a6240a880bd3e0.js","static/chunks/pages/index-24e06461362afe89.js"],"/_error":["static/chunks/pages/_error-54b9fcf45cb5bc62.js"],sortedPages:["/","/_app","/_error"]},self.__BUILD_MANIFEST_CB&&self.__BUILD_MANIFEST_CB();
|
||||
self.__BUILD_MANIFEST={__rewrites:{afterFiles:[],beforeFiles:[],fallback:[]},"/":["static/chunks/78e521c3-3739cc27b3254d35.js","static/chunks/95b64a6e-a0ff77d56afeed48.js","static/chunks/31664189-69d752d1129a4958.js","static/chunks/545f34e4-3e66c340444ca8b2.js","static/chunks/1bfc9850-b4ceccea4b74407c.js","static/chunks/d7eeaac4-d223ea230e13423c.js","static/chunks/f580fadb-2911e2fbf64aae5a.js","static/chunks/470-094a8f589946fc6b.js","static/chunks/pages/index-e4bee972682e54f9.js"],"/_error":["static/chunks/pages/_error-54b9fcf45cb5bc62.js"],sortedPages:["/","/_app","/_error"]},self.__BUILD_MANIFEST_CB&&self.__BUILD_MANIFEST_CB();
|
||||
File diff suppressed because one or more lines are too long
|
|
@ -3,6 +3,7 @@ import useWarrior from "./useWarrior";
|
|||
import { AiTwotoneFolderOpen } from "react-icons/ai";
|
||||
import { useRef } from "react";
|
||||
import useTools from "./useTools";
|
||||
import { detectFileType } from "./importUtils";
|
||||
|
||||
const { publicRuntimeConfig } = getConfig();
|
||||
const { defaultSkins, customSkins, modelDefaults, materials } =
|
||||
|
|
@ -173,11 +174,24 @@ export default function WarriorSelector() {
|
|||
const imageUrl = await new Promise<string>((resolve, reject) => {
|
||||
const inputFile = event.target.files?.[0];
|
||||
if (inputFile) {
|
||||
const reader = new FileReader();
|
||||
reader.addEventListener("load", (event) => {
|
||||
resolve(event.target?.result as string);
|
||||
});
|
||||
reader.readAsDataURL(inputFile);
|
||||
const fileType = detectFileType(inputFile);
|
||||
switch (fileType) {
|
||||
case "png": {
|
||||
const reader = new FileReader();
|
||||
reader.addEventListener("load", (event) => {
|
||||
resolve(event.target?.result as string);
|
||||
});
|
||||
reader.readAsDataURL(inputFile);
|
||||
break;
|
||||
}
|
||||
// case "zip":
|
||||
// case "vl2": {
|
||||
// const skins = await readZipFile(inputFile);
|
||||
// if (skins.length) {
|
||||
// resolve(skins[0].imageUrl);
|
||||
// }
|
||||
// }
|
||||
}
|
||||
} else {
|
||||
reject(new Error("No input file provided."));
|
||||
}
|
||||
|
|
@ -188,6 +202,7 @@ export default function WarriorSelector() {
|
|||
});
|
||||
}}
|
||||
type="file"
|
||||
// accept=".png, image/png, .vl2, .zip, application/zip, application/zip-compressed"
|
||||
accept=".png, image/png"
|
||||
hidden
|
||||
/>
|
||||
|
|
|
|||
31
src/importUtils.ts
Normal file
31
src/importUtils.ts
Normal file
|
|
@ -0,0 +1,31 @@
|
|||
import JSZip from "jszip";
|
||||
|
||||
export async function readZipFile(inputFile: File) {
|
||||
const content = await JSZip.loadAsync(inputFile);
|
||||
const skins = await Promise.all(
|
||||
Object.entries(content.files).map(async ([path, file]) => {
|
||||
const match = /([^/]+)\.([lmh](?:male|female|bioderm))\.png$/g.exec(path);
|
||||
if (match) {
|
||||
const base64string = await file.async("base64");
|
||||
return {
|
||||
name: match[1],
|
||||
model: match[2],
|
||||
imageUrl: `data:image/png;base64,${base64string}`,
|
||||
};
|
||||
}
|
||||
})
|
||||
);
|
||||
return skins.filter(Boolean);
|
||||
}
|
||||
|
||||
export function detectFileType(file: File) {
|
||||
if (file.name.match(/\.png$/i)) {
|
||||
return "png";
|
||||
} else if (file.name.match(/\.zip$/i)) {
|
||||
return "zip";
|
||||
} else if (file.name.match(/\.vl2$/i)) {
|
||||
return "vl2";
|
||||
}
|
||||
}
|
||||
|
||||
export function nameToMaterial(filename: string) {}
|
||||
Loading…
Add table
Add a link
Reference in a new issue