@kite3d/engine 0.18.0 → 0.19.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/authoring.d.ts +1 -1
- package/dist/authoring.js +7 -7
- package/dist/authoring.js.map +1 -1
- package/dist/authoringValidation.d.ts +2 -5
- package/dist/authoringValidation.js +266 -289
- package/dist/authoringValidation.js.map +1 -1
- package/dist/index.d.ts +0 -2
- package/dist/index.js +1145 -1440
- package/dist/index.js.map +1 -1
- package/dist/projectFormat.js +70 -81
- package/dist/projectFormat.js.map +1 -1
- package/dist/runtime/createGame.d.ts +1 -1
- package/dist/runtime/index.d.ts +0 -2
- package/dist/runtime/projectFormat.d.ts +7 -14
- package/dist/runtime.js +14086 -15497
- package/dist/runtime.js.map +1 -1
- package/dist/sceneSerialization.js +57 -52
- package/dist/sceneSerialization.js.map +1 -1
- package/dist/version.js +1 -1
- package/package.json +4 -4
- package/src/authoring.ts +3 -3
- package/src/authoringValidation.ts +3 -40
- package/src/index.ts +0 -2
- package/src/runtime/createGame.ts +1 -5
- package/src/runtime/index.ts +0 -2
- package/src/runtime/projectFormat.ts +20 -47
- package/src/sceneSerialization.ts +10 -2
- package/dist/generatorParams.d.ts +0 -23
- package/dist/plugins/GeneratorComponent.d.ts +0 -44
- package/src/generatorParams.ts +0 -182
- package/src/plugins/GeneratorComponent.ts +0 -287
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../node_modules/meshoptimizer/meshopt_encoder.module.js","../node_modules/meshoptimizer/meshopt_decoder.module.js","../node_modules/meshoptimizer/meshopt_simplifier.module.js","../src/scripts.ts","../src/plugins/HtmlUiComponent.ts","../src/generatorParams.ts","../src/plugins/GeneratorComponent.ts","../src/plugins/cannon/utils.ts","../src/plugins/cannon/threeToCannon.ts","../src/plugins/cannon/Cannon3DBodyComponent.ts","../src/plugins/cannon/helper.ts","../src/plugins/cannon/Cannon3DShapeComponent.ts","../src/plugins/cannon/CannonRagdollComponent.ts","../src/plugins/cannon/CannonPhysicsPlugin.ts","../src/runtime/nestedAssets.ts","../src/runtime/createGame.ts","../src/defaults.ts"],"sourcesContent":["// This file is part of meshoptimizer library and is distributed under the terms of MIT License.\n// Copyright (C) 2016-2023, by Arseny Kapoulkine (arseny.kapoulkine@gmail.com)\nvar MeshoptEncoder = (function() {\n\t// Built with clang version 16.0.0\n\t// Built from meshoptimizer 0.20\n\tvar wasm = \"b9H79TebbbeJq9Geueu9Geub9Gbb9Gvuuuuueu9Gduueu9Gluuuueu9Gvuuuuub9Gouuuuuub9Gluuuub9GiuuueuiKLdilevlevlooroowwvwbDDbelve9Weiiviebeoweuec:W;kekr;RiOo9TW9T9VV95dbH9F9F939H79T9F9J9H229F9Jt9VV7bb8A9TW79O9V9Wt9FW9U9J9V9KW9wWVtW949c919M9MWVbe8F9TW79O9V9Wt9FW9U9J9V9KW9wWVtW949c919M9MWV9c9V919U9KbdE9TW79O9V9Wt9FW9U9J9V9KW9wWVtW949wWV79P9V9UbiY9TW79O9V9Wt9FW9U9J9V9KW69U9KW949c919M9MWVbl8E9TW79O9V9Wt9FW9U9J9V9KW69U9KW949c919M9MWV9c9V919U9Kbv8A9TW79O9V9Wt9FW9U9J9V9KW69U9KW949wWV79P9V9UboE9TW79O9V9Wt9FW9U9J9V9KW69U9KW949tWG91W9U9JWbra9TW79O9V9Wt9FW9U9J9V9KW69U9KW949tWG91W9U9JW9c9V919U9KbwL9TW79O9V9Wt9FW9U9J9V9KWS9P2tWV9p9JtbDK9TW79O9V9Wt9FW9U9J9V9KWS9P2tWV9r919HtbqL9TW79O9V9Wt9FW9U9J9V9KWS9P2tWVT949WbkE9TW79O9V9Wt9F9V9Wt9P9T9P96W9wWVtW94J9H9J9OWbPa9TW79O9V9Wt9F9V9Wt9P9T9P96W9wWVtW94J9H9J9OW9ttV9P9Wbsa9TW79O9V9Wt9F9V9Wt9P9T9P96W9wWVtW94SWt9J9O9sW9T9H9WbzK9TW79O9V9Wt9F79W9Ht9P9H29t9VVt9sW9T9H9WbHl79IV9RbODwebcekdQXq:g9sLdbk;3keYu8Jjjjjbcjo9Rgv8Kjjjjbcbhodnalcefae0mbabcbRb:S:kjjbc:GeV86bbavcjdfcbcjdzNjjjb8AdnaiTmbavcjdfadalz:tjjjb8Akabaefhrabcefhwavalfcbcbcjdal9RalcFe0EzNjjjb8Aavavcjdfalz:tjjjbhDcj;abal9UhodndndndndnalTmbaoc;WFbGgecjdaecjd6Ehqcbhkdninakai9pmiaDcjlfcbcjdzNjjjb8Aaqaiak9Rakaqfai6Egxcsfgecl4cifcd4hmadakal2fhPdndndndndnaec9WGgsTmbcbhzcehHaPhOawhAxekdnaxTmbcbhAcehHaPhCinaDaAfRbbhXaDcjlfheaChoaxhQinaeaoRbbgLaX9RgXcetaX;acr4786bbaoalfhoaecefheaLhXaQcufgQmbkaraw9Ram6miawcbamzNjjjbgeTmiaCcefhCaeamfhwaAcefgAal6hHaAal9hmbxvkkaraw9Ram6mvawcbamzNjjjb8AceheinawgXamfhwalaegoSmldnaraw9Ram6mbaocefheawcbamzNjjjb8AaXmekkaoal6hHxekindnaxTmbaDazfRbbhXaDcjlfheaOhoaxhQinaeaoRbbgLaX9RgXcetaX;acr4786bbaoalfhoaecefheaLhXaQcufgQmbkkaraA9Ram6mearaAcbamzNjjjbgKamfgw9RcK6mdcbhYaDcjlfhAinaDcjlfaYfh8AcwhCczhLcehQindndnaQce9hmbcuhoa8ARbbmecbhodninaogecsSmeaecefhoaAaefcefRbbTmbkkcucbaecs6EhoxekaQcetc;:FFFeGhocuaQtcu7cFeGhXcbheinaoaXaAaefRbb9nfhoaecefgecz9hmbkkaoaLaoaL6geEhLaQaCaeEhCaQcetgQcw6mbkdndndndnaCcufPdiebkaKaYco4fgeaeRbbcdciaCclSEaYci4coGtV86bbaCcw9hmeawa8A8Pbb83bbawcwfa8Acwf8Pbb83bbawczfhwxdkaKaYco4fgeaeRbbceaYci4coGtV86bbkdncwaC9TgEmbinawcb86bbawcefhwxbkkcuaCtcu7h8Acbh3aAh5ina5heaEhQcbhoinaeRbbgLa8AcFeGgXaLaX6EaoaCtVhoaecefheaQcufgQmbkawao86bba5aEfh5awcefhwa3aEfg3cz6mbkcbheindnaAaefRbbgoaX6mbawao86bbawcefhwkaecefgecz9hmbkkdnaYczfgYas9pmbaAczfhAaraw9RcL0mekkaYas6meawTmeaOcefhOazcefgzal6hHawhAazalSmixbkkcbhwaHceGTmexikcbhwaHceGmdkaDaPaxcufal2falz:tjjjb8AaxakfhkawmbkcbhoxokcbhoxvkaiTmekcbhoaraw9Ralcaalca0E6mialc8F9nmexdkcbhoaecufca6mdkawcbcaal9RgezNjjjbaefhwkawaDcjdfalz:tjjjbalfab9Rhokavcjof8Kjjjjbaok9heeuaecaaeca0Eabcj;abae9Uc;WFbGgdcjdadcjd6Egdfcufad9Uae2adcl4cifcd4adV2fcefkmbcbabBd:S:kjjbk;rse3u8Jjjjjbc;ae9Rgl8Kjjjjbcbhvdnaici9UgocHfae0mbabcbyd:C:kjjbgrc;GeV86bbalc;abfcFecjezNjjjb8AalcUfgw9cu83ibalc8WfgD9cu83ibalcyfgq9cu83ibalcafgk9cu83ibalcKfgx9cu83ibalczfgm9cu83ibal9cu83iwal9cu83ibabaefc9WfhPabcefgsaofhednaiTmbcmcsarcb9kgzEhHcbhOcbhAcbhCcbhXcbhQindnaeaP9nmbcbhvxikaQcufhvadaCcdtfgoydbhLaocwfydbhKaoclfydbhYcbh8Adndninalc;abfavcsGcitfgoydlhEdndndnaoydbgoaL9hmbaEaYSmekdnaoaY9hmbaEaK9hmba8Acefh8AxekaoaK9hmeaEaL9hmea8Acdfh8Aka8Ac870mdaXcufhvada8AciGcx2goc:y1jjbfydbaCfcdtfydbhEadaocN1jjbfydbaCfcdtfydbhKadaoc:q1jjbfydbaCfcdtfydbhLcbhodnindnalavcsGcdtfydbaE9hmbaohYxdkcuhYavcufhvaocefgocz9hmbkkaEaOSgvaYce9iaYaH9oVgoGh3dndndndndncbcsavEaYaoEgvcs9hmbarce9imbaEaEaAaEcefaASgvEgAcefSmecmcsavEhvkasava8Acdtc;WeGV86bbavcs9hmeaEaA9Rgvcetavc8F917hvinaeavcFb0crtavcFbGV86bbaecefheavcje6hoavcr4hvaoTmbkaEhAxdkcPhvasa8AcdtcPV86bbaEhAkavTmbavaH9imekalaXcdtfaEBdbaXcefcsGhXkaOa3fhOalc;abfaQcitfgvaKBdlavaEBdbalc;abfaQcefcsGgvcitfgoaEBdlaoaLBdbavcefhoxikavcufhva8Aclfg8Ac;ab9hmbkkdnadceaKaOScetaYaOSEcx2gvc:q1jjbfydbaCfcdtfydbgLTadavcN1jjbfydbaCfcdtfydbg8AceSGadavc:y1jjbfydbaCfcdtfydbgYcdSGaOcb9hGazGg5ce9hmbaw9cu83ibaD9cu83ibaq9cu83ibak9cu83ibax9cu83ibam9cu83ibal9cu83iwal9cu83ibcbhOkcbhEaXcufgvhodnindnalaocsGcdtfydba8A9hmbaEhKxdkcuhKaocufhoaEcefgEcz9hmbkkcbhodnindnalavcsGcdtfydbaY9hmbaohExdkcuhEavcufhvaocefgocz9hmbkkaOaLaOSg8Efh3dndnaKcm0mbaKcefhKxekcbcsa8Aa3SgvEhKa3avfh3kdndnaEcm0mbaEcefhExekcbcsaYa3SgvEhEa3avfh3kc9:cua8EEh8FaEaKcltVhocbhvdndndninavcj1jjbfRbbaocFeGSmeavcefgvcz9hmbxdkka5aLaO9havcm0VVmbasavc;WeV86bbxekasa8F86bbaeao86bbaecefhekdna8EmbaLaA9Rgvcetavc8F917hvinaeavcFb0gocrtavcFbGV86bbavcr4hvaecefheaombkaLhAkdnaKcs9hmba8AaA9Rgvcetavc8F917hvinaeavcFb0gocrtavcFbGV86bbavcr4hvaecefheaombka8AhAkdnaEcs9hmbaYaA9Rgvcetavc8F917hvinaeavcFb0gocrtavcFbGV86bbavcr4hvaecefheaombkaYhAkalaXcdtfaLBdbaXcefcsGhvdndnaKPzbeeeeeeeeeeeeeebekalavcdtfa8ABdbaXcdfcsGhvkdndnaEPzbeeeeeeeeeeeeeebekalavcdtfaYBdbavcefcsGhvkalc;abfaQcitfgoaLBdlaoa8ABdbalc;abfaQcefcsGcitfgoa8ABdlaoaYBdbalc;abfaQcdfcsGcitfgoaYBdlaoaLBdbaQcifhoavhXa3hOkascefhsaocsGhQaCcifgCai6mbkkcbhvaeaP0mbcbhvinaeavfavcj1jjbfRbb86bbavcefgvcz9hmbkaeab9Ravfhvkalc;aef8KjjjjbavkZeeucbhddninadcefgdc8F0meceadtae6mbkkadcrfcFeGcr9Uci2cdfabci9U2cHfkmbcbabBd:C:kjjbk:ydewu8Jjjjjbcz9Rhlcbhvdnaicvfae0mbcbhvabcbRb:C:kjjbc;qeV86bbal9cb83iwabcefhoabaefc98fhrdnaiTmbcbhwcbhDindnaoar6mbcbskadaDcdtfydbgqalcwfawaqav9Rgvavc8F91gv7av9Rc507gwcdtfgkydb9Rgvc8E91c9:Gavcdt7awVhvinaoavcFb0gecrtavcFbGV86bbavcr4hvaocefhoaembkakaqBdbaqhvaDcefgDai9hmbkkcbhvaoar0mbaocbBbbaoab9RclfhvkavkBeeucbhddninadcefgdc8F0meceadtae6mbkkadcwfcFeGcr9Uab2cvfk:dvli99dui99ludnaeTmbcuadcetcuftcu7:Yhvdndncuaicuftcu7:YgoJbbbZMgr:lJbbb9p9DTmbar:Ohwxekcjjjj94hwkcbhicbhDinalclfIdbgrJbbbbJbbjZalIdbgq:lar:lMalcwfIdbgk:lMgr:varJbbbb9BEgrNhxaqarNhralcxfIdbhqdndnakJbbbb9GTmbaxhkxekJbbjZar:l:tgkak:maxJbbbb9GEhkJbbjZax:l:tgxax:marJbbbb9GEhrkdndnaqJbbj:;aqJbbj:;9GEgxJbbjZaxJbbjZ9FEavNJbbbZJbbb:;aqJbbbb9GEMgq:lJbbb9p9DTmbaq:Ohmxekcjjjj94hmkdndnakJbbj:;akJbbj:;9GEgqJbbjZaqJbbjZ9FEaoNJbbbZJbbb:;akJbbbb9GEMgq:lJbbb9p9DTmbaq:OhPxekcjjjj94hPkdndnarJbbj:;arJbbj:;9GEgqJbbjZaqJbbjZ9FEaoNJbbbZJbbb:;arJbbbb9GEMgr:lJbbb9p9DTmbar:Ohsxekcjjjj94hskdndnadcl9hmbabaifgzas86bbazcifam86bbazcdfaw86bbazcefaP86bbxekabaDfgzas87ebazcofam87ebazclfaw87ebazcdfaP87ebkalczfhlaiclfhiaDcwfhDaecufgembkkk;klld99eud99eudnaeTmbdndncuaicuftcu7:YgvJbbbZMgo:lJbbb9p9DTmbao:Ohixekcjjjj94hikaic;8FiGhrinabcofcicdalclfIdb:lalIdb:l9EgialcwfIdb:lalaicdtfIdb:l9EEgialcxfIdb:lalaicdtfIdb:l9EEgiarV87ebdndnalaicefciGcdtfIdbJ;Zl:1ZNJbbj:;JbbjZalaicdtfIdbJbbbb9DEgoNgwJbbj:;awJbbj:;9GEgDJbbjZaDJbbjZ9FEavNJbbbZJbbb:;awJbbbb9GEMgw:lJbbb9p9DTmbaw:Ohqxekcjjjj94hqkabaq87ebdndnaoalaicdfciGcdtfIdbJ;Zl:1ZNNgwJbbj:;awJbbj:;9GEgDJbbjZaDJbbjZ9FEavNJbbbZJbbb:;awJbbbb9GEMgw:lJbbb9p9DTmbaw:Ohqxekcjjjj94hqkabcdfaq87ebdndnaoalaicufciGcdtfIdbJ;Zl:1ZNNgoJbbj:;aoJbbj:;9GEgwJbbjZawJbbjZ9FEavNJbbbZJbbb:;aoJbbbb9GEMgo:lJbbb9p9DTmbao:Ohixekcjjjj94hikabclfai87ebabcwfhbalczfhlaecufgembkkk:Hvdxue998Jjjjjbcjd9Rgo8Kjjjjbadcd4hrdndndndnavcd9hmbadcl6mearcearce0EhwaohDinaDc:CuBdbaDclfhDawcufgwmbkaeTmiadcl6mdarcearce0EhqarcdthkalhxcbhminaohDaxhwaqhPinaDaDydbgsawydbgzcL4cFeGc:cufcbazEgzasaz9kEBdbawclfhwaDclfhDaPcufgPmbkaxakfhxamcefgmae9hmbkkaeTmdxekaeTmekavcb9hadcl6gqVhHarcearce0Ehkarcdthrceai9Rhmcbhdindndndnavce9hmbaqmdc:CuhwalhDakhPinawaDydbgscL4cFeGc:cufcbasEgsawas9kEhwaDclfhDaPcufgPmbxdkkc:CuhwaHmbaohDalhPakhsinaDaPydbgzcL4cFeGgxc8Aaxc8A9kEc:cufcbazEBdbaPclfhPaDclfhDascufgsmbkkaqmbcbhDakhsinawhPdnavceSmbaoaDfydbhPkdndnalaDfIdbgOcjjj;8iamaPfgPcLt9R::NJbbbZJbbb:;aOJbbbb9GEMgO:lJbbb9p9DTmbaO:Ohzxekcjjjj94hzkabaDfazcFFFrGaPcKtVBdbaDclfhDascufgsmbkkabarfhbalarfhladcefgdae9hmbkkaocjdf8KjjjjbkFkdCui998Jjjjjbc:Gd9Rgv8Kjjjjbavc:4efcbc;KbzNjjjb8AcbhodnadTmbcbhoaiTmbdnabae9hmbavcuadcdtgoadcFFFFi0Ecbyd:K:kjjbHjjjjbbgeBd:4eavceBd:ydaeabaoz:tjjjb8Akavc:OefcwfcbBdbav9cb83i:Oeavc:Oefaeadaiavc:4efz:njjjbcuaicdtgraicFFFFi0Egwcbyd:K:kjjbHjjjjbbhoavc:4efavyd:ydgDcdtfaoBdbavaDcefgqBd:ydaoavyd:Oegkarz:tjjjbhxavc:4efaqcdtfadci9Ugmcbyd:K:kjjbHjjjjbbgoBdbavaDcdfgrBd:ydaocbamzNjjjbhPavc:4efarcdtfawcbyd:K:kjjbHjjjjbbgsBdbavaDcifgqBd:ydaxhoashrinaralIdbalaoydbgwcwawcw6Ecdtfc;ebfIdbMUdbaoclfhoarclfhraicufgimbkavc:4efaqcdtfcuamcdtadcFFFF970Ecbyd:K:kjjbHjjjjbbgqBdbavaDclfBd:yddnadci6mbamceamce0EhiaehoaqhrinarasaoydbcdtfIdbasaoclfydbcdtfIdbMasaocwfydbcdtfIdbMUdbaocxfhoarclfhraicufgimbkkavc;qbfhzavhoavyd:SehHavyd:WehOcbhwcbhrcbhAcehCinaohXcihQaearci2gLcdtfgocwfydbhdaoydbhDabaAcx2fgiclfaoclfydbgKBdbaiaDBdbaicwfadBdbaParfce86bbazadBdwazaKBdlazaDBdbaqarcdtfcbBdbdnawTmbcihQaXhiinazaQcdtfaiydbgoBdbaQaoaD9haoaK9hGaoad9hGfhQaiclfhiawcufgwmbkkaAcefhAaxaDcdtfgoaoydbcufBdbaxaKcdtfgoaoydbcufBdbaxadcdtfgoaoydbcufBdbcbhwinaOaHaeawaLfcdtfydbcdtgifydbcdtfgKhoakaifgDydbgdhidnadTmbdninaoydbarSmeaoclfhoaicufgiTmdxbkkaoadcdtaKfc98fydbBdbaDaDydbcufBdbkawcefgwci9hmbkdndndnaQTmbcuhrJbbbbhYcbhDavyd:SehKavyd:WehLindndnakazaDcdtfydbcdtgofydbgimbaDcefhDxekaDcs0hwasaofgdIdbh8AadalcbaDcefgDawEcdtfIdbalaxaofydbgwcwawcw6Ecdtfc;ebfIdbMgEUdbaEa8A:thEaicdthiaLaKaofydbcdtfhoinaqaoydbgwcdtfgdaEadIdbMg8AUdba8AaYaYa8A9DgdEhYawaradEhraoclfhoaic98fgimbkkaDaQ9hmbkarcu9hmekaCam9pmeindnaPaCfRbbmbaChrxdkamaCcefgC9hmbxdkkaQczaQcz6EhwazhoaXhzarcu9hmekkavyd:ydhokaocdtavc:4effc98fhrdninaoTmearydbcbyd:G:kjjbH:bjjjbbarc98fhraocufhoxbkkavc:Gdf8Kjjjjbk;UlevucuaicdtgvaicFFFFi0Egocbyd:K:kjjbHjjjjbbhralalyd9GgwcdtfarBdbalawcefBd9GabarBdbaocbyd:K:kjjbHjjjjbbhralalyd9GgocdtfarBdbalaocefBd9GabarBdlcuadcdtadcFFFFi0Ecbyd:K:kjjbHjjjjbbhralalyd9GgocdtfarBdbalaocefBd9GabarBdwabydbcbavzNjjjb8Aadci9UhwdnadTmbabydbhoaehladhrinaoalydbcdtfgvavydbcefBdbalclfhlarcufgrmbkkdnaiTmbabydbhlabydlhrcbhvaihoinaravBdbarclfhralydbavfhvalclfhlaocufgombkkdnadci6mbawceawce0EhDabydlhrabydwhvcbhlinaecwfydbhoaeclfydbhdaraeydbcdtfgwawydbgwcefBdbavawcdtfalBdbaradcdtfgdadydbgdcefBdbavadcdtfalBdbaraocdtfgoaoydbgocefBdbavaocdtfalBdbaecxfheaDalcefgl9hmbkkdnaiTmbabydlheabydbhlinaeaeydbalydb9RBdbalclfhlaeclfheaicufgimbkkkQbabaeadaic:01jjbz:mjjjbkQbabaeadaic:C:jjjbz:mjjjbk9DeeuabcFeaicdtzNjjjbhlcbhbdnadTmbindnalaeydbcdtfgiydbcu9hmbaiabBdbabcefhbkaeclfheadcufgdmbkkabk;:kivuo99lu8Jjjjjbcj;Hb9Rgl8Kjjjjbcbhvalc1;Gbfcbc;KbzNjjjb8AalcuadcdtadcFFFFi0Egocbyd:K:kjjbHjjjjbbgrBd19GalceBd;O9Galcwfcbyd:m:kjjbBdbalcb8Pd:e:kjjb83ibalc;W;Gbfcwfcbyd:y:kjjbBdbalcb8Pd:q:kjjb83i;W9Gaicd4hwdndnadmbJFFuFhDJFFuuhqJFFuuhkJFFuFhxJFFuuhmJFFuFhPxekawcdthsaehzincbhiinalaifgHazaifIdbgDaHIdbgxaxaD9EEUdbalc;W;GbfaifgHaDaHIdbgxaxaD9DEUdbaiclfgicx9hmbkazasfhzavcefgvad9hmbkalIdwhqalId;49GhDalIdlhkalId;09GhxalIdbhmalId;W9GhPkdndnadTmbJbbbbJbbjZaPam:tJbbbb:xgPaxak:tgxaxaP9DEgxaDaq:tgDaDax9DEgD:vaDJbbbb9BEhDawcdthsarhHadhzindndnaDaeIdbam:tNJb;au9eNJbbbZMgx:lJbbb9p9DTmbax:Ohixekcjjjj94hikaicztaicwtcj;GiGVaicsGVc:p;G:dKGcH2c;d;H:WKGcv2c;j:KM;jbGhvdndnaDaeclfIdbak:tNJb;au9eNJbbbZMgx:lJbbb9p9DTmbax:Ohixekcjjjj94hikaicztaicwtcj;GiGVaicsGVc:p;G:dKGcH2c;d;H:WKGcq2cM;j:KMeGavVhvdndnaDaecwfIdbaq:tNJb;au9eNJbbbZMgx:lJbbb9p9DTmbax:Ohixekcjjjj94hikaHavaicztaicwtcj;GiGVaicsGVc:p;G:dKGcH2c;d;H:WKGcC2c:KM;j:KdGVBdbaeasfheaHclfhHazcufgzmbkalcbcj;GbzNjjjbhiarhHadheinaiaHydbgzcFrGcx2fgvavydbcefBdbaiazcq4cFrGcx2fgvavydlcefBdlaiazcC4cFrGcx2fgzazydwcefBdwaHclfhHaecufgembxdkkalcbcj;GbzNjjjb8AkcbhHcbhzcbhecbhvinalaHfgiydbhsaiazBdbaicwfgwydbhOawavBdbaiclfgiydbhwaiaeBdbasazfhzaOavfhvawaefheaHcxfgHcj;Gb9hmbkcbhialaocbyd:K:kjjbHjjjjbbgzBd:m9GdnadTmbabhHinaHaiBdbaHclfhHadaicefgi9hmbkadTmbabhiadhHinalaraiydbgecdtfydbcFrGcx2fgvavydbgvcefBdbazavcdtfaeBdbaiclfhiaHcufgHmbkazhiadhHinalaraiydbgecdtfydbcq4cFrGcx2fgvavydlgvcefBdlabavcdtfaeBdbaiclfhiaHcufgHmbkabhiadhHinalaraiydbgecdtfydbcC4cFrGcx2fgvavydwgvcefBdwazavcdtfaeBdbaiclfhiaHcufgHmbkadTmbcbhiinabazydbcdtfaiBdbazclfhzadaicefgi9hmbkkclhidninaic98Smealc1;Gbfaifydbcbyd:G:kjjbH:bjjjbbaic98fhixbkkalcj;Hbf8Kjjjjbk9teiucbcbyd:O:kjjbgeabcifc98GfgbBd:O:kjjbdndnabZbcztgd9nmbcuhiabad9RcFFifcz4nbcuSmekaehikaik;LeeeudndnaeabVciGTmbabhixekdndnadcz9pmbabhixekabhiinaiaeydbBdbaiclfaeclfydbBdbaicwfaecwfydbBdbaicxfaecxfydbBdbaeczfheaiczfhiadc9Wfgdcs0mbkkadcl6mbinaiaeydbBdbaeclfheaiclfhiadc98fgdci0mbkkdnadTmbinaiaeRbb86bbaicefhiaecefheadcufgdmbkkabk;aeedudndnabciGTmbabhixekaecFeGc:b:c:ew2hldndnadcz9pmbabhixekabhiinaialBdbaicxfalBdbaicwfalBdbaiclfalBdbaiczfhiadc9Wfgdcs0mbkkadcl6mbinaialBdbaiclfhiadc98fgdci0mbkkdnadTmbinaiae86bbaicefhiadcufgdmbkkabk9teiucbcbyd:O:kjjbgeabcrfc94GfgbBd:O:kjjbdndnabZbcztgd9nmbcuhiabad9RcFFifcz4nbcuSmekaehikaik9:eiuZbhedndncbyd:O:kjjbgdaecztgi9nmbcuheadai9RcFFifcz4nbcuSmekadhekcbabae9Rcifc98Gcbyd:O:kjjbfgdBd:O:kjjbdnadZbcztge9nmbadae9RcFFifcz4nb8Akkk:6ddbcjwk:Cdb4:h9w9N94:P:gW:j9O:ye9Pbbbbbbebbbdbbbebbbdbbbbbbbdbbbbbbbebbbbbbb:l29hZ;69:9kZ;N;76Z;rg97Z;z;o9xZ8J;B85Z;:;u9yZ;b;k9HZ:2;Z9DZ9e:l9mZ59A8KZ:r;T3Z:A:zYZ79OHZ;j4::8::Y:D9V8:bbbb9s:49:Z8R:hBZ9M9M;M8:L;z;o8:;8:PG89q;x:J878R:hQ8::M:B;e87bbbbbbjZbbjZbbjZ:E;V;N8::Y:DsZ9i;H;68:xd;R8:;h0838:;W:NoZbbbb:WV9O8:uf888:9i;H;68:9c9G;L89;n;m9m89;D8Ko8:bbbbf:8tZ9m836ZS:2AZL;zPZZ818EZ9e:lxZ;U98F8:819E;68:FFuuFFuuFFuuFFuFFFuFFFuFbc:Cqkzebbbebbbdbbb8WWbb\";\n\n\tvar wasmpack = new Uint8Array([32,0,65,2,1,106,34,33,3,128,11,4,13,64,6,253,10,7,15,116,127,5,8,12,40,16,19,54,20,9,27,255,113,17,42,67,24,23,146,148,18,14,22,45,70,69,56,114,101,21,25,63,75,136,108,28,118,29,73,115]);\n\n\tif (typeof WebAssembly !== 'object') {\n\t\treturn {\n\t\t\tsupported: false,\n\t\t};\n\t}\n\n\tvar instance;\n\n\tvar ready =\n\t\tWebAssembly.instantiate(unpack(wasm), {})\n\t\t.then(function(result) {\n\t\t\tinstance = result.instance;\n\t\t\tinstance.exports.__wasm_call_ctors();\n\t\t\tinstance.exports.meshopt_encodeVertexVersion(0);\n\t\t\tinstance.exports.meshopt_encodeIndexVersion(1);\n\t\t});\n\n\tfunction unpack(data) {\n\t\tvar result = new Uint8Array(data.length);\n\t\tfor (var i = 0; i < data.length; ++i) {\n\t\t\tvar ch = data.charCodeAt(i);\n\t\t\tresult[i] = ch > 96 ? ch - 97 : ch > 64 ? ch - 39 : ch + 4;\n\t\t}\n\t\tvar write = 0;\n\t\tfor (var i = 0; i < data.length; ++i) {\n\t\t\tresult[write++] = (result[i] < 60) ? wasmpack[result[i]] : (result[i] - 60) * 64 + result[++i];\n\t\t}\n\t\treturn result.buffer.slice(0, write);\n\t}\n\n\tfunction assert(cond) {\n\t\tif (!cond) {\n\t\t\tthrow new Error(\"Assertion failed\");\n\t\t}\n\t}\n\n\tfunction bytes(view) {\n\t\treturn new Uint8Array(view.buffer, view.byteOffset, view.byteLength);\n\t}\n\n\tfunction reorder(fun, indices, vertices, optf) {\n\t\tvar sbrk = instance.exports.sbrk;\n\t\tvar ip = sbrk(indices.length * 4);\n\t\tvar rp = sbrk(vertices * 4);\n\t\tvar heap = new Uint8Array(instance.exports.memory.buffer);\n\t\tvar indices8 = bytes(indices);\n\t\theap.set(indices8, ip);\n\t\tif (optf) {\n\t\t\toptf(ip, ip, indices.length, vertices);\n\t\t}\n\t\tvar unique = fun(rp, ip, indices.length, vertices);\n\t\t// heap may have grown\n\t\theap = new Uint8Array(instance.exports.memory.buffer);\n\t\tvar remap = new Uint32Array(vertices);\n\t\tnew Uint8Array(remap.buffer).set(heap.subarray(rp, rp + vertices * 4));\n\t\tindices8.set(heap.subarray(ip, ip + indices.length * 4));\n\t\tsbrk(ip - sbrk(0));\n\n\t\tfor (var i = 0; i < indices.length; ++i)\n\t\t\tindices[i] = remap[indices[i]];\n\n\t\treturn [remap, unique];\n\t}\n\n\tfunction spatialsort(fun, positions, count, stride) {\n\t\tvar sbrk = instance.exports.sbrk;\n\t\tvar ip = sbrk(count * 4);\n\t\tvar sp = sbrk(count * stride);\n\t\tvar heap = new Uint8Array(instance.exports.memory.buffer);\n\t\theap.set(bytes(positions), sp);\n\t\tfun(ip, sp, count, stride);\n\t\t// heap may have grown\n\t\theap = new Uint8Array(instance.exports.memory.buffer);\n\t\tvar remap = new Uint32Array(count);\n\t\tnew Uint8Array(remap.buffer).set(heap.subarray(ip, ip + count * 4));\n\t\tsbrk(ip - sbrk(0));\n\t\treturn remap;\n\t}\n\n\tfunction encode(fun, bound, source, count, size) {\n\t\tvar sbrk = instance.exports.sbrk;\n\t\tvar tp = sbrk(bound);\n\t\tvar sp = sbrk(count * size);\n\t\tvar heap = new Uint8Array(instance.exports.memory.buffer);\n\t\theap.set(bytes(source), sp);\n\t\tvar res = fun(tp, bound, sp, count, size);\n\t\tvar target = new Uint8Array(res);\n\t\ttarget.set(heap.subarray(tp, tp + res));\n\t\tsbrk(tp - sbrk(0));\n\t\treturn target;\n\t}\n\n\tfunction maxindex(source) {\n\t\tvar result = 0;\n\t\tfor (var i = 0; i < source.length; ++i) {\n\t\t\tvar index = source[i];\n\t\t\tresult = result < index ? index : result;\n\t\t}\n\t\treturn result;\n\t}\n\n\tfunction index32(source, size) {\n\t\tassert(size == 2 || size == 4);\n\t\tif (size == 4) {\n\t\t\treturn new Uint32Array(source.buffer, source.byteOffset, source.byteLength / 4);\n\t\t} else {\n\t\t\tvar view = new Uint16Array(source.buffer, source.byteOffset, source.byteLength / 2);\n\t\t\treturn new Uint32Array(view); // copies each element\n\t\t}\n\t}\n\n\tfunction filter(fun, source, count, stride, bits, insize, mode) {\n\t\tvar sbrk = instance.exports.sbrk;\n\t\tvar tp = sbrk(count * stride);\n\t\tvar sp = sbrk(count * insize);\n\t\tvar heap = new Uint8Array(instance.exports.memory.buffer);\n\t\theap.set(bytes(source), sp);\n\t\tfun(tp, count, stride, bits, sp, mode);\n\t\tvar target = new Uint8Array(count * stride);\n\t\ttarget.set(heap.subarray(tp, tp + count * stride));\n\t\tsbrk(tp - sbrk(0));\n\t\treturn target;\n\t}\n\n\treturn {\n\t\tready: ready,\n\t\tsupported: true,\n\t\treorderMesh: function(indices, triangles, optsize) {\n\t\t\tvar optf = triangles ? (optsize ? instance.exports.meshopt_optimizeVertexCacheStrip : instance.exports.meshopt_optimizeVertexCache) : undefined;\n\t\t\treturn reorder(instance.exports.meshopt_optimizeVertexFetchRemap, indices, maxindex(indices) + 1, optf);\n\t\t},\n\t\treorderPoints: function(positions, positions_stride) {\n\t\t\tassert(positions instanceof Float32Array);\n\t\t\tassert(positions.length % positions_stride == 0);\n\t\t\tassert(positions_stride >= 3);\n\t\t\treturn spatialsort(instance.exports.meshopt_spatialSortRemap, positions, positions.length / positions_stride, positions_stride * 4);\n\t\t},\n\t\tencodeVertexBuffer: function(source, count, size) {\n\t\t\tassert(size > 0 && size <= 256);\n\t\t\tassert(size % 4 == 0);\n\t\t\tvar bound = instance.exports.meshopt_encodeVertexBufferBound(count, size);\n\t\t\treturn encode(instance.exports.meshopt_encodeVertexBuffer, bound, source, count, size);\n\t\t},\n\t\tencodeIndexBuffer: function(source, count, size) {\n\t\t\tassert(size == 2 || size == 4);\n\t\t\tassert(count % 3 == 0);\n\t\t\tvar indices = index32(source, size);\n\t\t\tvar bound = instance.exports.meshopt_encodeIndexBufferBound(count, maxindex(indices) + 1);\n\t\t\treturn encode(instance.exports.meshopt_encodeIndexBuffer, bound, indices, count, 4);\n\t\t},\n\t\tencodeIndexSequence: function(source, count, size) {\n\t\t\tassert(size == 2 || size == 4);\n\t\t\tvar indices = index32(source, size);\n\t\t\tvar bound = instance.exports.meshopt_encodeIndexSequenceBound(count, maxindex(indices) + 1);\n\t\t\treturn encode(instance.exports.meshopt_encodeIndexSequence, bound, indices, count, 4);\n\t\t},\n\t\tencodeGltfBuffer: function(source, count, size, mode) {\n\t\t\tvar table = {\n\t\t\t\tATTRIBUTES: this.encodeVertexBuffer,\n\t\t\t\tTRIANGLES: this.encodeIndexBuffer,\n\t\t\t\tINDICES: this.encodeIndexSequence,\n\t\t\t};\n\t\t\tassert(table[mode]);\n\t\t\treturn table[mode](source, count, size);\n\t\t},\n\t\tencodeFilterOct: function(source, count, stride, bits) {\n\t\t\tassert(stride == 4 || stride == 8);\n\t\t\tassert(bits >= 1 && bits <= 16);\n\t\t\treturn filter(instance.exports.meshopt_encodeFilterOct, source, count, stride, bits, 16);\n\t\t},\n\t\tencodeFilterQuat: function(source, count, stride, bits) {\n\t\t\tassert(stride == 8);\n\t\t\tassert(bits >= 4 && bits <= 16);\n\t\t\treturn filter(instance.exports.meshopt_encodeFilterQuat, source, count, stride, bits, 16);\n\t\t},\n\t\tencodeFilterExp: function(source, count, stride, bits, mode) {\n\t\t\tassert(stride > 0 && stride % 4 == 0);\n\t\t\tassert(bits >= 1 && bits <= 24);\n\t\t\tvar table = {\n\t\t\t\tSeparate: 0,\n\t\t\t\tSharedVector: 1,\n\t\t\t\tSharedComponent: 2,\n\t\t\t};\n\t\t\treturn filter(instance.exports.meshopt_encodeFilterExp, source, count, stride, bits, stride, mode ? table[mode] : 1);\n\t\t},\n\t};\n})();\n\nexport { MeshoptEncoder };\n","// This file is part of meshoptimizer library and is distributed under the terms of MIT License.\n// Copyright (C) 2016-2023, by Arseny Kapoulkine (arseny.kapoulkine@gmail.com)\nvar MeshoptDecoder = (function() {\n\t// Built with clang version 16.0.0\n\t// Built from meshoptimizer 0.20\n\tvar wasm_base = \"b9H79Tebbbe8Fv9Gbb9Gvuuuuueu9Giuuub9Geueu9Giuuueuikqbeeedddillviebeoweuec:q;iekr;leDo9TW9T9VV95dbH9F9F939H79T9F9J9H229F9Jt9VV7bb8A9TW79O9V9Wt9F9KW9J9V9KW9wWVtW949c919M9MWVbeY9TW79O9V9Wt9F9KW9J9V9KW69U9KW949c919M9MWVbdE9TW79O9V9Wt9F9KW9J9V9KW69U9KW949tWG91W9U9JWbiL9TW79O9V9Wt9F9KW9J9V9KWS9P2tWV9p9JtblK9TW79O9V9Wt9F9KW9J9V9KWS9P2tWV9r919HtbvL9TW79O9V9Wt9F9KW9J9V9KWS9P2tWVT949Wbol79IV9Rbrq;d8Yqdbk:yzeHu8Jjjjjbcj;eb9Rgv8Kjjjjbc9:hodnadcefal0mbcuhoaiRbbc:Ge9hmbavaialfgrad9Radz1jjjbhwcj;abad9UhlaicefhodnadTmbalc;WFbGglcjdalcjd6EhDcbhqinaqae9pmeaDaeaq9RaqaDfae6Egkcsfglcl4cifcd4hxdndndndnalc9WGgmTmbcbhPcehsawcjdfhzaohHinaraH9Rax6midnaraHaxfgo9RcK6mbczhlcbhOinalgic9WfgAawcj;cbffhldndndndndnaHaAco4fRbbaOcoG4ciGPlbedibkal9cb83ibalcwf9cb83ibxikalaoRblaoRbbgAco4gCaCciSgCE86bbawcj;cbfaifglcGfaoclfaCfgCRbbaAcl4ciGgXaXciSgXE86bbalcVfaCaXfgCRbbaAcd4ciGgXaXciSgXE86bbalc7faCaXfgCRbbaAciGgAaAciSgAE86bbalctfaCaAfgCRbbaoRbegAco4gXaXciSgXE86bbalc91faCaXfgCRbbaAcl4ciGgXaXciSgXE86bbalc4faCaXfgCRbbaAcd4ciGgXaXciSgXE86bbalc93faCaXfgCRbbaAciGgAaAciSgAE86bbalc94faCaAfgCRbbaoRbdgAco4gXaXciSgXE86bbalc95faCaXfgCRbbaAcl4ciGgXaXciSgXE86bbalc96faCaXfgCRbbaAcd4ciGgXaXciSgXE86bbalc97faCaXfgCRbbaAciGgAaAciSgAE86bbalc98faCaAfgARbbaoRbigoco4gCaCciSgCE86bbalc99faAaCfgARbbaocl4ciGgCaCciSgCE86bbalc9:faAaCfgARbbaocd4ciGgCaCciSgCE86bbalcufaAaCfglRbbaociGgoaociSgoE86bbalaofhoxdkalaoRbwaoRbbgAcl4gCaCcsSgCE86bbawcj;cbfaifglcGfaocwfaCfgCRbbaAcsGgAaAcsSgAE86bbalcVfaCaAfgARbbaoRbegCcl4gXaXcsSgXE86bbalc7faAaXfgARbbaCcsGgCaCcsSgCE86bbalctfaAaCfgARbbaoRbdgCcl4gXaXcsSgXE86bbalc91faAaXfgARbbaCcsGgCaCcsSgCE86bbalc4faAaCfgARbbaoRbigCcl4gXaXcsSgXE86bbalc93faAaXfgARbbaCcsGgCaCcsSgCE86bbalc94faAaCfgARbbaoRblgCcl4gXaXcsSgXE86bbalc95faAaXfgARbbaCcsGgCaCcsSgCE86bbalc96faAaCfgARbbaoRbvgCcl4gXaXcsSgXE86bbalc97faAaXfgARbbaCcsGgCaCcsSgCE86bbalc98faAaCfgARbbaoRbogCcl4gXaXcsSgXE86bbalc99faAaXfgARbbaCcsGgCaCcsSgCE86bbalc9:faAaCfgARbbaoRbrgocl4gCaCcsSgCE86bbalcufaAaCfglRbbaocsGgoaocsSgoE86bbalaofhoxekalao8Pbb83bbalcwfaocwf8Pbb83bbaoczfhokdnaiam9pmbaOcdfhOaiczfhlarao9RcL0mekkaiam6miaoTmidnakTmbawaPfRbbhOawcj;cbfhlazhiakhAinaialRbbgHce4cbaHceG9R7aOfgO86bbaiadfhialcefhlaAcufgAmbkkazcefhzaPcefgPad6hsaohHaPad9hmexvkkcbhoasceGmdxikaoaxad2fhXdnakTmbcbhmcehsawcjdfhCinarao9Rax6miaoTmdaoaxfhoawamfRbbhOawcj;cbfhlaChiakhAinaialRbbgHce4cbaHceG9R7aOfgO86bbaiadfhialcefhlaAcufgAmbkaCcefhCamcefgmad6hsamad9hmbkaXhoxikcbhlcehsinarao9Rax6mdaoTmeaoaxfhoalcefglad6hsadal9hmbkaXhoxdkcbhoasceGTmekc9:hoxikabaqad2fawcjdfakad2z1jjjb8Aawawcjdfakcufad2fadz1jjjb8Aakaqfhqaombkc9:hoxekcbc99arao9Radcaadca0ESEhokavcj;ebf8Kjjjjbaok;xzeHu8Jjjjjbc;ae9Rgv8Kjjjjbc9:hodnaeci9UgrcHfal0mbcuhoaiRbbgwc;WeGc;Ge9hmbawcsGgDce0mbavc;abfcFecjez:jjjjb8AavcUf9cu83ibavc8Wf9cu83ibavcyf9cu83ibavcaf9cu83ibavcKf9cu83ibavczf9cu83ibav9cu83iwav9cu83ibaialfc9WfhqaicefgwarfhodnaeTmbcmcsaDceSEhkcbhxcbhmcbhrcbhicbhlindnaoaq9nmbc9:hoxikdndnawRbbgDc;Ve0mbavc;abfalaDcu7gPcl4fcsGcitfgsydlhzasydbhHdnaDcsGgDak9pmbavaiaPfcsGcdtfydbaxaDEhsaDThDdndnadcd9hmbabarcetfgPaH87ebaPcdfaz87ebaPclfas87ebxekabarcdtfgPaHBdbaPclfazBdbaPcwfasBdbkaxaDfhxavc;abfalcitfgPasBdbaPazBdlavaicdtfasBdbavc;abfalcefcsGglcitfgPaHBdbaPasBdlaiaDfhialcefhlxdkdndnaDcsSmbamaDfaDc987fcefhmxekaocefhDao8SbbgscFeGhPdndnascu9mmbaDhoxekaocvfhoaPcFbGhPcrhsdninaD8SbbgOcFbGastaPVhPaOcu9kmeaDcefhDascrfgsc8J9hmbxdkkaDcefhokaPce4cbaPceG9R7amfhmkdndnadcd9hmbabarcetfgDaH87ebaDcdfaz87ebaDclfam87ebxekabarcdtfgDaHBdbaDclfazBdbaDcwfamBdbkavc;abfalcitfgDamBdbaDazBdlavaicdtfamBdbavc;abfalcefcsGglcitfgDaHBdbaDamBdlaicefhialcefhlxekdnaDcpe0mbaxcefgOavaiaqaDcsGfRbbgscl49RcsGcdtfydbascz6gPEhDavaias9RcsGcdtfydbaOaPfgzascsGgOEhsaOThOdndnadcd9hmbabarcetfgHax87ebaHcdfaD87ebaHclfas87ebxekabarcdtfgHaxBdbaHclfaDBdbaHcwfasBdbkavaicdtfaxBdbavc;abfalcitfgHaDBdbaHaxBdlavaicefgicsGcdtfaDBdbavc;abfalcefcsGcitfgHasBdbaHaDBdlavaiaPfcsGgicdtfasBdbavc;abfalcdfcsGglcitfgDaxBdbaDasBdlalcefhlaiaOfhiazaOfhxxekaxcbaoRbbgHEgAaDc;:eSgDfhzaHcsGhCaHcl4hXdndnaHcs0mbazcefhOxekazhOavaiaX9RcsGcdtfydbhzkdndnaCmbaOcefhxxekaOhxavaiaH9RcsGcdtfydbhOkdndnaDTmbaocefhDxekaocdfhDao8SbegPcFeGhsdnaPcu9kmbaocofhAascFbGhscrhodninaD8SbbgPcFbGaotasVhsaPcu9kmeaDcefhDaocrfgoc8J9hmbkaAhDxekaDcefhDkasce4cbasceG9R7amfgmhAkdndnaXcsSmbaDhsxekaDcefhsaD8SbbgocFeGhPdnaocu9kmbaDcvfhzaPcFbGhPcrhodninas8SbbgDcFbGaotaPVhPaDcu9kmeascefhsaocrfgoc8J9hmbkazhsxekascefhskaPce4cbaPceG9R7amfgmhzkdndnaCcsSmbashoxekascefhoas8SbbgDcFeGhPdnaDcu9kmbascvfhOaPcFbGhPcrhDdninao8SbbgscFbGaDtaPVhPascu9kmeaocefhoaDcrfgDc8J9hmbkaOhoxekaocefhokaPce4cbaPceG9R7amfgmhOkdndnadcd9hmbabarcetfgDaA87ebaDcdfaz87ebaDclfaO87ebxekabarcdtfgDaABdbaDclfazBdbaDcwfaOBdbkavc;abfalcitfgDazBdbaDaABdlavaicdtfaABdbavc;abfalcefcsGcitfgDaOBdbaDazBdlavaicefgicsGcdtfazBdbavc;abfalcdfcsGcitfgDaABdbaDaOBdlavaiaHcz6aXcsSVfgicsGcdtfaOBdbaiaCTaCcsSVfhialcifhlkawcefhwalcsGhlaicsGhiarcifgrae6mbkkcbc99aoaqSEhokavc;aef8Kjjjjbaok:flevu8Jjjjjbcz9Rhvc9:hodnaecvfal0mbcuhoaiRbbc;:eGc;qe9hmbav9cb83iwaicefhraialfc98fhwdnaeTmbdnadcdSmbcbhDindnaraw6mbc9:skarcefhoar8SbbglcFeGhidndnalcu9mmbaohrxekarcvfhraicFbGhicrhldninao8SbbgdcFbGaltaiVhiadcu9kmeaocefhoalcrfglc8J9hmbxdkkaocefhrkabaDcdtfaic8Etc8F91aicd47avcwfaiceGcdtVgoydbfglBdbaoalBdbaDcefgDae9hmbxdkkcbhDindnaraw6mbc9:skarcefhoar8SbbglcFeGhidndnalcu9mmbaohrxekarcvfhraicFbGhicrhldninao8SbbgdcFbGaltaiVhiadcu9kmeaocefhoalcrfglc8J9hmbxdkkaocefhrkabaDcetfaic8Etc8F91aicd47avcwfaiceGcdtVgoydbfgl87ebaoalBdbaDcefgDae9hmbkkcbc99arawSEhokaok:Lvoeue99dud99eud99dndnadcl9hmbaeTmeindndnabcdfgd8Sbb:Yab8Sbbgi:Ygl:l:tabcefgv8Sbbgo:Ygr:l:tgwJbb;:9cawawNJbbbbawawJbbbb9GgDEgq:mgkaqaicb9iEalMgwawNakaqaocb9iEarMgqaqNMM:r:vglNJbbbZJbbb:;aDEMgr:lJbbb9p9DTmbar:Ohixekcjjjj94hikadai86bbdndnaqalNJbbbZJbbb:;aqJbbbb9GEMgq:lJbbb9p9DTmbaq:Ohdxekcjjjj94hdkavad86bbdndnawalNJbbbZJbbb:;awJbbbb9GEMgw:lJbbb9p9DTmbaw:Ohdxekcjjjj94hdkabad86bbabclfhbaecufgembxdkkaeTmbindndnabclfgd8Ueb:Yab8Uebgi:Ygl:l:tabcdfgv8Uebgo:Ygr:l:tgwJb;:FSawawNJbbbbawawJbbbb9GgDEgq:mgkaqaicb9iEalMgwawNakaqaocb9iEarMgqaqNMM:r:vglNJbbbZJbbb:;aDEMgr:lJbbb9p9DTmbar:Ohixekcjjjj94hikadai87ebdndnaqalNJbbbZJbbb:;aqJbbbb9GEMgq:lJbbb9p9DTmbaq:Ohdxekcjjjj94hdkavad87ebdndnawalNJbbbZJbbb:;awJbbbb9GEMgw:lJbbb9p9DTmbaw:Ohdxekcjjjj94hdkabad87ebabcwfhbaecufgembkkk;siliui99iue99dnaeTmbcbhiabhlindndnJ;Zl81Zalcof8UebgvciV:Y:vgoal8Ueb:YNgrJb;:FSNJbbbZJbbb:;arJbbbb9GEMgw:lJbbb9p9DTmbaw:OhDxekcjjjj94hDkalclf8Uebhqalcdf8UebhkabaiavcefciGfcetfaD87ebdndnaoak:YNgwJb;:FSNJbbbZJbbb:;awJbbbb9GEMgx:lJbbb9p9DTmbax:Ohkxekcjjjj94hkkabaiavcdfciGfcetfak87ebdndnaoaq:YNgoJb;:FSNJbbbZJbbb:;aoJbbbb9GEMgx:lJbbb9p9DTmbax:Ohqxekcjjjj94hqkabaiavcufciGfcetfaq87ebdndnJbbjZararN:tawawN:taoaoN:tgrJbbbbarJbbbb9GE:rJb;:FSNJbbbZMgr:lJbbb9p9DTmbar:Ohqxekcjjjj94hqkabaiavciGfcetfaq87ebalcwfhlaiclfhiaecufgembkkk9mbdnadcd4ae2gdTmbinababydbgecwtcw91:Yaece91cjjj98Gcjjj;8if::NUdbabclfhbadcufgdmbkkk9teiucbcbydj1jjbgeabcifc98GfgbBdj1jjbdndnabZbcztgd9nmbcuhiabad9RcFFifcz4nbcuSmekaehikaik;LeeeudndnaeabVciGTmbabhixekdndnadcz9pmbabhixekabhiinaiaeydbBdbaiclfaeclfydbBdbaicwfaecwfydbBdbaicxfaecxfydbBdbaeczfheaiczfhiadc9Wfgdcs0mbkkadcl6mbinaiaeydbBdbaeclfheaiclfhiadc98fgdci0mbkkdnadTmbinaiaeRbb86bbaicefhiaecefheadcufgdmbkkabk;aeedudndnabciGTmbabhixekaecFeGc:b:c:ew2hldndnadcz9pmbabhixekabhiinaialBdbaicxfalBdbaicwfalBdbaiclfalBdbaiczfhiadc9Wfgdcs0mbkkadcl6mbinaialBdbaiclfhiadc98fgdci0mbkkdnadTmbinaiae86bbaicefhiadcufgdmbkkabkkkebcjwklz9Kbb\";\n\tvar wasm_simd = \"b9H79TebbbeKl9Gbb9Gvuuuuueu9Giuuub9Geueuikqbbebeedddilve9Weeeviebeoweuec:q;Aekr;leDo9TW9T9VV95dbH9F9F939H79T9F9J9H229F9Jt9VV7bb8A9TW79O9V9Wt9F9KW9J9V9KW9wWVtW949c919M9MWVbdY9TW79O9V9Wt9F9KW9J9V9KW69U9KW949c919M9MWVblE9TW79O9V9Wt9F9KW9J9V9KW69U9KW949tWG91W9U9JWbvL9TW79O9V9Wt9F9KW9J9V9KWS9P2tWV9p9JtboK9TW79O9V9Wt9F9KW9J9V9KWS9P2tWV9r919HtbrL9TW79O9V9Wt9F9KW9J9V9KWS9P2tWVT949Wbwl79IV9RbDq;b9tqlbzik9:evu8Jjjjjbcz9Rhbcbheincbhdcbhiinabcwfadfaicjuaead4ceGglE86bbaialfhiadcefgdcw9hmbkaec:q:yjjbfai86bbaecitc:q1jjbfab8Piw83ibaecefgecjd9hmbkk;e8JlHud97euo978Jjjjjbcj;kb9Rgv8Kjjjjbc9:hodnadcefal0mbcuhoaiRbbc:Ge9hmbavaialfgrad9Rad;8qbbcj;abad9UhoaicefhldnadTmbaoc;WFbGgocjdaocjd6EhwcbhDinaDae9pmeawaeaD9RaDawfae6Egqcsfgoc9WGgkci2hxakcethmaocl4cifcd4hPabaDad2fhscbhzdnincbhHalhOcbhAdninaraO9RaP6miavcj;cbfaAak2fhCaOaPfhlcbhidnakc;ab6mbaral9Rc;Gb6mbcbhoinaCaofhidndndndndnaOaoco4fRbbgXciGPlbedibkaipxbbbbbbbbbbbbbbbbpklbxikaialpbblalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLgQcdp:meaQpmbzeHdOiAlCvXoQrLpxiiiiiiiiiiiiiiiip9ogLpxiiiiiiiiiiiiiiiip8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklbalclfaYpQbfaKc:q:yjjbfRbbfhlxdkaialpbbwalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLpxssssssssssssssssp9ogLpxssssssssssssssssp8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklbalcwfaYpQbfaKc:q:yjjbfRbbfhlxekaialpbbbpklbalczfhlkdndndndndnaXcd4ciGPlbedibkaipxbbbbbbbbbbbbbbbbpklzxikaialpbblalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLgQcdp:meaQpmbzeHdOiAlCvXoQrLpxiiiiiiiiiiiiiiiip9ogLpxiiiiiiiiiiiiiiiip8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklzalclfaYpQbfaKc:q:yjjbfRbbfhlxdkaialpbbwalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLpxssssssssssssssssp9ogLpxssssssssssssssssp8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklzalcwfaYpQbfaKc:q:yjjbfRbbfhlxekaialpbbbpklzalczfhlkdndndndndnaXcl4ciGPlbedibkaipxbbbbbbbbbbbbbbbbpklaxikaialpbblalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLgQcdp:meaQpmbzeHdOiAlCvXoQrLpxiiiiiiiiiiiiiiiip9ogLpxiiiiiiiiiiiiiiiip8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklaalclfaYpQbfaKc:q:yjjbfRbbfhlxdkaialpbbwalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLpxssssssssssssssssp9ogLpxssssssssssssssssp8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklaalcwfaYpQbfaKc:q:yjjbfRbbfhlxekaialpbbbpklaalczfhlkdndndndndnaXco4Plbedibkaipxbbbbbbbbbbbbbbbbpkl8WxikaialpbblalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLgQcdp:meaQpmbzeHdOiAlCvXoQrLpxiiiiiiiiiiiiiiiip9ogLpxiiiiiiiiiiiiiiiip8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgXcitc:q1jjbfpbibaXc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgXcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spkl8WalclfaYpQbfaXc:q:yjjbfRbbfhlxdkaialpbbwalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLpxssssssssssssssssp9ogLpxssssssssssssssssp8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgXcitc:q1jjbfpbibaXc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgXcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spkl8WalcwfaYpQbfaXc:q:yjjbfRbbfhlxekaialpbbbpkl8Walczfhlkaoc;abfhiaocjefak0meaihoaral9Rc;Fb0mbkkdndnaiak9pmbaici4hoinaral9RcK6mdaCaifhXdndndndndnaOaico4fRbbaocoG4ciGPlbedibkaXpxbbbbbbbbbbbbbbbbpklbxikaXalpbblalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLgQcdp:meaQpmbzeHdOiAlCvXoQrLpxiiiiiiiiiiiiiiiip9ogLpxiiiiiiiiiiiiiiiip8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklbalclfaYpQbfaKc:q:yjjbfRbbfhlxdkaXalpbbwalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLpxssssssssssssssssp9ogLpxssssssssssssssssp8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklbalcwfaYpQbfaKc:q:yjjbfRbbfhlxekaXalpbbbpklbalczfhlkaocdfhoaiczfgiak6mbkkalTmbaAcd0hHalhOaAcefgAclSmdxekkcbhlaHceGTmdkdnakTmbavcjdfazfhiavazfpbdbhYcbhXinaiavcj;cbfaXfgopblbgLcep9TaLpxeeeeeeeeeeeeeeeegQp9op9Hp9rgLaoakfpblbg8Acep9Ta8AaQp9op9Hp9rg8ApmbzeHdOiAlCvXoQrLgEaoamfpblbg3cep9Ta3aQp9op9Hp9rg3aoaxfpblbg5cep9Ta5aQp9op9Hp9rg5pmbzeHdOiAlCvXoQrLg8EpmbezHdiOAlvCXorQLgQaQpmbedibedibedibediaYp9UgYp9AdbbaiadfgoaYaQaQpmlvorlvorlvorlvorp9UgYp9AdbbaoadfgoaYaQaQpmwDqkwDqkwDqkwDqkp9UgYp9AdbbaoadfgoaYaQaQpmxmPsxmPsxmPsxmPsp9UgYp9AdbbaoadfgoaYaEa8EpmwDKYqk8AExm35Ps8E8FgQaQpmbedibedibedibedip9UgYp9AdbbaoadfgoaYaQaQpmlvorlvorlvorlvorp9UgYp9AdbbaoadfgoaYaQaQpmwDqkwDqkwDqkwDqkp9UgYp9AdbbaoadfgoaYaQaQpmxmPsxmPsxmPsxmPsp9UgYp9AdbbaoadfgoaYaLa8ApmwKDYq8AkEx3m5P8Es8FgLa3a5pmwKDYq8AkEx3m5P8Es8Fg8ApmbezHdiOAlvCXorQLgQaQpmbedibedibedibedip9UgYp9AdbbaoadfgoaYaQaQpmlvorlvorlvorlvorp9UgYp9AdbbaoadfgoaYaQaQpmwDqkwDqkwDqkwDqkp9UgYp9AdbbaoadfgoaYaQaQpmxmPsxmPsxmPsxmPsp9UgYp9AdbbaoadfgoaYaLa8ApmwDKYqk8AExm35Ps8E8FgQaQpmbedibedibedibedip9UgYp9AdbbaoadfgoaYaQaQpmlvorlvorlvorlvorp9UgYp9AdbbaoadfgoaYaQaQpmwDqkwDqkwDqkwDqkp9UgYp9AdbbaoadfgoaYaQaQpmxmPsxmPsxmPsxmPsp9UgYp9AdbbaoadfhiaXczfgXak6mbkkazclfgzad6mbkasavcjdfaqad2;8qbbavavcjdfaqcufad2fad;8qbbaqaDfhDc9:hoalmexikkc9:hoxekcbc99aral9Radcaadca0ESEhokavcj;kbf8Kjjjjbaokwbz:bjjjbk;tzeHu8Jjjjjbc;ae9Rgv8Kjjjjbc9:hodnaeci9UgrcHfal0mbcuhoaiRbbgwc;WeGc;Ge9hmbawcsGgDce0mbavc;abfcFecje;8kbavcUf9cu83ibavc8Wf9cu83ibavcyf9cu83ibavcaf9cu83ibavcKf9cu83ibavczf9cu83ibav9cu83iwav9cu83ibaialfc9WfhqaicefgwarfhodnaeTmbcmcsaDceSEhkcbhxcbhmcbhrcbhicbhlindnaoaq9nmbc9:hoxikdndnawRbbgDc;Ve0mbavc;abfalaDcu7gPcl4fcsGcitfgsydlhzasydbhHdnaDcsGgDak9pmbavaiaPfcsGcdtfydbaxaDEhsaDThDdndnadcd9hmbabarcetfgPaH87ebaPcdfaz87ebaPclfas87ebxekabarcdtfgPaHBdbaPclfazBdbaPcwfasBdbkaxaDfhxavc;abfalcitfgPasBdbaPazBdlavaicdtfasBdbavc;abfalcefcsGglcitfgPaHBdbaPasBdlaiaDfhialcefhlxdkdndnaDcsSmbamaDfaDc987fcefhmxekaocefhDao8SbbgscFeGhPdndnascu9mmbaDhoxekaocvfhoaPcFbGhPcrhsdninaD8SbbgOcFbGastaPVhPaOcu9kmeaDcefhDascrfgsc8J9hmbxdkkaDcefhokaPce4cbaPceG9R7amfhmkdndnadcd9hmbabarcetfgDaH87ebaDcdfaz87ebaDclfam87ebxekabarcdtfgDaHBdbaDclfazBdbaDcwfamBdbkavc;abfalcitfgDamBdbaDazBdlavaicdtfamBdbavc;abfalcefcsGglcitfgDaHBdbaDamBdlaicefhialcefhlxekdnaDcpe0mbaxcefgOavaiaqaDcsGfRbbgscl49RcsGcdtfydbascz6gPEhDavaias9RcsGcdtfydbaOaPfgzascsGgOEhsaOThOdndnadcd9hmbabarcetfgHax87ebaHcdfaD87ebaHclfas87ebxekabarcdtfgHaxBdbaHclfaDBdbaHcwfasBdbkavaicdtfaxBdbavc;abfalcitfgHaDBdbaHaxBdlavaicefgicsGcdtfaDBdbavc;abfalcefcsGcitfgHasBdbaHaDBdlavaiaPfcsGgicdtfasBdbavc;abfalcdfcsGglcitfgDaxBdbaDasBdlalcefhlaiaOfhiazaOfhxxekaxcbaoRbbgHEgAaDc;:eSgDfhzaHcsGhCaHcl4hXdndnaHcs0mbazcefhOxekazhOavaiaX9RcsGcdtfydbhzkdndnaCmbaOcefhxxekaOhxavaiaH9RcsGcdtfydbhOkdndnaDTmbaocefhDxekaocdfhDao8SbegPcFeGhsdnaPcu9kmbaocofhAascFbGhscrhodninaD8SbbgPcFbGaotasVhsaPcu9kmeaDcefhDaocrfgoc8J9hmbkaAhDxekaDcefhDkasce4cbasceG9R7amfgmhAkdndnaXcsSmbaDhsxekaDcefhsaD8SbbgocFeGhPdnaocu9kmbaDcvfhzaPcFbGhPcrhodninas8SbbgDcFbGaotaPVhPaDcu9kmeascefhsaocrfgoc8J9hmbkazhsxekascefhskaPce4cbaPceG9R7amfgmhzkdndnaCcsSmbashoxekascefhoas8SbbgDcFeGhPdnaDcu9kmbascvfhOaPcFbGhPcrhDdninao8SbbgscFbGaDtaPVhPascu9kmeaocefhoaDcrfgDc8J9hmbkaOhoxekaocefhokaPce4cbaPceG9R7amfgmhOkdndnadcd9hmbabarcetfgDaA87ebaDcdfaz87ebaDclfaO87ebxekabarcdtfgDaABdbaDclfazBdbaDcwfaOBdbkavc;abfalcitfgDazBdbaDaABdlavaicdtfaABdbavc;abfalcefcsGcitfgDaOBdbaDazBdlavaicefgicsGcdtfazBdbavc;abfalcdfcsGcitfgDaABdbaDaOBdlavaiaHcz6aXcsSVfgicsGcdtfaOBdbaiaCTaCcsSVfhialcifhlkawcefhwalcsGhlaicsGhiarcifgrae6mbkkcbc99aoaqSEhokavc;aef8Kjjjjbaok:flevu8Jjjjjbcz9Rhvc9:hodnaecvfal0mbcuhoaiRbbc;:eGc;qe9hmbav9cb83iwaicefhraialfc98fhwdnaeTmbdnadcdSmbcbhDindnaraw6mbc9:skarcefhoar8SbbglcFeGhidndnalcu9mmbaohrxekarcvfhraicFbGhicrhldninao8SbbgdcFbGaltaiVhiadcu9kmeaocefhoalcrfglc8J9hmbxdkkaocefhrkabaDcdtfaic8Etc8F91aicd47avcwfaiceGcdtVgoydbfglBdbaoalBdbaDcefgDae9hmbxdkkcbhDindnaraw6mbc9:skarcefhoar8SbbglcFeGhidndnalcu9mmbaohrxekarcvfhraicFbGhicrhldninao8SbbgdcFbGaltaiVhiadcu9kmeaocefhoalcrfglc8J9hmbxdkkaocefhrkabaDcetfaic8Etc8F91aicd47avcwfaiceGcdtVgoydbfgl87ebaoalBdbaDcefgDae9hmbkkcbc99arawSEhokaok:wPliuo97eue978Jjjjjbca9Rhiaec98Ghldndnadcl9hmbdnalTmbcbhvabhdinadadpbbbgocKp:RecKp:Sep;6egraocwp:RecKp:Sep;6earp;Geaoczp:RecKp:Sep;6egwp;Gep;Kep;LegDpxbbbbbbbbbbbbbbbbp:2egqarpxbbbjbbbjbbbjbbbjgkp9op9rp;Kegrpxbb;:9cbb;:9cbb;:9cbb;:9cararp;MeaDaDp;Meawaqawakp9op9rp;Kegrarp;Mep;Kep;Kep;Jep;Negwp;Mepxbbn0bbn0bbn0bbn0gqp;KepxFbbbFbbbFbbbFbbbp9oaopxbbbFbbbFbbbFbbbFp9op9qarawp;Meaqp;Kecwp:RepxbFbbbFbbbFbbbFbbp9op9qaDawp;Meaqp;Keczp:RepxbbFbbbFbbbFbbbFbp9op9qpkbbadczfhdavclfgval6mbkkalae9pmeaipxbbbbbbbbbbbbbbbbgqpklbaiabalcdtfgdaeciGglcdtgv;8qbbdnalTmbaiaipblbgocKp:RecKp:Sep;6egraocwp:RecKp:Sep;6earp;Geaoczp:RecKp:Sep;6egwp;Gep;Kep;LegDaqp:2egqarpxbbbjbbbjbbbjbbbjgkp9op9rp;Kegrpxbb;:9cbb;:9cbb;:9cbb;:9cararp;MeaDaDp;Meawaqawakp9op9rp;Kegrarp;Mep;Kep;Kep;Jep;Negwp;Mepxbbn0bbn0bbn0bbn0gqp;KepxFbbbFbbbFbbbFbbbp9oaopxbbbFbbbFbbbFbbbFp9op9qarawp;Meaqp;Kecwp:RepxbFbbbFbbbFbbbFbbp9op9qaDawp;Meaqp;Keczp:RepxbbFbbbFbbbFbbbFbp9op9qpklbkadaiav;8qbbskdnalTmbcbhvabhdinadczfgxaxpbbbgopxbbbbbbFFbbbbbbFFgkp9oadpbbbgDaopmlvorxmPsCXQL358E8FpxFubbFubbFubbFubbp9op;6eaDaopmbediwDqkzHOAKY8AEgoczp:Sep;6egrp;Geaoczp:Reczp:Sep;6egwp;Gep;Kep;Legopxb;:FSb;:FSb;:FSb;:FSawaopxbbbbbbbbbbbbbbbbp:2egqawpxbbbjbbbjbbbjbbbjgmp9op9rp;Kegwawp;Meaoaop;Mearaqaramp9op9rp;Kegoaop;Mep;Kep;Kep;Jep;Negrp;Mepxbbn0bbn0bbn0bbn0gqp;Keczp:Reawarp;Meaqp;KepxFFbbFFbbFFbbFFbbp9op9qgwaoarp;Meaqp;KepxFFbbFFbbFFbbFFbbp9ogopmwDKYqk8AExm35Ps8E8Fp9qpkbbadaDakp9oawaopmbezHdiOAlvCXorQLp9qpkbbadcafhdavclfgval6mbkkalae9pmbaiaeciGgvcitgdfcbcaad9R;8kbaiabalcitfglad;8qbbdnavTmbaiaipblzgopxbbbbbbFFbbbbbbFFgkp9oaipblbgDaopmlvorxmPsCXQL358E8FpxFubbFubbFubbFubbp9op;6eaDaopmbediwDqkzHOAKY8AEgoczp:Sep;6egrp;Geaoczp:Reczp:Sep;6egwp;Gep;Kep;Legopxb;:FSb;:FSb;:FSb;:FSawaopxbbbbbbbbbbbbbbbbp:2egqawpxbbbjbbbjbbbjbbbjgmp9op9rp;Kegwawp;Meaoaop;Mearaqaramp9op9rp;Kegoaop;Mep;Kep;Kep;Jep;Negrp;Mepxbbn0bbn0bbn0bbn0gqp;Keczp:Reawarp;Meaqp;KepxFFbbFFbbFFbbFFbbp9op9qgwaoarp;Meaqp;KepxFFbbFFbbFFbbFFbbp9ogopmwDKYqk8AExm35Ps8E8Fp9qpklzaiaDakp9oawaopmbezHdiOAlvCXorQLp9qpklbkalaiad;8qbbkk;4wllue97euv978Jjjjjbc8W9Rhidnaec98GglTmbcbhvabhoinaiaopbbbgraoczfgwpbbbgDpmlvorxmPsCXQL358E8Fgqczp:Segkclp:RepklbaopxbbjZbbjZbbjZbbjZpx;Zl81Z;Zl81Z;Zl81Z;Zl81Zakpxibbbibbbibbbibbbp9qp;6ep;NegkaraDpmbediwDqkzHOAKY8AEgrczp:Reczp:Sep;6ep;MegDaDp;Meakarczp:Sep;6ep;Megxaxp;Meakaqczp:Reczp:Sep;6ep;Megqaqp;Mep;Kep;Kep;Lepxbbbbbbbbbbbbbbbbp:4ep;Jepxb;:FSb;:FSb;:FSb;:FSgkp;Mepxbbn0bbn0bbn0bbn0grp;KepxFFbbFFbbFFbbFFbbgmp9oaxakp;Mearp;Keczp:Rep9qgxaqakp;Mearp;Keczp:ReaDakp;Mearp;Keamp9op9qgkpmbezHdiOAlvCXorQLgrp5baipblbpEb:T:j83ibaocwfarp5eaipblbpEe:T:j83ibawaxakpmwDKYqk8AExm35Ps8E8Fgkp5baipblbpEd:T:j83ibaocKfakp5eaipblbpEi:T:j83ibaocafhoavclfgval6mbkkdnalae9pmbaiaeciGgvcitgofcbcaao9R;8kbaiabalcitfgwao;8qbbdnavTmbaiaipblbgraipblzgDpmlvorxmPsCXQL358E8Fgqczp:Segkclp:RepklaaipxbbjZbbjZbbjZbbjZpx;Zl81Z;Zl81Z;Zl81Z;Zl81Zakpxibbbibbbibbbibbbp9qp;6ep;NegkaraDpmbediwDqkzHOAKY8AEgrczp:Reczp:Sep;6ep;MegDaDp;Meakarczp:Sep;6ep;Megxaxp;Meakaqczp:Reczp:Sep;6ep;Megqaqp;Mep;Kep;Kep;Lepxbbbbbbbbbbbbbbbbp:4ep;Jepxb;:FSb;:FSb;:FSb;:FSgkp;Mepxbbn0bbn0bbn0bbn0grp;KepxFFbbFFbbFFbbFFbbgmp9oaxakp;Mearp;Keczp:Rep9qgxaqakp;Mearp;Keczp:ReaDakp;Mearp;Keamp9op9qgkpmbezHdiOAlvCXorQLgrp5baipblapEb:T:j83ibaiarp5eaipblapEe:T:j83iwaiaxakpmwDKYqk8AExm35Ps8E8Fgkp5baipblapEd:T:j83izaiakp5eaipblapEi:T:j83iKkawaiao;8qbbkk:Pddiue978Jjjjjbc;ab9Rhidnadcd4ae2glc98GgvTmbcbheabhdinadadpbbbgocwp:Recwp:Sep;6eaocep:SepxbbjFbbjFbbjFbbjFp9opxbbjZbbjZbbjZbbjZp:Uep;Mepkbbadczfhdaeclfgeav6mbkkdnaval9pmbaialciGgecdtgdVcbc;abad9R;8kbaiabavcdtfgvad;8qbbdnaeTmbaiaipblbgocwp:Recwp:Sep;6eaocep:SepxbbjFbbjFbbjFbbjFp9opxbbjZbbjZbbjZbbjZp:Uep;Mepklbkavaiad;8qbbkk9teiucbcbydj1jjbgeabcifc98GfgbBdj1jjbdndnabZbcztgd9nmbcuhiabad9RcFFifcz4nbcuSmekaehikaikkkebcjwklz9Tbb\";\n\n\tvar detector = new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,3,2,0,0,5,3,1,0,1,12,1,0,10,22,2,12,0,65,0,65,0,65,0,252,10,0,0,11,7,0,65,0,253,15,26,11]);\n\tvar wasmpack = new Uint8Array([32,0,65,2,1,106,34,33,3,128,11,4,13,64,6,253,10,7,15,116,127,5,8,12,40,16,19,54,20,9,27,255,113,17,42,67,24,23,146,148,18,14,22,45,70,69,56,114,101,21,25,63,75,136,108,28,118,29,73,115]);\n\n\tif (typeof WebAssembly !== 'object') {\n\t\treturn {\n\t\t\tsupported: false,\n\t\t};\n\t}\n\n\tvar wasm = WebAssembly.validate(detector) ? wasm_simd : wasm_base;\n\n\tvar instance;\n\n\tvar ready =\n\t\tWebAssembly.instantiate(unpack(wasm), {})\n\t\t.then(function(result) {\n\t\t\tinstance = result.instance;\n\t\t\tinstance.exports.__wasm_call_ctors();\n\t\t});\n\n\tfunction unpack(data) {\n\t\tvar result = new Uint8Array(data.length);\n\t\tfor (var i = 0; i < data.length; ++i) {\n\t\t\tvar ch = data.charCodeAt(i);\n\t\t\tresult[i] = ch > 96 ? ch - 97 : ch > 64 ? ch - 39 : ch + 4;\n\t\t}\n\t\tvar write = 0;\n\t\tfor (var i = 0; i < data.length; ++i) {\n\t\t\tresult[write++] = (result[i] < 60) ? wasmpack[result[i]] : (result[i] - 60) * 64 + result[++i];\n\t\t}\n\t\treturn result.buffer.slice(0, write);\n\t}\n\n\tfunction decode(instance, fun, target, count, size, source, filter) {\n\t\tvar sbrk = instance.exports.sbrk;\n\t\tvar count4 = (count + 3) & ~3;\n\t\tvar tp = sbrk(count4 * size);\n\t\tvar sp = sbrk(source.length);\n\t\tvar heap = new Uint8Array(instance.exports.memory.buffer);\n\t\theap.set(source, sp);\n\t\tvar res = fun(tp, count, size, sp, source.length);\n\t\tif (res == 0 && filter) {\n\t\t\tfilter(tp, count4, size);\n\t\t}\n\t\ttarget.set(heap.subarray(tp, tp + count * size));\n\t\tsbrk(tp - sbrk(0));\n\t\tif (res != 0) {\n\t\t\tthrow new Error(\"Malformed buffer data: \" + res);\n\t\t}\n\t}\n\n\tvar filters = {\n\t\tNONE: \"\",\n\t\tOCTAHEDRAL: \"meshopt_decodeFilterOct\",\n\t\tQUATERNION: \"meshopt_decodeFilterQuat\",\n\t\tEXPONENTIAL: \"meshopt_decodeFilterExp\",\n\t};\n\n\tvar decoders = {\n\t\tATTRIBUTES: \"meshopt_decodeVertexBuffer\",\n\t\tTRIANGLES: \"meshopt_decodeIndexBuffer\",\n\t\tINDICES: \"meshopt_decodeIndexSequence\",\n\t};\n\n\tvar workers = [];\n\tvar requestId = 0;\n\n\tfunction createWorker(url) {\n\t\tvar worker = {\n\t\t\tobject: new Worker(url),\n\t\t\tpending: 0,\n\t\t\trequests: {}\n\t\t};\n\n\t\tworker.object.onmessage = function(event) {\n\t\t\tvar data = event.data;\n\n\t\t\tworker.pending -= data.count;\n\t\t\tworker.requests[data.id][data.action](data.value);\n\t\t\tdelete worker.requests[data.id];\n\t\t};\n\n\t\treturn worker;\n\t}\n\n\tfunction initWorkers(count) {\n\t\tvar source =\n\t\t\t\"self.ready = WebAssembly.instantiate(new Uint8Array([\" + new Uint8Array(unpack(wasm)) + \"]), {})\" +\n\t\t\t\".then(function(result) { result.instance.exports.__wasm_call_ctors(); return result.instance; });\" +\n\t\t\t\"self.onmessage = \" + workerProcess.name + \";\" + decode.toString() + workerProcess.toString();\n\n\t\tvar blob = new Blob([source], {type: 'text/javascript'});\n\t\tvar url = URL.createObjectURL(blob);\n\n\t\tfor (var i = workers.length; i < count; ++i) {\n\t\t\tworkers[i] = createWorker(url);\n\t\t}\n\n\t\tfor (var i = count; i < workers.length; ++i) {\n\t\t\tworkers[i].object.postMessage({});\n\t\t}\n\n\t\tworkers.length = count;\n\n\t\tURL.revokeObjectURL(url);\n\t}\n\n\tfunction decodeWorker(count, size, source, mode, filter) {\n\t\tvar worker = workers[0];\n\n\t\tfor (var i = 1; i < workers.length; ++i) {\n\t\t\tif (workers[i].pending < worker.pending) {\n\t\t\t\tworker = workers[i];\n\t\t\t}\n\t\t}\n\n\t\treturn new Promise(function (resolve, reject) {\n\t\t\tvar data = new Uint8Array(source);\n\t\t\tvar id = ++requestId;\n\n\t\t\tworker.pending += count;\n\t\t\tworker.requests[id] = { resolve: resolve, reject: reject };\n\t\t\tworker.object.postMessage({ id: id, count: count, size: size, source: data, mode: mode, filter: filter }, [ data.buffer ]);\n\t\t});\n\t}\n\n\tfunction workerProcess(event) {\n\t\tvar data = event.data;\n\t\tif (!data.id) {\n\t\t\treturn self.close();\n\t\t}\n\t\tself.ready.then(function(instance) {\n\t\t\ttry {\n\t\t\t\tvar target = new Uint8Array(data.count * data.size);\n\t\t\t\tdecode(instance, instance.exports[data.mode], target, data.count, data.size, data.source, instance.exports[data.filter]);\n\t\t\t\tself.postMessage({ id: data.id, count: data.count, action: \"resolve\", value: target }, [ target.buffer ]);\n\t\t\t} catch (error) {\n\t\t\t\tself.postMessage({ id: data.id, count: data.count, action: \"reject\", value: error });\n\t\t\t}\n\t\t});\n\t}\n\n\treturn {\n\t\tready: ready,\n\t\tsupported: true,\n\t\tuseWorkers: function(count) {\n\t\t\tinitWorkers(count);\n\t\t},\n\t\tdecodeVertexBuffer: function(target, count, size, source, filter) {\n\t\t\tdecode(instance, instance.exports.meshopt_decodeVertexBuffer, target, count, size, source, instance.exports[filters[filter]]);\n\t\t},\n\t\tdecodeIndexBuffer: function(target, count, size, source) {\n\t\t\tdecode(instance, instance.exports.meshopt_decodeIndexBuffer, target, count, size, source);\n\t\t},\n\t\tdecodeIndexSequence: function(target, count, size, source) {\n\t\t\tdecode(instance, instance.exports.meshopt_decodeIndexSequence, target, count, size, source);\n\t\t},\n\t\tdecodeGltfBuffer: function(target, count, size, source, mode, filter) {\n\t\t\tdecode(instance, instance.exports[decoders[mode]], target, count, size, source, instance.exports[filters[filter]]);\n\t\t},\n\t\tdecodeGltfBufferAsync: function(count, size, source, mode, filter) {\n\t\t\tif (workers.length > 0) {\n\t\t\t\treturn decodeWorker(count, size, source, decoders[mode], filters[filter]);\n\t\t\t}\n\n\t\t\treturn ready.then(function() {\n\t\t\t\tvar target = new Uint8Array(count * size);\n\t\t\t\tdecode(instance, instance.exports[decoders[mode]], target, count, size, source, instance.exports[filters[filter]]);\n\t\t\t\treturn target;\n\t\t\t});\n\t\t}\n\t};\n})();\n\nexport { MeshoptDecoder };\n","// This file is part of meshoptimizer library and is distributed under the terms of MIT License.\n// Copyright (C) 2016-2023, by Arseny Kapoulkine (arseny.kapoulkine@gmail.com)\nvar MeshoptSimplifier = (function() {\n\t// Built with clang version 16.0.0\n\t// Built from meshoptimizer 0.20\n\tvar wasm = \"b9H79Tebbbe9Ek9Geueu9Geub9Gbb9GPuuuuuuuuuuu99uueu9Gvuuuuub9Gluuuub9Gquuuuuuu99uueu9Gwuuuuuu99ueu9Giuuue999Gluuuueu9GiuuueuizsdilvoirwDbqqbeqlve9Weiiviebeoweuec:G;jekr:Tewo9TW9T9VV95dbH9F9F939H79T9F9J9H229F9Jt9VV7bbz9TW79O9V9Wt9F79P9T9W29P9M95bl8E9TW79O9V9Wt9F79P9T9W29P9M959x9Pt9OcttV9P9I91tW7bvQ9TW79O9V9Wt9F79P9T9W29P9M959q9V9P9Ut7boX9TW79O9V9Wt9F79P9T9W29P9M959t9J9H2Wbra9TW79O9V9Wt9F9V9Wt9P9T9P96W9wWVtW94SWt9J9O9sW9T9H9Wbwl79IV9RbDDwebcekdxmq::9Usdbk;i6iKuY99Ou8Jjjjjbc;W;ab9RgP8KjjjjbaPcwfcbc;Kbz:ljjjb8AaPcualcefgscdtascFFFFi0Ecbyd1:jjjbHjjjjbbgzBdwaPceBd9OaPazBdbaPcuadcitadcFFFFe0Ecbyd1:jjjbHjjjjbbgHBdxaPcdBd9OaPaHBdlaPaeadalcbz:cjjjbaPcualcdtgOalcFFFFi0EgAcbyd1:jjjbHjjjjbbgCBdzaPciBd9OaPaAcbyd1:jjjbHjjjjbbgXBdCaPclBd9Oalcd4alfhQcehLinaLgscethLasaQ6mbkcbhKaPcuascdtgLascFFFFi0Ecbyd1:jjjbHjjjjbbgQBdKaPcvBd9OaQcFeaLz:ljjjbhYdnalTmbavcd4h8AascufhEinaiaKa8A2cdtfg3ydlgscH4as7c:F:b:DD2a3ydbgscH4as7c;D;O:B8J27a3ydwgscH4as7c:3F;N8N27hQcbhsdndninaYaQaEGgQcdtfg5ydbgLcuSmeaiaLa8A2cdtfa3cxz:ojjjbTmdascefgsaQfhQasaE9nmbxdkka5aKBdbaKhLkaCaKcdtfaLBdbaKcefgKal9hmbkcbhsaXhLinaLasBdbaLclfhLalascefgs9hmbkcbhsaChLaXhQindnasaLydbgESmbaQaXaEcdtfgEydbBdbaEasBdbkaLclfhLaQclfhQalascefgs9hmbkkcbh8EaYcbyd:m:jjjbH:bjjjbbaPclBd9OaPalcbyd1:jjjbHjjjjbbgEBdKaPcvBd9OaPaAcbyd1:jjjbHjjjjbbgsBd3aPcoBd9OaPaAcbyd1:jjjbHjjjjbbgLBdaaPcrBd9OascFeaOz:ljjjbh8FaLcFeaOz:ljjjbhadnalTmbaHcwfhhindnaza8EgQcefg8Ecdtfydbg3azaQcdtgsfydbgLSmba3aL9RhOaHaLcitfhgaaasfh8Ja8FasfhKcbh8Aindndnaga8Acitfydbg5aQ9hmbaKaQBdba8JaQBdbxekdnaza5cdtg8KfgsclfydbgLasydbgsSmbaHascitg3fydbaQSmeaLas9Rh8Lascu7aLfhYaha3fhLcbhsinaYasSmeascefhsaLydbh3aLcwfhLa3aQ9hmbkasa8L6mekaaa8KfgsaQa5asydbcuSEBdbaKa5aQaKydbcuSEBdbka8Acefg8AaO9hmbkka8Eal9hmbkaChLaXhQaah3a8Fh8AcbhsindndnasaLydbg59hmbdnasaQydbg59hmba8Aydbh5dna3ydbgYcu9hmba5cu9hmbaEasfcb86bbxikaEasfhKdnasaYSmbasa5SmbaKce86bbxikaKcl86bbxdkdnasaXa5cdtgYfydb9hmbdna3ydbgKcuSmbasaKSmba8AydbgOcuSmbasaOSmbaaaYfydbggcuSmbaga5Smba8FaYfydbgYcuSmbaYa5SmbdnaCaKcdtfydbaCaYcdtfydb9hmbaCaOcdtfydbaCagcdtfydb9hmbaEasfcd86bbxlkaEasfcl86bbxikaEasfcl86bbxdkaEasfcl86bbxekaEasfaEa5fRbb86bbkaLclfhLaQclfhQa3clfh3a8Aclfh8Aalascefgs9hmbkaxceGTmbaEhsalhLindnasRbbce9hmbascl86bbkascefhsaLcufgLmbkkcualcx2alc;v:Q;v:Qe0Ecbyd1:jjjbHjjjjbbh8JaPcwfaPyd9Ogscdtfa8JBdbaPascefgOBd9Oa8Jaialavz:djjjbdndnaDmbcbhvxekcbh5aPcwfaOcdtfcuaDal2gLcdtaLcFFFFi0Ecbyd1:jjjbHjjjjbbgvBdbaPascdfgOBd9OalTmbarcd4cdthYaDcdthKavh8AinaohsawhLa8AhQaDh3inaQasIdbaLIdbNUdbasclfhsaLclfhLaQclfhQa3cufg3mbkaoaYfhoa8AaKfh8Aa5cefg5al9hmbkkaPcwfaOcdtfcualc8S2gsalc;D;O;f8U0EgQcbyd1:jjjbHjjjjbbgLBdbaPaOcefg3Bd9OaLcbasz:ljjjbh8EdndndnaDTmbaPcwfa3cdtfaQcbyd1:jjjbHjjjjbbgoBdbaPaOcdfgLBd9Oaocbasz:ljjjb8AaPcwfaLcdtfcuaDal2gscltgLascFFFFb0Ecbyd1:jjjbHjjjjbbgwBdbaPaOcifBd9OawcbaLz:ljjjb8AadmexdkcbhocbhwadTmekcbh8AaehLindna8JaLclfydbg5cx2fgsIdba8JaLydbgYcx2fgQIdbg8M:tg8Na8JaLcwfydbgKcx2fg3IdlaQIdlgy:tg8PNa3Idba8M:tgIasIdlay:tg8RN:tg8Sa8SNa8Ra3IdwaQIdwgR:tg8UNa8PasIdwaR:tg8RN:tg8Pa8PNa8RaINa8Ua8NN:tg8Na8NNMM:rgIJbbbb9ETmba8SaI:vh8Sa8NaI:vh8Na8PaI:vh8Pka8EaCaYcdtfydbc8S2fgsa8PaI:rgIa8PNNg8RasIdbMUdbasa8NaIa8NNg8VNg8UasIdlMUdlasa8SaIa8SNg8WNg8XasIdwMUdwasa8Va8PNg8VasIdxMUdxasa8Wa8PNg8YasIdzMUdzasa8Wa8NNg8WasIdCMUdCasa8PaIa8SaRNa8Pa8MNaya8NNMM:mgyNg8MNg8PasIdKMUdKasa8Na8MNg8NasId3MUd3asa8Sa8MNg8SasIdaMUdaasa8MayNg8MasId8KMUd8KasaIasIdyMUdya8EaCa5cdtfydbc8S2fgsa8RasIdbMUdbasa8UasIdlMUdlasa8XasIdwMUdwasa8VasIdxMUdxasa8YasIdzMUdzasa8WasIdCMUdCasa8PasIdKMUdKasa8NasId3MUd3asa8SasIdaMUdaasa8MasId8KMUd8KasaIasIdyMUdya8EaCaKcdtfydbc8S2fgsa8RasIdbMUdbasa8UasIdlMUdlasa8XasIdwMUdwasa8VasIdxMUdxasa8YasIdzMUdzasa8WasIdCMUdCasa8PasIdKMUdKasa8NasId3MUd3asa8SasIdaMUdaasa8MasId8KMUd8KasaIasIdyMUdyaLcxfhLa8Acifg8Aad6mbkcbh5aehYincbhLinaEaeaLc:G1jjbfydba5fcdtfydbgQfRbbhsdndnaEaYaLfydbg3fRbbg8Ac99fcFeGcpe0mbasceSmbascd9hmekdna8AcufcFeGce0mba8Fa3cdtfydbaQ9hmekdnascufcFeGce0mbaaaQcdtfydba39hmekdna8Acv2asfc:W1jjbfRbbTmbaCaQcdtfydbaCa3cdtfydb0mekJbbacJbbjZasceSEhIa8AceShOa8JaeaLc:K1jjbfydba5fcdtfydbcx2fhsdna8JaQcx2fg8AIdwa8Ja3cx2fgKIdwgy:tg8Pa8PNa8AIdbaKIdbgR:tg8Na8NNa8AIdlaKIdlg8R:tg8Sa8SNMM:rg8MJbbbb9ETmba8Pa8M:vh8Pa8Sa8M:vh8Sa8Na8M:vh8NkJbbacaIaOEh8WdnasIdway:tgIa8PaIa8PNasIdbaR:tg8Xa8NNa8SasIdla8R:tg8VNMMg8UN:tgIaINa8Xa8Na8UN:tg8Pa8PNa8Va8Sa8UN:tg8Na8NNMM:rg8SJbbbb9ETmbaIa8S:vhIa8Na8S:vh8Na8Pa8S:vh8Pka8EaCa3cdtfydbc8S2fgsa8Pa8Wa8MNg8Sa8PNNg8UasIdbMUdbasa8Na8Sa8NNg8WNg8XasIdlMUdlasaIa8SaINg8MNg8VasIdwMUdwasa8Wa8PNg8WasIdxMUdxasa8Ma8PNg8YasIdzMUdzasa8Ma8NNg8ZasIdCMUdCasa8Pa8SaIayNa8PaRNa8Ra8NNMM:mgyNg8MNg8PasIdKMUdKasa8Na8MNg8NasId3MUd3asaIa8MNgIasIdaMUdaasa8MayNg8MasId8KMUd8Kasa8SasIdyMUdya8EaCaQcdtfydbc8S2fgsa8UasIdbMUdbasa8XasIdlMUdlasa8VasIdwMUdwasa8WasIdxMUdxasa8YasIdzMUdzasa8ZasIdCMUdCasa8PasIdKMUdKasa8NasId3MUd3asaIasIdaMUdaasa8MasId8KMUd8Kasa8SasIdyMUdykaLclfgLcx9hmbkaYcxfhYa5cifg5ad6mbkaDTmbcbhYinJbbbbhRa8JaeaYcdtfgsclfydbgKcx2fgLIdwa8JasydbgOcx2fgQIdwg8V:tg8Na8NNaLIdbaQIdbg8Y:tgIaINaLIdlaQIdlg8Z:tg8Sa8SNMMg8Wa8Jascwfydbggcx2fgsIdwa8V:tg8MNa8Na8Na8MNaIasIdba8Y:tgyNa8SasIdla8Z:tg8RNMMg8PN:tJbbbbJbbjZa8Wa8Ma8MNayayNa8Ra8RNMMg8XNa8Pa8PN:tg8U:va8UJbbbb9BEg8UNh80a8Xa8NNa8Ma8PN:ta8UNh81a8Wa8RNa8Sa8PN:ta8UNhBa8Xa8SNa8Ra8PN:ta8UNh83a8WayNaIa8PN:ta8UNhUa8XaINaya8PN:ta8UNh85aIa8RNaya8SN:tg8Pa8PNa8Sa8MNa8Ra8NN:tg8Pa8PNa8NayNa8MaIN:tg8Pa8PNMM:r:rh8PavaOaD2cdtfhLavagaD2cdtfhQavaKaD2cdtfh3a8V:mh86a8Z:mh87a8Y:mh88cbh8AaDh5Jbbbbh8RJbbbbh8UJbbbbh8WJbbbbh8XJbbbbh8VJbbbbh8YJbbbbh8ZJbbbbh89Jbbbbh8:inaPc;Wbfa8Afgscwfa8Pa81a3IdbaLIdbg8M:tg8SNa80aQIdba8M:tgyNMg8NNUdbasclfa8Pa83a8SNaBayNMgINUdbasa8Pa85a8SNaUayNMg8SNUdbascxfa8Pa86a8NNa87aINa8Ma88a8SNMMMg8MNUdba8Pa8NaINNa8XMh8Xa8Pa8Na8SNNa8VMh8Va8PaIa8SNNa8YMh8Ya8Pa8Ma8MNNaRMhRa8Pa8Na8MNNa8RMh8Ra8PaIa8MNNa8UMh8Ua8Pa8Sa8MNNa8WMh8Wa8Pa8Na8NNNa8ZMh8Za8PaIaINNa89Mh89a8Pa8Sa8SNNa8:Mh8:aLclfhLa3clfh3aQclfhQa8Aczfh8Aa5cufg5mbkaoaCaOcdtfydbgLc8S2fgsa8:asIdbMUdbasa89asIdlMUdlasa8ZasIdwMUdwasa8YasIdxMUdxasa8VasIdzMUdzasa8XasIdCMUdCasa8WasIdKMUdKasa8UasId3MUd3asa8RasIdaMUdaasaRasId8KMUd8Kasa8PasIdyMUdyaoaCaKcdtfydbgKc8S2fgsa8:asIdbMUdbasa89asIdlMUdlasa8ZasIdwMUdwasa8YasIdxMUdxasa8VasIdzMUdzasa8XasIdCMUdCasa8WasIdKMUdKasa8UasId3MUd3asa8RasIdaMUdaasaRasId8KMUd8Kasa8PasIdyMUdyaoaCagcdtfydbgOc8S2fgsa8:asIdbMUdbasa89asIdlMUdlasa8ZasIdwMUdwasa8YasIdxMUdxasa8VasIdzMUdzasa8XasIdCMUdCasa8WasIdKMUdKasa8UasId3MUd3asa8RasIdaMUdaasaRasId8KMUd8Kasa8PasIdyMUdyawaLaD2cltfh5cbhLaDh3ina5aLfgsaPc;WbfaLfgQIdbasIdbMUdbasclfg8AaQclfIdba8AIdbMUdbascwfg8AaQcwfIdba8AIdbMUdbascxfgsaQcxfIdbasIdbMUdbaLczfhLa3cufg3mbkawaKaD2cltfh5cbhLaDh3ina5aLfgsaPc;WbfaLfgQIdbasIdbMUdbasclfg8AaQclfIdba8AIdbMUdbascwfg8AaQcwfIdba8AIdbMUdbascxfgsaQcxfIdbasIdbMUdbaLczfhLa3cufg3mbkawaOaD2cltfh5cbhLaDh3ina5aLfgsaPc;WbfaLfgQIdbasIdbMUdbasclfg8AaQclfIdba8AIdbMUdbascwfg8AaQcwfIdba8AIdbMUdbascxfgsaQcxfIdbasIdbMUdbaLczfhLa3cufg3mbkaYcifgYad6mbkkdnabaeSmbabaeadcdtz:kjjjb8AkaPydbhZcbhsdnalTmbaZclfhsaZydbh3aEhLalh8AcbhQincbasydbg5a39RaLRbbcpeGEaQfhQaLcefhLasclfhsa5h3a8Acufg8AmbkaQce4hskcuadas9Rcifgrcx2arc;v:Q;v:Qe0Ecbyd1:jjjbHjjjjbbh8LaPcwfaPyd9Ogscdtfa8LBdbaPascefgLBd9OaPcwfaLcdtfcuarcdtarcFFFFi0Ecbyd1:jjjbHjjjjbbgxBdbaPascdfgLBd9OaPcwfaLcdtfaAcbyd1:jjjbHjjjjbbgHBdbaPascifgLBd9OaPcwfaLcdtfalcbyd1:jjjbHjjjjbbgnBdbaPasclfBd9OJbbbbh8Ydnadaq9nmbdnarci6mbakakNh8VaDclthca8Lcwfh9cJbbbbh8YinaPabadghalaCz:cjjjbabhOcbhzcbhKincbhsindnaCaOasfydbgQcdtgYfydbg8AaCabasc;m1jjbfydbaKfcdtfydbgLcdtfydbg5SmbaEaLfRbbgecv2aEaQfRbbg3fc;G1jjbfRbbg8Ka3cv2aefggc;G1jjbfRbbgiVcFeGTmbdnagc:W1jjbfRbbTmba5a8A0mekdna3ae9hmba3cufcFeGce0mba8FaYfydbaL9hmeka8Lazcx2fg3aLaQaicFeGg8AEBdla3aQaLa8AEBdba3a8Aa8KGcb9hBdwazcefhzkasclfgscx9hmbkdnaKcifgKah9pmbaOcxfhOazcifar9nmekkdnazmbahhdxikcbheinJbbbbJbbjZa8EaCa8Laecx2fg3ydlg8Aa3ydbg5a3ydwgLEgKcdtfydbg8Kc8S2gifgsIdyg8P:va8PJbbbb9BEasIdwa8Ja5a8AaLEgYcx2fgLIdwg8SNasIdzaLIdbg8MNasIdaMg8Pa8PMMa8SNasIdlaLIdlgyNasIdCa8SNasId3Mg8Pa8PMMayNasIdba8MNasIdxayNasIdKMg8Pa8PMMa8MNasId8KMMM:lNh8WJbbbbJbbjZa8EaCa5cdtfydbgdc8S2gQfgsIdyg8P:va8PJbbbb9BEasIdwa8Ja8Acx2fgLIdwgINasIdzaLIdbgRNasIdaMg8Pa8PMMaINasIdlaLIdlg8RNasIdCaINasId3Mg8Pa8PMMa8RNasIdbaRNasIdxa8RNasIdKMg8Pa8PMMaRNasId8KMMM:lNh8Xa3cwfhOa3clfhgdnaDTmbaoaQfgQIdwaINaQIdzaRNaQIdaMg8Pa8PMMaINaQIdla8RNaQIdCaINaQId3Mg8Pa8PMMa8RNaQIdbaRNaQIdxa8RNaQIdKMg8Pa8PMMaRNaQId8KMMMh8Nava8AaD2cdtfhLawadaD2cltfhsaQIdyh8UaDhQinaLIdbg8PJbbb;aNascxfIdbaIascwfIdbNaRasIdbNa8RasclfIdbNMMMNa8Pa8PNa8UNa8NMMh8NaLclfhLasczfhsaQcufgQmbkaoaifgQIdwa8SNaQIdza8MNaQIdaMg8Pa8PMMa8SNaQIdlayNaQIdCa8SNaQId3Mg8Pa8PMMayNaQIdba8MNaQIdxayNaQIdKMg8Pa8PMMa8MNaQId8KMMMhIavaYaD2cdtfhLawa8KaD2cltfhsaQIdyhRaDhQinaLIdbg8PJbbb;aNascxfIdba8SascwfIdbNa8MasIdbNayasclfIdbNMMMNa8Pa8PNaRNaIMMhIaLclfhLasczfhsaQcufgQmbka8WaI:lMh8Wa8Xa8N:lMh8Xkaga8AaYa8Xa8W9FgsEBdba3a5aKasEBdbaOa8Xa8WasEUdbaecefgeaz9hmbkaPc;Wbfcbcj;abz:ljjjb8Aa9chsazhLinaPc;WbfasydbcO4c;8ZGfgQaQydbcefBdbascxfhsaLcufgLmbkcbhscbhLinaPc;WbfasfgQydbh3aQaLBdba3aLfhLasclfgscj;ab9hmbkcbhsa9chLinaPc;WbfaLydbcO4c;8ZGfgQaQydbgQcefBdbaxaQcdtfasBdbaLcxfhLazascefgs9hmbkahaq9RgQci9UhJdnalTmbcbhsaHhLinaLasBdbaLclfhLalascefgs9hmbkkcbh9eancbalz:ljjjbhTaQcO9UhSaJce4h9haPydlh9icbhicbhgdnina8Laxagcdtfydbcx2fgOIdwg8Na8V9EmeaiaJ9pmeJFFuuh8Pdna9haz9pmba8Laxa9hcdtfydbcx2fIdwJbb;aZNh8Pkdna8Na8P9ETmbaiaS0mdkdnaTaCaOydlg6cdtg9kfydbg3fg0RbbaTaCaOydbgKcdtg9mfydbg9nfg9oRbbVmbdnaZa9ncdtfgsclfydbgLasydbgsSmbaLas9Rh5a9iascitfhsa8Ja3cx2fgYcwfhdaYclfhAa8Ja9ncx2fg8Kcwfh9pa8Kclfh9qcbhLcehednindnaHasydbcdtfydbgQa3SmbaHasclfydbcdtfydbg8Aa3SmbaQa8ASmba8Ja8Acx2fg8AIdba8JaQcx2fgQIdbgI:tg8Pa9qIdbaQIdlg8S:tg8MNa8KIdbaI:tgya8AIdla8S:tg8NN:ta8PaAIdba8S:tgRNaYIdbaI:tg8Ra8NN:tNa8Na9pIdbaQIdwg8S:tg8UNa8Ma8AIdwa8S:tgIN:ta8NadIdba8S:tg8SNaRaIN:tNaIayNa8Ua8PN:taIa8RNa8Sa8PN:tNMMJbbbb9FmdkascwfhsaLcefgLa56hea5aL9hmbkkaeceGTmba9hcefh9hxeka8Ea3c8S2gQfgsa8Ea9nc8S2g8AfgLIdbasIdbMUdbasaLIdlasIdlMUdlasaLIdwasIdwMUdwasaLIdxasIdxMUdxasaLIdzasIdzMUdzasaLIdCasIdCMUdCasaLIdKasIdKMUdKasaLId3asId3MUd3asaLIdaasIdaMUdaasaLId8KasId8KMUd8KasaLIdyasIdyMUdydnaDTmbaoaQfgsaoa8AfgLIdbasIdbMUdbasaLIdlasIdlMUdlasaLIdwasIdwMUdwasaLIdxasIdxMUdxasaLIdzasIdzMUdzasaLIdCasIdCMUdCasaLIdKasIdKMUdKasaLId3asId3MUd3asaLIdaasIdaMUdaasaLId8KasId8KMUd8KasaLIdyasIdyMUdyaca9n2heaca32hYawhLaDh8AinaLaYfgsaLaefgQIdbasIdbMUdbasclfg5aQclfIdba5IdbMUdbascwfg5aQcwfIdba5IdbMUdbascxfgsaQcxfIdbasIdbMUdbaLczfhLa8Acufg8AmbkkaOcwfhLdndndndnaEaKfgQRbbc9:fPdebdkaKhsinaHascdtgsfa3BdbaXasfydbgsaK9hmbxikkaXa9kfydbhsaXa9mfydbhKaHa9mfa6Bdbash6kaHaKcdtfa6Bdbka9oce86bba0ce86bbaLIdbg8Pa8Ya8Ya8P9DEh8Ya9ecefh9ececdaQRbbceSEaifhikagcefggaz9hmbkkdna9embahhdxikdnalTmbcbhLa8FhsindnasydbgQcuSmbdnaLaHaQcdtg3fydbgQ9hmba8Fa3fydbhQkasaQBdbkasclfhsalaLcefgL9hmbkcbhLaahsindnasydbgQcuSmbdnaLaHaQcdtg3fydbgQ9hmbaaa3fydbhQkasaQBdbkasclfhsalaLcefgL9hmbkkcbhdabhscbh8AindnaHasydbcdtfydbgLaHasclfydbcdtfydbgQSmbaLaHascwfydbcdtfydbg3SmbaQa3Smbabadcdtfg5aLBdba5clfaQBdba5cwfa3Bdbadcifhdkascxfhsa8Acifg8Aah6mbkadaq9nmdxbkkaPabadalaCz:cjjjbkdnamTmbama8Y:rUdbkaPyd9OgscdtaPcwffc98fhCdninasTmeaCydbcbyd:m:jjjbH:bjjjbbaCc98fhCascufhsxbkkaPc;W;abf8Kjjjjbadk;:ieouabydlhvabydbclfcbaicdtz:ljjjbhoadci9UhrdnadTmbdnalTmbaehwadhDinaoalawydbcdtfydbcdtfgqaqydbcefBdbawclfhwaDcufgDmbxdkkaehwadhDinaoawydbcdtfgqaqydbcefBdbawclfhwaDcufgDmbkkdnaiTmbcbhDaohwinawydbhqawaDBdbawclfhwaqaDfhDaicufgimbkkdnadci6mbarcearce0EhdinaecwfydbhwaeclfydbhDaeydbhidnalTmbalawcdtfydbhwalaDcdtfydbhDalaicdtfydbhikavaoaicdtfgqydbcitfaDBdbavaqydbcitfawBdlaqaqydbcefBdbavaoaDcdtfgqydbcitfawBdbavaqydbcitfaiBdlaqaqydbcefBdbavaoawcdtfgwydbcitfaiBdbavawydbcitfaDBdlawawydbcefBdbaecxfheadcufgdmbkkabydbcbBdbk:Zldouv998Jjjjjbca9Rglczfcwfcbyd11jjbBdbalcb8Pdj1jjb83izalcwfcbydN1jjbBdbalcb8Pd:m1jjb83ibdnadTmbaicd4hvdnabTmbavcdthocbhraehwinabarcx2fgiaearav2cdtfgDIdbUdbaiaDIdlUdlaiaDIdwUdwcbhiinalczfaifgDawaifIdbgqaDIdbgkakaq9EEUdbalaifgDaqaDIdbgkakaq9DEUdbaiclfgicx9hmbkawaofhwarcefgrad9hmbxdkkavcdthrcbhwincbhiinalczfaifgDaeaifIdbgqaDIdbgkakaq9EEUdbalaifgDaqaDIdbgkakaq9DEUdbaiclfgicx9hmbkaearfheawcefgwad9hmbkkdnabTmbadTmbJbbbbJbbjZalIdbalIdzgk:tJbbbb:xgqalIdlalIdCgx:tgmamaq9DEgqalIdwalIdKgm:tgPaPaq9DEgq:vaqJbbbb9BEhqinabaqabIdbak:tNUdbabclfgiaqaiIdbax:tNUdbabcwfgiaqaiIdbam:tNUdbabcxfhbadcufgdmbkkk8KbabaeadaialavcbcbcbcbaoarawaDz:bjjjbk8KbabaeadaialavaoarawaDaqakaxamz:bjjjbk;lOowud99wue99iul998Jjjjjbc;Wb9Rgw8KjjjjbdndnarmbcbhDxekawcwfcbc;Kbz:ljjjb8Aawcuadcx2adc;v:Q;v:Qe0Ecbyd1:jjjbHjjjjbbgqBdwawceBd9Oaqaeadaiz:djjjbawcuadcdtadcFFFFi0Egkcbyd1:jjjbHjjjjbbgxBdxawcdBd9Oadcd4adfhmceheinaegicetheaiam6mbkcbhmawcuaicdtgPaicFFFFi0Ecbyd1:jjjbHjjjjbbgsBdzawciBd9Odndnar:Zgz:rJbbbZMgH:lJbbb9p9DTmbaH:Ohexekcjjjj94hekaicufhOc:bwhAcbhCcbhXadhQinaChLaeaAgKcufaeaK9iEamgDcefaeaD9kEhYdndnadTmbaYcuf:YhHaqhiaxheadhmindndnaiIdbaHNJbbbZMg8A:lJbbb9p9DTmba8A:OhAxekcjjjj94hAkaAcCthAdndnaiclfIdbaHNJbbbZMg8A:lJbbb9p9DTmba8A:OhCxekcjjjj94hCkaCcqtaAVhAdndnaicwfIdbaHNJbbbZMg8A:lJbbb9p9DTmba8A:OhCxekcjjjj94hCkaeaAaCVBdbaicxfhiaeclfheamcufgmmbkascFeaPz:ljjjbhEcbh3cbh5indnaEaxa5cdtfydbgAcm4aA7c:v;t;h;Ev2gics4ai7aOGgmcdtfgCydbgecuSmbaeaASmbcehiinaEamaifaOGgmcdtfgCydbgecuSmeaicefhiaeaA9hmbkkaCaABdba3aecuSfh3a5cefg5ad9hmbxdkkascFeaPz:ljjjb8Acbh3kaDaYa3ar0giEhmaLa3aiEhCdna3arSmbaYaKaiEgAam9Rcd9imbdndnaXcl0mbdnaQ:ZgHaL:Zg8A:taY:Yg8EaD:Y:tg8Fa8EaK:Y:tgaa3:Zghaz:tNNNaHaz:taaNa8Aah:tNa8Aaz:ta8FNahaH:tNM:va8EMJbbbZMgH:lJbbb9p9DTmbaH:Ohexdkcjjjj94hexekamaAfcd9Theka3aQaiEhQaXcefgXcs9hmekkdndnaCmbcihicbhDxekcbhiawakcbyd1:jjjbHjjjjbbg5BdCawclBd9OdndnadTmbamcuf:YhHaqhiaxheadhmindndnaiIdbaHNJbbbZMg8A:lJbbb9p9DTmba8A:OhAxekcjjjj94hAkaAcCthAdndnaiclfIdbaHNJbbbZMg8A:lJbbb9p9DTmba8A:OhCxekcjjjj94hCkaCcqtaAVhAdndnaicwfIdbaHNJbbbZMg8A:lJbbb9p9DTmba8A:OhCxekcjjjj94hCkaeaAaCVBdbaicxfhiaeclfheamcufgmmbkascFeaPz:ljjjbhEcbhDcbh3inaxa3cdtgYfydbgAcm4aA7c:v;t;h;Ev2gics4ai7hecbhidndninaEaeaOGgmcdtfgCydbgecuSmednaxaecdtgCfydbaASmbaicefgiamfheaiaO9nmekka5aCfydbhixekaCa3BdbaDhiaDcefhDka5aYfaiBdba3cefg3ad9hmbkcuaDc32giaDc;j:KM;jb0EhexekascFeaPz:ljjjb8AcbhDcbhekawaecbyd1:jjjbHjjjjbbgeBdKawcvBd9Oaecbaiz:ljjjbhOavcd4hxdnadTmbaxcdth3a5hmalhAaqheadhEinaOamydbc32fgiaeIdbaiIdbMUdbaiaeclfIdbaiIdlMUdlaiaecwfIdbaiIdwMUdwaiaAc;81jjbalEgCIdbaiIdxMUdxaiaCIdlaiIdzMUdzaiaCIdwaiIdCMUdCaiaiIdKJbbjZMUdKamclfhmaAa3fhAaecxfheaEcufgEmbkkdnaDTmbaOcxfhiaDheinaictfgmamIdbJbbbbJbbjZaicxfIdbgH:vaHJbbbb9BEgHNUdbaic94fgmaHamIdbNUdbaic98fgmaHamIdbNUdbaiaHaiIdbNUdbaiclfgmaHamIdbNUdbaicwfgmaHamIdbNUdbaic3fhiaecufgembkkcbhAawcuaDcdtgYaDcFFFFi0Egicbyd1:jjjbHjjjjbbgeBd3awcoBd9Oawaicbyd1:jjjbHjjjjbbgEBdaaecFeaYz:ljjjbh3dnadTmbaoaoNh8Aaxcdthxalheina8Aaec;81jjbalEgmIdwaOa5ydbgCc32fgiIdC:tgHaHNamIdbaiIdx:tgHaHNamIdlaiIdz:tgHaHNMMNaqcwfIdbaiIdw:tgHaHNaqIdbaiIdb:tgHaHNaqclfIdbaiIdl:tgHaHNMMMhHdndna3aCcdtgifgmydbcuSmbaEaifIdbaH9ETmekamaABdbaEaifaHUdbka5clfh5aeaxfheaqcxfhqadaAcefgA9hmbkkaba3aYz:kjjjb8AcrhikaicdthiinaiTmeaic98fgiawcwffydbcbyd:m:jjjbH:bjjjbbxbkkawc;Wbf8KjjjjbaDk:Qdidui99ducbhi8Jjjjjbca9Rglczfcwfcbyd11jjbBdbalcb8Pdj1jjb83izalcwfcbydN1jjbBdbalcb8Pd:m1jjb83ibdndnaembJbbjFhvJbbjFhoJbbjFhrxekadcd4cdthwincbhdinalczfadfgDabadfIdbgoaDIdbgrarao9EEUdbaladfgDaoaDIdbgrarao9DEUdbadclfgdcx9hmbkabawfhbaicefgiae9hmbkalIdwalIdK:thralIdlalIdC:thoalIdbalIdz:thvkavJbbbb:xgvaoaoav9DEgoararao9DEk9DeeuabcFeaicdtz:ljjjbhlcbhbdnadTmbindnalaeydbcdtfgiydbcu9hmbaiabBdbabcefhbkaeclfheadcufgdmbkkabk9teiucbcbyd:q:jjjbgeabcifc98GfgbBd:q:jjjbdndnabZbcztgd9nmbcuhiabad9RcFFifcz4nbcuSmekaehikaik;LeeeudndnaeabVciGTmbabhixekdndnadcz9pmbabhixekabhiinaiaeydbBdbaiclfaeclfydbBdbaicwfaecwfydbBdbaicxfaecxfydbBdbaeczfheaiczfhiadc9Wfgdcs0mbkkadcl6mbinaiaeydbBdbaeclfheaiclfhiadc98fgdci0mbkkdnadTmbinaiaeRbb86bbaicefhiaecefheadcufgdmbkkabk;aeedudndnabciGTmbabhixekaecFeGc:b:c:ew2hldndnadcz9pmbabhixekabhiinaialBdbaicxfalBdbaicwfalBdbaiclfalBdbaiczfhiadc9Wfgdcs0mbkkadcl6mbinaialBdbaiclfhiadc98fgdci0mbkkdnadTmbinaiae86bbaicefhiadcufgdmbkkabk9teiucbcbyd:q:jjjbgeabcrfc94GfgbBd:q:jjjbdndnabZbcztgd9nmbcuhiabad9RcFFifcz4nbcuSmekaehikaik9:eiuZbhedndncbyd:q:jjjbgdaecztgi9nmbcuheadai9RcFFifcz4nbcuSmekadhekcbabae9Rcifc98Gcbyd:q:jjjbfgdBd:q:jjjbdnadZbcztge9nmbadae9RcFFifcz4nb8Akk6eiucbhidnadTmbdninabRbbglaeRbbgv9hmeaecefheabcefhbadcufgdmbxdkkalav9Rhikaikk:Iedbcjwk1eFFuuFFuuFFuuFFuFFFuFFFuFbbbbbbbbebbbdbbbbbbbebbbeeebeebebbeeebebbbbbebebbbbbebbbdbbbbbbbbbbbbbbbeeeeebebbbbbebbbbbeebbbbbbbbbbbbbbbbbbbbbc1Dkxebbbdbbb:G9Kbb\";\n\n\tvar wasmpack = new Uint8Array([32,0,65,2,1,106,34,33,3,128,11,4,13,64,6,253,10,7,15,116,127,5,8,12,40,16,19,54,20,9,27,255,113,17,42,67,24,23,146,148,18,14,22,45,70,69,56,114,101,21,25,63,75,136,108,28,118,29,73,115]);\n\n\tif (typeof WebAssembly !== 'object') {\n\t\treturn {\n\t\t\tsupported: false,\n\t\t};\n\t}\n\n\tvar instance;\n\n\tvar ready =\n\t\tWebAssembly.instantiate(unpack(wasm), {})\n\t\t.then(function(result) {\n\t\t\tinstance = result.instance;\n\t\t\tinstance.exports.__wasm_call_ctors();\n\t\t});\n\n\tfunction unpack(data) {\n\t\tvar result = new Uint8Array(data.length);\n\t\tfor (var i = 0; i < data.length; ++i) {\n\t\t\tvar ch = data.charCodeAt(i);\n\t\t\tresult[i] = ch > 96 ? ch - 97 : ch > 64 ? ch - 39 : ch + 4;\n\t\t}\n\t\tvar write = 0;\n\t\tfor (var i = 0; i < data.length; ++i) {\n\t\t\tresult[write++] = (result[i] < 60) ? wasmpack[result[i]] : (result[i] - 60) * 64 + result[++i];\n\t\t}\n\t\treturn result.buffer.slice(0, write);\n\t}\n\n\tfunction assert(cond) {\n\t\tif (!cond) {\n\t\t\tthrow new Error(\"Assertion failed\");\n\t\t}\n\t}\n\n\tfunction bytes(view) {\n\t\treturn new Uint8Array(view.buffer, view.byteOffset, view.byteLength);\n\t}\n\n\tfunction reorder(fun, indices, vertices) {\n\t\tvar sbrk = instance.exports.sbrk;\n\t\tvar ip = sbrk(indices.length * 4);\n\t\tvar rp = sbrk(vertices * 4);\n\t\tvar heap = new Uint8Array(instance.exports.memory.buffer);\n\t\tvar indices8 = bytes(indices);\n\t\theap.set(indices8, ip);\n\t\tvar unique = fun(rp, ip, indices.length, vertices);\n\t\t// heap may have grown\n\t\theap = new Uint8Array(instance.exports.memory.buffer);\n\t\tvar remap = new Uint32Array(vertices);\n\t\tnew Uint8Array(remap.buffer).set(heap.subarray(rp, rp + vertices * 4));\n\t\tindices8.set(heap.subarray(ip, ip + indices.length * 4));\n\t\tsbrk(ip - sbrk(0));\n\n\t\tfor (var i = 0; i < indices.length; ++i)\n\t\t\tindices[i] = remap[indices[i]];\n\n\t\treturn [remap, unique];\n\t}\n\n\tfunction maxindex(source) {\n\t\tvar result = 0;\n\t\tfor (var i = 0; i < source.length; ++i) {\n\t\t\tvar index = source[i];\n\t\t\tresult = result < index ? index : result;\n\t\t}\n\t\treturn result;\n\t}\n\n\tfunction simplify(fun, indices, index_count, vertex_positions, vertex_count, vertex_positions_stride, target_index_count, target_error, options) {\n\t\tvar sbrk = instance.exports.sbrk;\n\t\tvar te = sbrk(4);\n\t\tvar ti = sbrk(index_count * 4);\n\t\tvar sp = sbrk(vertex_count * vertex_positions_stride);\n\t\tvar si = sbrk(index_count * 4);\n\t\tvar heap = new Uint8Array(instance.exports.memory.buffer);\n\t\theap.set(bytes(vertex_positions), sp);\n\t\theap.set(bytes(indices), si);\n\t\tvar result = fun(ti, si, index_count, sp, vertex_count, vertex_positions_stride, target_index_count, target_error, options, te);\n\t\t// heap may have grown\n\t\theap = new Uint8Array(instance.exports.memory.buffer);\n\t\tvar target = new Uint32Array(result);\n\t\tbytes(target).set(heap.subarray(ti, ti + result * 4));\n\t\tvar error = new Float32Array(1);\n\t\tbytes(error).set(heap.subarray(te, te + 4));\n\t\tsbrk(te - sbrk(0));\n\t\treturn [target, error[0]];\n\t}\n\n\tfunction simplifyAttr(fun, indices, index_count, vertex_positions, vertex_count, vertex_positions_stride, vertex_attributes, vertex_attributes_stride, attribute_weights, target_index_count, target_error, options) {\n\t\tvar sbrk = instance.exports.sbrk;\n\t\tvar te = sbrk(4);\n\t\tvar ti = sbrk(index_count * 4);\n\t\tvar sp = sbrk(vertex_count * vertex_positions_stride);\n\t\tvar sa = sbrk(vertex_count * vertex_attributes_stride);\n\t\tvar sw = sbrk(attribute_weights.length * 4);\n\t\tvar si = sbrk(index_count * 4);\n\t\tvar heap = new Uint8Array(instance.exports.memory.buffer);\n\t\theap.set(bytes(vertex_positions), sp);\n\t\theap.set(bytes(vertex_attributes), sa);\n\t\theap.set(bytes(attribute_weights), sw);\n\t\theap.set(bytes(indices), si);\n\t\tvar result = fun(ti, si, index_count, sp, vertex_count, vertex_positions_stride, sa, vertex_attributes_stride, sw, attribute_weights.length, target_index_count, target_error, options, te);\n\t\t// heap may have grown\n\t\theap = new Uint8Array(instance.exports.memory.buffer);\n\t\tvar target = new Uint32Array(result);\n\t\tbytes(target).set(heap.subarray(ti, ti + result * 4));\n\t\tvar error = new Float32Array(1);\n\t\tbytes(error).set(heap.subarray(te, te + 4));\n\t\tsbrk(te - sbrk(0));\n\t\treturn [target, error[0]];\n\t}\n\n\tfunction simplifyScale(fun, vertex_positions, vertex_count, vertex_positions_stride) {\n\t\tvar sbrk = instance.exports.sbrk;\n\t\tvar sp = sbrk(vertex_count * vertex_positions_stride);\n\t\tvar heap = new Uint8Array(instance.exports.memory.buffer);\n\t\theap.set(bytes(vertex_positions), sp);\n\t\tvar result = fun(sp, vertex_count, vertex_positions_stride);\n\t\tsbrk(sp - sbrk(0));\n\t\treturn result;\n\t}\n\n\tfunction simplifyPoints(fun, vertex_positions, vertex_count, vertex_positions_stride, vertex_colors, vertex_colors_stride, color_weight, target_vertex_count) {\n\t\tvar sbrk = instance.exports.sbrk;\n\t\tvar ti = sbrk(target_vertex_count * 4);\n\t\tvar sp = sbrk(vertex_count * vertex_positions_stride);\n\t\tvar sc = sbrk(vertex_count * vertex_colors_stride);\n\t\tvar heap = new Uint8Array(instance.exports.memory.buffer);\n\t\theap.set(bytes(vertex_positions), sp);\n\t\tif (vertex_colors) {\n\t\t\theap.set(bytes(vertex_colors), sc);\n\t\t}\n\t\tvar result = fun(ti, sp, vertex_count, vertex_positions_stride, sc, vertex_colors_stride, color_weight, target_vertex_count);\n\t\t// heap may have grown\n\t\theap = new Uint8Array(instance.exports.memory.buffer);\n\t\tvar target = new Uint32Array(result);\n\t\tbytes(target).set(heap.subarray(ti, ti + result * 4));\n\t\tsbrk(ti - sbrk(0));\n\t\treturn target;\n\t}\n\n\tvar simplifyOptions = {\n\t\tLockBorder: 1,\n\t};\n\n\treturn {\n\t\tready: ready,\n\t\tsupported: true,\n\n\t\t// set this to true to be able to use simplifyPoints and simplifyWithAttributes\n\t\t// note that these functions are experimental and may change interface/behavior in a way that will require revising calling code\n\t\tuseExperimentalFeatures: false,\n\n\t\tcompactMesh: function(indices) {\n\t\t\tassert(indices instanceof Uint32Array || indices instanceof Int32Array || indices instanceof Uint16Array || indices instanceof Int16Array);\n\t\t\tassert(indices.length % 3 == 0);\n\n\t\t\tvar indices32 = indices.BYTES_PER_ELEMENT == 4 ? indices : new Uint32Array(indices);\n\t\t\treturn reorder(instance.exports.meshopt_optimizeVertexFetchRemap, indices32, maxindex(indices) + 1);\n\t\t},\n\n\t\tsimplify: function(indices, vertex_positions, vertex_positions_stride, target_index_count, target_error, flags) {\n\t\t\tassert(indices instanceof Uint32Array || indices instanceof Int32Array || indices instanceof Uint16Array || indices instanceof Int16Array);\n\t\t\tassert(indices.length % 3 == 0);\n\t\t\tassert(vertex_positions instanceof Float32Array);\n\t\t\tassert(vertex_positions.length % vertex_positions_stride == 0);\n\t\t\tassert(vertex_positions_stride >= 3);\n\t\t\tassert(target_index_count >= 0 && target_index_count <= indices.length);\n\t\t\tassert(target_index_count % 3 == 0);\n\t\t\tassert(target_error >= 0 && target_error <= 1);\n\n\t\t\tvar options = 0;\n\t\t\tfor (var i = 0; i < (flags ? flags.length : 0); ++i) {\n\t\t\t\toptions |= simplifyOptions[flags[i]];\n\t\t\t}\n\n\t\t\tvar indices32 = indices.BYTES_PER_ELEMENT == 4 ? indices : new Uint32Array(indices);\n\t\t\tvar result = simplify(instance.exports.meshopt_simplify, indices32, indices.length, vertex_positions, vertex_positions.length / vertex_positions_stride, vertex_positions_stride * 4, target_index_count, target_error, options);\n\t\t\tresult[0] = (indices instanceof Uint32Array) ? result[0] : new indices.constructor(result[0]);\n\n\t\t\treturn result;\n\t\t},\n\n\t\tsimplifyWithAttributes: function(indices, vertex_positions, vertex_positions_stride, vertex_attributes, vertex_attributes_stride, attribute_weights, target_index_count, target_error, flags) {\n\t\t\tassert(this.useExperimentalFeatures); // set useExperimentalFeatures to use this; note that this function is experimental and may change interface in a way that will require revising calling code\n\t\t\tassert(indices instanceof Uint32Array || indices instanceof Int32Array || indices instanceof Uint16Array || indices instanceof Int16Array);\n\t\t\tassert(indices.length % 3 == 0);\n\t\t\tassert(vertex_positions instanceof Float32Array);\n\t\t\tassert(vertex_positions.length % vertex_positions_stride == 0);\n\t\t\tassert(vertex_positions_stride >= 3);\n\t\t\tassert(vertex_attributes instanceof Float32Array);\n\t\t\tassert(vertex_attributes.length % vertex_attributes_stride == 0);\n\t\t\tassert(vertex_attributes_stride >= 0);\n\t\t\tassert(target_index_count >= 0 && target_index_count <= indices.length);\n\t\t\tassert(target_index_count % 3 == 0);\n\t\t\tassert(target_error >= 0 && target_error <= 1);\n\t\t\tassert(Array.isArray(attribute_weights));\n\t\t\tassert(vertex_attributes_stride >= attribute_weights.length);\n\t\t\tassert(attribute_weights.length <= 16);\n\n\t\t\tvar options = 0;\n\t\t\tfor (var i = 0; i < (flags ? flags.length : 0); ++i) {\n\t\t\t\toptions |= simplifyOptions[flags[i]];\n\t\t\t}\n\n\t\t\tvar indices32 = indices.BYTES_PER_ELEMENT == 4 ? indices : new Uint32Array(indices);\n\t\t\tvar result = simplifyAttr(instance.exports.meshopt_simplifyWithAttributes, indices32, indices.length, vertex_positions, vertex_positions.length / vertex_positions_stride, vertex_positions_stride * 4, vertex_attributes, vertex_attributes_stride * 4, new Float32Array(attribute_weights), target_index_count, target_error, options);\n\t\t\tresult[0] = (indices instanceof Uint32Array) ? result[0] : new indices.constructor(result[0]);\n\n\t\t\treturn result;\n\t\t},\n\n\t\tgetScale: function(vertex_positions, vertex_positions_stride) {\n\t\t\tassert(vertex_positions instanceof Float32Array);\n\t\t\tassert(vertex_positions.length % vertex_positions_stride == 0);\n\t\t\tassert(vertex_positions_stride >= 3);\n\t\t\treturn simplifyScale(instance.exports.meshopt_simplifyScale, vertex_positions, vertex_positions.length / vertex_positions_stride, vertex_positions_stride * 4);\n\t\t},\n\n\t\tsimplifyPoints: function(vertex_positions, vertex_positions_stride, target_vertex_count, vertex_colors, vertex_colors_stride, color_weight) {\n\t\t\tassert(this.useExperimentalFeatures); // set useExperimentalFeatures to use this; note that this function is experimental and may change interface in a way that will require revising calling code\n\t\t\tassert(vertex_positions instanceof Float32Array);\n\t\t\tassert(vertex_positions.length % vertex_positions_stride == 0);\n\t\t\tassert(vertex_positions_stride >= 3);\n\t\t\tassert(target_vertex_count >= 0 && target_vertex_count <= vertex_positions.length / vertex_positions_stride);\n\t\t\tif (vertex_colors) {\n\t\t\t\tassert(vertex_colors instanceof Float32Array);\n\t\t\t\tassert(vertex_colors.length % vertex_colors_stride == 0);\n\t\t\t\tassert(vertex_colors_stride >= 3);\n\t\t\t\tassert(vertex_positions.length / vertex_positions_stride == vertex_colors.length / vertex_colors_stride);\n\t\t\t\treturn simplifyPoints(instance.exports.meshopt_simplifyPoints, vertex_positions, vertex_positions.length / vertex_positions_stride, vertex_positions_stride * 4, vertex_colors, vertex_colors_stride * 4, color_weight, target_vertex_count);\n\t\t\t} else {\n\t\t\t\treturn simplifyPoints(instance.exports.meshopt_simplifyPoints, vertex_positions, vertex_positions.length / vertex_positions_stride, vertex_positions_stride * 4, undefined, 0, 0, target_vertex_count);\n\t\t\t}\n\t\t},\n\t};\n})();\n\nexport { MeshoptSimplifier };\n","import {Class, EntityComponentPlugin, IViewerPlugin, ThreeViewer, TObject3DComponent} from 'threepipe'\n\nexport type ScriptModule = Record<string, unknown>\n\nexport interface WalkedScriptExports {\n plugins: Array<{name: string, value: Class<IViewerPlugin>}>\n components: Array<{name: string, value: TObject3DComponent}>\n}\n\nexport function walkScriptExports(module: ScriptModule): WalkedScriptExports {\n const plugins: WalkedScriptExports['plugins'] = []\n const components: WalkedScriptExports['components'] = []\n for (const [name, value] of Object.entries(module)) {\n if (isPluginType(value)) plugins.push({name, value})\n if (isComponentType(value)) components.push({name, value})\n }\n return {plugins, components}\n}\n\n/** Register every plugin and Object3D component exported by project modules. */\nexport async function registerScripts(viewer: ThreeViewer, modules: Iterable<ScriptModule>): Promise<WalkedScriptExports> {\n const found: WalkedScriptExports = {plugins: [], components: []}\n const entityComponents = viewer.getPlugin(EntityComponentPlugin)\n if (!entityComponents) throw new Error('EntityComponentPlugin must be added before project scripts')\n\n for (const module of modules) {\n const walked = walkScriptExports(module)\n found.plugins.push(...walked.plugins)\n found.components.push(...walked.components)\n }\n for (const component of found.components) {\n const existing = entityComponents.componentTypes.get(component.value.ComponentType)\n if (existing !== component.value) {\n if (existing) entityComponents.removeComponentType(existing)\n await entityComponents.addComponentType(component.value)\n }\n }\n for (const plugin of found.plugins) {\n if (!viewer.getPlugin(plugin.value)) await viewer.addPlugin(plugin.value)\n }\n return found\n}\n\nexport function isPluginType(value: unknown): value is Class<IViewerPlugin> {\n return typeof value === 'function'\n && typeof (value as unknown as {PluginType?: unknown}).PluginType === 'string'\n}\n\nexport function isComponentType(value: unknown): value is TObject3DComponent {\n return typeof value === 'function'\n && typeof (value as unknown as {ComponentType?: unknown}).ComponentType === 'string'\n}\n","import {\n ComponentDefn,\n ComponentJSON,\n IObject3D,\n IObject3DEventMap,\n ISceneEventMap,\n literalStrings,\n Object3DComponent,\n Vector3,\n ViewerEventMap\n} from \"threepipe\"\n\nexport const uiPositionMode = ['world', 'screen', 'viewport'] as const\nexport type UiPositionMode = typeof uiPositionMode[number]\n\nexport class HtmlUiComponent extends Object3DComponent {\n static ComponentType = 'HtmlUiComponent'\n static StateProperties: ComponentDefn['StateProperties'] = [\n 'enabled',\n {\n key: 'htmlData',\n type: 'string',\n uiConfig: {\n multiline: true,\n rows: 5,\n autoResize: true,\n }\n },\n 'width',\n 'height',\n 'scrollable',\n 'interactable',\n {\n key: 'positionMode',\n type: literalStrings(uiPositionMode),\n },\n 'offsetX',\n 'offsetY',\n 'zIndex',\n 'visible',\n 'appendToBody'\n ]\n\n declare element: HTMLDivElement\n\n enabled = true\n\n // HTML content\n htmlData = '<div>Hello World</div>'\n\n // Size properties\n width = -1 // in pixels\n height = -1 // in pixels\n\n // Behavior properties\n scrollable = false\n interactable = true\n visible = true\n appendToBody = false // false = append to viewer.container (default), true = append to document.body\n\n // Position properties\n positionMode: UiPositionMode = 'world' // world follows 3D object, screen is fixed, viewport is relative to viewport\n offsetX = 0 // pixel offset from calculated position\n offsetY = 0 // pixel offset from calculated position\n zIndex = 1000 // CSS z-index\n\n private _worldPosition = new Vector3()\n private _animationFrameId?: number\n\n constructor() {\n super()\n\n this.onStateChange('htmlData', (v) => {\n if (!this.element) return\n this.element.innerHTML = v\n // this.object.setDirty?.({source: 'HtmlUiComponent'})\n })\n\n this.onStateChange('width', (v) => {\n if (!this.element) return\n this.element.style.width = v < 0 ? 'auto' : `${v}px`\n this.object.setDirty?.({source: 'HtmlUiComponent'})\n })\n\n this.onStateChange('height', (v) => {\n if (!this.element) return\n this.element.style.height = v < 0 ? 'auto' : `${v}px`\n this.object.setDirty?.({source: 'HtmlUiComponent'})\n })\n\n this.onStateChange('scrollable', (v) => {\n if (!this.element) return\n this.element.style.overflow = v ? 'auto' : 'hidden'\n this.object.setDirty?.({source: 'HtmlUiComponent'})\n })\n\n this.onStateChange('interactable', (v) => {\n if (!this.element) return\n this.element.style.pointerEvents = v ? 'auto' : 'none'\n this.object.setDirty?.({source: 'HtmlUiComponent'})\n })\n\n this.onStateChange('visible', (v) => {\n if (!this.element) return\n this.element.style.display = v ? 'block' : 'none'\n this.object.setDirty?.({source: 'HtmlUiComponent'})\n })\n\n this.onStateChange('positionMode', () => {\n if (!this.element) return\n this._updateElementPosition()\n this.object.setDirty?.({source: 'HtmlUiComponent'})\n })\n\n this.onStateChange('offsetX', () => {\n if (!this.element) return\n this._updateElementPosition()\n this.object.setDirty?.({source: 'HtmlUiComponent'})\n })\n\n this.onStateChange('offsetY', () => {\n if (!this.element) return\n this._updateElementPosition()\n this.object.setDirty?.({source: 'HtmlUiComponent'})\n })\n\n this.onStateChange('zIndex', (v) => {\n if (!this.element) return\n this.element.style.zIndex = `${v}`\n this.object.setDirty?.({source: 'HtmlUiComponent'})\n })\n\n this.onStateChange('appendToBody', (v) => {\n if (!this.element) return\n // Remove from current parent\n if (this.element.parentNode) {\n this.element.parentNode.removeChild(this.element)\n }\n // Append to new container\n const container = v ? document.body : (this.ctx?.viewer?.container || document.body)\n container.appendChild(this.element)\n this.object.setDirty?.({source: 'HtmlUiComponent'})\n })\n }\n\n private _objectUpdate = (e: IObject3DEventMap['objectUpdate'] | ISceneEventMap['mainCameraUpdate']) => {\n if (e.source === 'HtmlUiComponent') return\n const changeKey = e?.change ?? e?.key\n const update = !changeKey || changeKey === 'position' || changeKey === 'transform' || changeKey === 'quaternion' || changeKey === 'visible' || changeKey === 'controls'\n if (update && this.positionMode === 'world') {\n this._updateElementPosition()\n }\n }\n\n init(object: IObject3D, state: ComponentJSON['state']) {\n super.init(object, state)\n\n // Create the HTML element\n this.element = document.createElement('div')\n this.element.className = 'threepipe-html-ui'\n\n // Apply initial styles\n this.element.style.position = 'absolute'\n this.element.style.width = this.width < 0 ? 'auto' : `${this.width}px`\n this.element.style.height = this.height < 0 ? 'auto' : `${this.height}px`\n this.element.style.overflow = this.scrollable ? 'auto' : 'hidden'\n this.element.style.pointerEvents = this.interactable ? 'auto' : 'none'\n this.element.style.zIndex = `${this.zIndex}`\n this.element.style.display = this.visible ? 'block' : 'none'\n this.element.style.boxSizing = 'border-box'\n\n // Set HTML content\n this.element.innerHTML = this.htmlData\n\n // Add to document or viewer container\n const container = this.appendToBody ? document.body : (this.ctx?.viewer?.container || document.body)\n container.appendChild(this.element)\n\n // Listen for object updates\n object.addEventListener('objectUpdate', this._objectUpdate)\n this.ctx.viewer.scene.addEventListener('mainCameraUpdate', this._objectUpdate)\n\n // Start position tracking for world-positioned elements\n this._updateElementPosition()\n }\n\n destroy(): Record<string, any> {\n // Stop position tracking\n this._stopPositionTracking()\n\n // Remove event listener\n this.object.removeEventListener('objectUpdate', this._objectUpdate)\n this.ctx.viewer.scene.removeEventListener('mainCameraUpdate', this._objectUpdate)\n\n // Remove element from DOM\n if (this.element && this.element.parentNode) {\n this.element.parentNode.removeChild(this.element)\n }\n this.element = null as any\n\n return super.destroy()\n }\n\n private _stopPositionTracking() {\n if (this._animationFrameId !== undefined) {\n cancelAnimationFrame(this._animationFrameId)\n this._animationFrameId = undefined\n }\n }\n\n preFrame({resized}: ViewerEventMap[\"preFrame\"]): boolean | void {\n if(!this.element || !this.enabled) return\n // world - on camera change, canvas size change, object transform change\n // screen - no change\n // viewport - on canvas size change\n if(this.positionMode === 'screen') return\n if(!resized && this.positionMode === 'viewport') return\n if(!resized && this.positionMode === 'world') return // todo: tracked separately\n this._updateElementPosition()\n }\n\n private _updateElementPosition() {\n if (!this.element) return\n\n switch (this.positionMode) {\n case 'world':\n this._updateWorldPosition()\n break\n case 'screen':\n this._updateScreenPosition()\n break\n case 'viewport':\n this._updateViewportPosition()\n break\n }\n }\n\n private _updateWorldPosition() {\n // Get the world position of the object\n this.object.getWorldPosition(this._worldPosition)\n\n // Project to screen space\n const camera = this.ctx?.viewer?.scene?.mainCamera\n if (!camera) return\n\n const canvas = this.ctx?.viewer?.canvas\n if (!canvas) return\n\n // Clone position and project it\n const projected = this._worldPosition.clone()\n projected.project(camera)\n\n // Convert to screen coordinates\n const x = (projected.x * 0.5 + 0.5) * canvas.clientWidth\n const y = (projected.y * -0.5 + 0.5) * canvas.clientHeight\n\n // Apply position with offset\n this.element.style.left = `${x + this.offsetX}px`\n this.element.style.top = `${y + this.offsetY}px`\n this.element.style.transform = 'translate(-50%, -50%)' // Center on point\n }\n\n private _updateScreenPosition() {\n // Fixed screen position\n this.element.style.left = `${this.offsetX}px`\n this.element.style.top = `${this.offsetY}px`\n this.element.style.transform = 'none'\n }\n\n private _updateViewportPosition() {\n // Viewport-relative position (percentage-based)\n const canvas = this.ctx?.viewer?.canvas\n if (!canvas) return\n\n const x = (this.offsetX / 100) * canvas.clientWidth\n const y = (this.offsetY / 100) * canvas.clientHeight\n\n this.element.style.left = `${x}px`\n this.element.style.top = `${y}px`\n this.element.style.transform = 'none'\n }\n\n /**\n * Update the HTML content programmatically\n */\n setHtml(html: string) {\n this.htmlData = html\n }\n\n /**\n * Set the position\n */\n setPosition(x: number, y: number) {\n this.offsetX = x\n this.offsetY = y\n }\n\n /**\n * Set the size\n */\n setSize(width: number, height: number) {\n this.width = width\n this.height = height\n }\n\n /**\n * Show the element\n */\n show() {\n this.visible = true\n }\n\n /**\n * Hide the element\n */\n hide() {\n this.visible = false\n }\n}\n\n","export const generatorParamTypes = [\n 'boolean',\n 'number',\n 'integer',\n 'string',\n 'select',\n 'vector',\n 'color',\n 'json',\n] as const\n\nexport type GeneratorParamType = typeof generatorParamTypes[number]\n\nexport type GeneratorParamOption = string | number | {\n value: string | number\n label: string\n}\n\nexport interface GeneratorParamDefinition {\n type?: GeneratorParamType\n label?: string\n help?: string\n default?: unknown\n options?: GeneratorParamOption[]\n min?: number\n max?: number\n step?: number\n}\n\nexport interface GeneratorParamSchemaEntry extends Omit<GeneratorParamDefinition, 'type'> {\n type: GeneratorParamType\n}\n\nexport type GeneratorParamSchema = Record<string, GeneratorParamSchemaEntry>\n\nexport function parseGeneratorParamsSchema(\n exported: unknown,\n module: string,\n warn: (message: string) => void = console.warn,\n): GeneratorParamSchema {\n if (exported === undefined) return {}\n if (!isRecord(exported)) {\n warn(`[kite3d] Ignoring invalid generator params export from ${module}: expected an object`)\n return {}\n }\n\n const schema: GeneratorParamSchema = {}\n for (const [key, value] of Object.entries(exported)) {\n const parsed = parseEntry(value)\n if (typeof parsed === 'string') {\n warn(`[kite3d] Ignoring invalid generator param \"${key}\" from ${module}: ${parsed}`)\n continue\n }\n schema[key] = parsed\n }\n return schema\n}\n\nexport function inferGeneratorParam(value: unknown): GeneratorParamSchemaEntry {\n if (typeof value === 'boolean') return {type: 'boolean'}\n if (typeof value === 'number') return {type: 'number'}\n if (isNumberVector(value)) return {type: 'vector'}\n if (typeof value === 'string') return {type: 'string'}\n return {type: 'json'}\n}\n\nexport function validateGeneratorParam(value: unknown, entry: GeneratorParamSchemaEntry): string | undefined {\n const name = entry.label || 'Value'\n switch (entry.type) {\n case 'boolean':\n return typeof value === 'boolean' ? undefined : `${name} must be true or false.`\n case 'number':\n case 'integer': {\n if (typeof value !== 'number' || !Number.isFinite(value)) return `${name} must be a number.`\n if (entry.type === 'integer' && !Number.isInteger(value)) return `${name} must be an integer.`\n if (entry.min !== undefined && value < entry.min) return `${name} must be at least ${entry.min}.`\n if (entry.max !== undefined && value > entry.max) return `${name} must be at most ${entry.max}.`\n return undefined\n }\n case 'string':\n return typeof value === 'string' ? undefined : `${name} must be text.`\n case 'select': {\n if (typeof value !== 'string' && typeof value !== 'number') {\n return `${name} must be one of the available options.`\n }\n if (entry.options?.length && !entry.options.some((option) => Object.is(optionValue(option), value))) {\n return `${name} must be one of the available options.`\n }\n return undefined\n }\n case 'vector':\n return isNumberVector(value) ? undefined : `${name} must be an array of 2 to 4 numbers.`\n case 'color':\n return typeof value === 'string' && /^#[\\da-f]{6}$/i.test(value)\n ? undefined\n : `${name} must be a six-digit hex color.`\n case 'json':\n return isJsonValue(value) ? undefined : `${name} must be a JSON value.`\n }\n}\n\nfunction parseEntry(value: unknown): GeneratorParamSchemaEntry | string {\n if (!isRecord(value)) return 'expected an object'\n if (value.type !== undefined && !generatorParamTypes.includes(value.type as GeneratorParamType)) {\n return `unknown type ${JSON.stringify(value.type)}`\n }\n if (value.label !== undefined && typeof value.label !== 'string') return 'label must be a string'\n if (value.help !== undefined && typeof value.help !== 'string') return 'help must be a string'\n if (value.options !== undefined && !isOptions(value.options)) return 'options must contain strings, numbers, or labeled values'\n for (const bound of ['min', 'max', 'step'] as const) {\n if (value[bound] !== undefined && !isFiniteNumber(value[bound])) return `${bound} must be a finite number`\n }\n if (isFiniteNumber(value.step) && value.step <= 0) return 'step must be greater than zero'\n if (isFiniteNumber(value.min) && isFiniteNumber(value.max) && value.min > value.max) {\n return 'min must not be greater than max'\n }\n\n const type = value.type as GeneratorParamType | undefined\n ?? (value.options !== undefined ? 'select' : inferGeneratorParam(value.default).type)\n if ((value.min !== undefined || value.max !== undefined || value.step !== undefined)\n && type !== 'number' && type !== 'integer') {\n return 'min, max, and step require a number or integer type'\n }\n if (value.options !== undefined && type !== 'select') return 'options require the select type'\n\n const entry: GeneratorParamSchemaEntry = {\n type,\n ...(value.label !== undefined ? {label: value.label} : {}),\n ...(value.help !== undefined ? {help: value.help} : {}),\n ...(Object.prototype.hasOwnProperty.call(value, 'default') ? {default: value.default} : {}),\n ...(value.options !== undefined ? {options: value.options} : {}),\n ...(isFiniteNumber(value.min) ? {min: value.min} : {}),\n ...(isFiniteNumber(value.max) ? {max: value.max} : {}),\n ...(isFiniteNumber(value.step) ? {step: value.step} : {}),\n }\n if (Object.prototype.hasOwnProperty.call(entry, 'default')) {\n const error = validateGeneratorParam(entry.default, entry)\n if (error) return `invalid default: ${error}`\n }\n return entry\n}\n\nfunction isOptions(value: unknown): value is GeneratorParamOption[] {\n return Array.isArray(value) && value.every((option) => {\n if (typeof option === 'string' || typeof option === 'number') return true\n return isRecord(option)\n && (typeof option.value === 'string' || typeof option.value === 'number')\n && typeof option.label === 'string'\n })\n}\n\nfunction optionValue(option: GeneratorParamOption): string | number {\n return typeof option === 'object' ? option.value : option\n}\n\nfunction isNumberVector(value: unknown): value is number[] {\n return Array.isArray(value)\n && value.length >= 2\n && value.length <= 4\n && value.every(isFiniteNumber)\n}\n\nfunction isFiniteNumber(value: unknown): value is number {\n return typeof value === 'number' && Number.isFinite(value)\n}\n\nfunction isJsonValue(value: unknown, seen = new Set<object>()): boolean {\n if (value === null || typeof value === 'string' || typeof value === 'boolean') return true\n if (typeof value === 'number') return Number.isFinite(value)\n if (!value || typeof value !== 'object' || seen.has(value)) return false\n seen.add(value)\n const valid = Array.isArray(value)\n ? value.every((item) => isJsonValue(item, seen))\n : Object.getPrototypeOf(value) === Object.prototype\n && Object.values(value).every((item) => isJsonValue(item, seen))\n seen.delete(value)\n return valid\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === 'object' && !Array.isArray(value)\n}\n","import * as ThreePipe from 'threepipe'\nimport {\n type ComponentDefn,\n type IObject3D,\n Object3DComponent,\n type ThreeViewer,\n} from 'threepipe'\nimport {getAuthoringMetadata, setAuthoringMetadata, type AuthoringMetadata} from '../authoring.ts'\nimport {\n parseGeneratorParamsSchema,\n type GeneratorParamDefinition,\n type GeneratorParamSchema,\n} from '../generatorParams.ts'\n\nexport interface GeneratorParams {\n [key: string]: unknown\n}\n\nexport interface GeneratorContext {\n node: IObject3D\n params: GeneratorParams\n viewer: ThreeViewer\n engine: Record<string, unknown>\n}\n\nexport interface GeneratorModule {\n default?: (context: GeneratorContext) => unknown | Promise<unknown>\n params?: Record<string, GeneratorParamDefinition>\n}\n\nexport interface GeneratorViewerOptions {\n base: string | URL\n onError?: (error: unknown) => void\n}\n\ninterface GeneratorViewerConfig {\n base: URL\n onError?: (error: unknown) => void\n pending: Set<Promise<void>>\n}\n\nconst viewerConfigs = new WeakMap<ThreeViewer, GeneratorViewerConfig>()\nlet generatorImportRevision = 0\n\nexport class GeneratorComponent extends Object3DComponent {\n static ComponentType = 'Generator'\n static StateProperties: ComponentDefn['StateProperties'] = ['module', 'params']\n\n module = ''\n params: GeneratorParams = {}\n schema: GeneratorParamSchema = {}\n private runRevision = 0\n\n static configureViewer(viewer: ThreeViewer, options: GeneratorViewerOptions): void {\n viewerConfigs.set(viewer, {\n base: typeof options.base === 'string' ? new URL(options.base) : options.base,\n onError: options.onError,\n pending: new Set(),\n })\n }\n\n static async waitForViewer(viewer: ThreeViewer): Promise<void> {\n const config = viewerConfigs.get(viewer)\n while (config?.pending.size) await Promise.all([...config.pending])\n }\n\n init(object: IObject3D, state: Record<string, unknown>): void {\n super.init(object, state)\n const run = () => { void this.run().catch((error) => reportGeneratorError(this.ctx.viewer, error)) }\n this.onStateChange('module', run)\n this.onStateChange('params', run)\n run()\n }\n\n async run(): Promise<void> {\n const viewer = this.ctx.viewer\n const config = viewerConfigs.get(viewer)\n if (!config) throw new Error('Generator viewer is not configured')\n const revision = ++this.runRevision\n const task = runGenerator({\n node: this.object,\n params: this.params,\n viewer,\n module: this.module,\n base: config.base,\n revision: ++generatorImportRevision,\n isCurrent: () => revision === this.runRevision,\n onSchema: (schema) => { this.schema = schema },\n }).then(() => {\n if (revision === this.runRevision) viewer.setDirty(this)\n }).finally(() => config.pending.delete(task))\n config.pending.add(task)\n await task\n }\n\n async bake(): Promise<number> {\n await this.run()\n const node = this.object\n const generated = node.children.filter((child) => child.userData.kite3dGenerated === true)\n const bakedFrom = {\n module: this.module,\n params: JSON.parse(JSON.stringify(this.params)) as GeneratorParams,\n ts: new Date().toISOString(),\n }\n for (const child of generated) unmarkGenerated(child as IObject3D)\n this.ctx.ecp.removeComponent(node, this.uuid)\n const metadata = getAuthoringMetadata(node)\n if (metadata?.role === 'generator' && !metadata.sourceId) {\n setAuthoringMetadata(node, {\n role: 'direct',\n id: metadata.id,\n ...(metadata.allowCameraInside !== undefined ? {allowCameraInside: metadata.allowCameraInside} : {}),\n })\n }\n node.userData.kite3dBakedFrom = bakedFrom\n node._sChildren = [...node.children]\n node.setDirty?.({change: 'userData.kite3dBakedFrom', source: 'kite3d bake'})\n return generated.length\n }\n\n destroy(): Record<string, unknown> {\n this.runRevision += 1\n removeGeneratedChildren(this.object)\n return super.destroy()\n }\n}\n\nexport interface RunGeneratorOptions extends Omit<GeneratorContext, 'engine'> {\n module: string\n base: URL\n revision?: number\n isCurrent?: () => boolean\n onSchema?: (schema: GeneratorParamSchema) => void\n}\n\nexport async function runGenerator({\n node,\n params,\n viewer,\n module,\n base,\n revision = 0,\n isCurrent,\n onSchema,\n}: RunGeneratorOptions): Promise<IObject3D[]> {\n removeGeneratedChildren(node)\n onSchema?.({})\n if (!module) return []\n const source = ensureGeneratorMetadata(node)\n const moduleUrl = resolveGeneratorModule(module, base)\n if (revision) moduleUrl.searchParams.set('kite3d-generator', String(revision))\n const loaded = await importGeneratorModule(moduleUrl.href)\n if (!isCurrent || isCurrent()) onSchema?.(parseGeneratorParamsSchema(loaded.params, module))\n if (typeof loaded.default !== 'function') {\n throw new Error(`Generator module must have a default generate function: ${module}`)\n }\n\n const existingChildren = new Set(node.children)\n const returned = await loaded.default({\n node,\n params,\n viewer,\n engine: ThreePipe as unknown as Record<string, unknown>,\n })\n const returnedObjects = normalizeGeneratedResult(returned)\n for (const [index, child] of returnedObjects.entries()) {\n if (child.parent === node) continue\n markGenerated(child, source.id, index)\n node.add(child)\n }\n\n const generated = node.children.filter((child) => !existingChildren.has(child)) as IObject3D[]\n if (isCurrent && !isCurrent()) {\n for (const child of generated) removeGeneratedObject(child)\n return []\n }\n generated.forEach((child, index) => markGenerated(child, source.id, index))\n return generated\n}\n\nexport function removeGeneratedChildren(node: IObject3D): void {\n for (const child of [...node.children] as IObject3D[]) {\n if (child.userData.kite3dGenerated !== true) continue\n removeGeneratedObject(child)\n }\n}\n\nexport function markGenerated(object: IObject3D, sourceId?: string, outputIndex = 0): void {\n let descendantIndex = 0\n object.traverse((child: IObject3D) => {\n child.userData.kite3dGenerated = true\n child.userData.excludeFromExport = true\n if (sourceId) {\n child.userData.kite3dAuthoring = {\n role: 'generator',\n id: `${sourceId}:preview:${outputIndex}:${descendantIndex++}`,\n sourceId,\n } satisfies AuthoringMetadata\n }\n })\n}\n\nfunction unmarkGenerated(object: IObject3D): void {\n object.traverse((child: IObject3D) => {\n delete child.userData.kite3dGenerated\n delete child.userData.excludeFromExport\n const metadata = getAuthoringMetadata(child)\n if (metadata?.role === 'generator' && metadata.sourceId) delete child.userData.kite3dAuthoring\n })\n}\n\nfunction ensureGeneratorMetadata(node: IObject3D): AuthoringMetadata {\n const current = getAuthoringMetadata(node)\n if (current?.role === 'generator' && !current.sourceId) return current\n const savedId = typeof node.userData.gltfUUID === 'string' && node.userData.gltfUUID.trim()\n ? node.userData.gltfUUID.trim()\n : current?.id || generatorPathId(node)\n setAuthoringMetadata(node, {role: 'generator', id: savedId})\n return getAuthoringMetadata(node)!\n}\n\nfunction generatorPathId(node: IObject3D): string {\n const parts: string[] = []\n for (let current: IObject3D | null = node; current?.parent; current = current.parent as IObject3D) {\n const index = current.parent.children.indexOf(current)\n parts.push(`${current.name || current.type}:${index}`)\n if (current.parent.userData?.rootSceneModelRoot) break\n }\n return `generator:${parts.reverse().join('/')}`\n}\n\nfunction removeGeneratedObject(object: IObject3D): void {\n object.removeFromParent()\n const disposed = new Set<object>()\n object.traverse((child) => {\n const renderable = child as IObject3D & {geometry?: {dispose?(): void}, material?: unknown | unknown[]}\n disposeResource(renderable.geometry, disposed)\n const materials = Array.isArray(renderable.material) ? renderable.material : [renderable.material]\n for (const material of materials) {\n if (!material || typeof material !== 'object') continue\n for (const value of Object.values(material)) {\n if (value && typeof value === 'object' && 'isTexture' in value) disposeResource(value, disposed)\n }\n disposeResource(material, disposed)\n }\n })\n}\n\nfunction disposeResource(resource: unknown, disposed: Set<object>): void {\n if (!resource || typeof resource !== 'object' || disposed.has(resource)) return\n disposed.add(resource)\n ;(resource as {dispose?(): void}).dispose?.()\n}\n\nexport function resolveGeneratorModule(module: string, base: URL): URL {\n if (!module || module.startsWith('/') || /^[a-z][a-z\\d+.-]*:/i.test(module)) {\n throw new Error(`Generator module must be a project-relative path: ${module}`)\n }\n const resolved = new URL(module, base)\n if (resolved.origin !== base.origin) {\n throw new Error(`Generator module must be same-origin: ${resolved.href}`)\n }\n return resolved\n}\n\nfunction normalizeGeneratedResult(value: unknown): IObject3D[] {\n if (!value) return []\n const values = Array.isArray(value) ? value : [value]\n const objects: IObject3D[] = []\n for (const candidate of values) {\n if (!(candidate as IObject3D | undefined)?.isObject3D) {\n throw new Error('Generator output must be an Object3D, an array of Object3D values, or undefined')\n }\n objects.push(candidate as IObject3D)\n }\n return objects\n}\n\nasync function importGeneratorModule(url: string): Promise<GeneratorModule> {\n return import(/* @vite-ignore */ url) as Promise<GeneratorModule>\n}\n\nfunction reportGeneratorError(viewer: ThreeViewer, error: unknown): void {\n const onError = viewerConfigs.get(viewer)?.onError\n if (onError) onError(error)\n else console.error('[kite3d] Generator error', error)\n}\n","// https://github.com/donmccurdy/three-to-cannon/blob/main/src/utils.ts\n\nimport { BufferAttribute, BufferGeometry, Mesh, Object3D, Quaternion, Vector3 } from 'threepipe';\n\nconst _v1 = new Vector3();\nconst _v2 = new Vector3();\nconst _q1 = new Quaternion();\n\n/**\n * Returns a single geometry for the given object. If the object is compound,\n * its geometries are automatically merged. Bake world scale into each\n * geometry, because we can't easily apply that to the cannonjs shapes later.\n */\nexport function getGeometry (object: Object3D): BufferGeometry | null {\n const meshes = getMeshes(object);\n if (meshes.length === 0) return null;\n\n // Single mesh. Return, preserving original type.\n if (meshes.length === 1) {\n return normalizeGeometry(meshes[0]);\n }\n\n // Multiple meshes. Merge and return.\n let mesh: Mesh | undefined;\n const geometries: BufferGeometry[] = [];\n while ((mesh = meshes.pop())) {\n geometries.push(simplifyGeometry(normalizeGeometry(mesh)));\n }\n\n return mergeBufferGeometries(geometries);\n}\n\nfunction normalizeGeometry (mesh: Mesh): BufferGeometry {\n // Preserve original type, e.g. CylinderBufferGeometry.\n const geometry: BufferGeometry = mesh.geometry.clone();\n\n mesh.updateMatrixWorld();\n mesh.matrixWorld.decompose(_v1, _q1, _v2);\n geometry.scale(_v2.x, _v2.y, _v2.z);\n return geometry;\n}\n\n/**\n * Greatly simplified version of BufferGeometryUtils.mergeBufferGeometries.\n * Because we only care about the vertex positions, and not the indices or\n * other attributes, we throw everything else away.\n */\nfunction mergeBufferGeometries (geometries: BufferGeometry[]): BufferGeometry {\n let vertexCount = 0;\n for (let i = 0; i < geometries.length; i++) {\n const position = geometries[i].attributes.position;\n if (position && position.itemSize === 3) {\n vertexCount += position.count;\n }\n }\n\n const positionArray = new Float32Array(vertexCount * 3);\n\n let positionOffset = 0;\n for (let i = 0; i < geometries.length; i++) {\n const position = geometries[i].attributes.position;\n if (position && position.itemSize === 3) {\n for (let j = 0; j < position.count; j++) {\n positionArray[positionOffset++] = position.getX(j);\n positionArray[positionOffset++] = position.getY(j);\n positionArray[positionOffset++] = position.getZ(j);\n }\n }\n }\n\n return new BufferGeometry().setAttribute('position', new BufferAttribute(positionArray, 3));\n}\n\nexport function getVertices (geometry: BufferGeometry): Float32Array {\n const position = geometry.attributes.position;\n const vertices = new Float32Array(position.count * 3);\n for (let i = 0; i < position.count; i++) {\n vertices[i * 3] = position.getX(i);\n vertices[i * 3 + 1] = position.getY(i);\n vertices[i * 3 + 2] = position.getZ(i);\n }\n return vertices;\n}\n\n/**\n * Returns a flat array of THREE.Mesh instances from the given object. If\n * nested transformations are found, they are applied to child meshes\n * as mesh.userData.matrix, so that each mesh has its position/rotation/scale\n * independently of all of its parents except the top-level object.\n */\nfunction getMeshes (object: Object3D): Mesh[] {\n const meshes: Mesh[] = [];\n object.traverse(function (o) {\n if ((o as Mesh).isMesh) {\n meshes.push(o as Mesh);\n }\n });\n return meshes;\n}\n\nexport function getComponent(v: Vector3, component: string): number {\n switch(component) {\n case 'x': return v.x;\n case 'y': return v.y;\n case 'z': return v.z;\n }\n throw new Error(`Unexpected component ${component}`);\n}\n\n/**\n * Modified version of BufferGeometryUtils.mergeVertices, ignoring vertex\n * attributes other than position.\n *\n * @param {THREE.BufferGeometry} geometry\n * @param {number} tolerance\n * @return {THREE.BufferGeometry>}\n */\nfunction simplifyGeometry (geometry: BufferGeometry, tolerance = 1e-4): BufferGeometry {\n\n tolerance = Math.max( tolerance, Number.EPSILON );\n\n // Generate an index buffer if the geometry doesn't have one, or optimize it\n // if it's already available.\n const hashToIndex: {[key: string]: number} = {};\n const indices = geometry.getIndex();\n const positions = geometry.getAttribute( 'position' );\n const vertexCount = indices ? indices.count : positions.count;\n\n // Next value for triangle indices.\n let nextIndex = 0;\n\n const newIndices = [];\n const newPositions = [];\n\n // Convert the error tolerance to an amount of decimal places to truncate to.\n const decimalShift = Math.log10( 1 / tolerance );\n const shiftMultiplier = Math.pow( 10, decimalShift );\n\n for ( let i = 0; i < vertexCount; i ++ ) {\n\n const index = indices ? indices.getX( i ) : i;\n\n // Generate a hash for the vertex attributes at the current index 'i'.\n let hash = '';\n\n // Double tilde truncates the decimal value.\n hash += `${ ~ ~ ( positions.getX( index ) * shiftMultiplier ) },`;\n hash += `${ ~ ~ ( positions.getY( index ) * shiftMultiplier ) },`;\n hash += `${ ~ ~ ( positions.getZ( index ) * shiftMultiplier ) },`;\n\n // Add another reference to the vertex if it's already\n // used by another index.\n if ( hash in hashToIndex ) {\n\n newIndices.push( hashToIndex[ hash ] );\n\n } else {\n\n newPositions.push( positions.getX( index ) );\n newPositions.push( positions.getY( index ) );\n newPositions.push( positions.getZ( index ) );\n\n hashToIndex[ hash ] = nextIndex;\n newIndices.push( nextIndex );\n nextIndex ++;\n\n }\n\n }\n\n // Construct merged BufferGeometry.\n\n const positionAttribute = new BufferAttribute(\n new Float32Array( newPositions ),\n positions.itemSize,\n positions.normalized\n );\n\n const result = new BufferGeometry();\n result.setAttribute( 'position', positionAttribute );\n result.setIndex( newIndices );\n\n return result;\n\n}\n","// https://github.com/donmccurdy/three-to-cannon/blob/main/src/index.ts\nimport {Box, ConvexPolyhedron, Cylinder, Quaternion as CQuaternion, Shape, Sphere, Trimesh, Vec3} from 'cannon-es';\nimport {ConvexHull, Box3, BufferGeometry, CylinderGeometry, MathUtils, Mesh, Object3D, SphereGeometry, Vector3} from 'threepipe';\nimport {getComponent, getGeometry, getVertices} from './utils';\n\nconst PI_2 = Math.PI / 2;\n\nexport type BoxParameters = { x: number, y: number, z: number };\n\nexport type CylinderParameters = { radiusTop: number, radiusBottom: number, height: number, segments: number };\n\nexport type SphereParameters = { radius: number };\n\nexport type ConvexPolyhedronParameters = { vertices: Float32Array, faces: number[][] };\n\nexport type TrimeshParameters = { vertices: Float32Array, indices: Uint32Array };\n\ntype ShapeTypeToShapeParameters = {\n Box: BoxParameters,\n Cylinder: CylinderParameters,\n Sphere: SphereParameters,\n ConvexPolyhedron: ConvexPolyhedronParameters,\n Trimesh: TrimeshParameters,\n};\n\nexport enum ShapeType {\n BOX = 'Box',\n CYLINDER = 'Cylinder',\n SPHERE = 'Sphere',\n HULL = 'ConvexPolyhedron',\n MESH = 'Trimesh',\n}\n\nexport interface ShapeOptions {\n type?: ShapeType,\n cylinderAxis?: 'x' | 'y' | 'z',\n sphereRadius?: number,\n}\n\nexport interface ShapeParameters<T extends ShapeType = ShapeType> {\n type: T,\n params: ShapeTypeToShapeParameters[T],\n offset?: Vec3,\n orientation?: CQuaternion,\n}\n\nexport interface ShapeResult<T extends Shape = Shape> {\n shape: T,\n offset?: Vec3,\n orientation?: CQuaternion,\n}\n\n/**\n * Given a THREE.Object3D instance, creates parameters for a CANNON shape.\n */\nexport const getShapeParameters = function (object: Object3D, options: ShapeOptions = {}): ShapeParameters | null {\n let geometry: BufferGeometry | null;\n\n if (options.type === ShapeType.BOX) {\n return getBoundingBoxParameters(object);\n } else if (options.type === ShapeType.CYLINDER) {\n return getBoundingCylinderParameters(object, options);\n } else if (options.type === ShapeType.SPHERE) {\n return getBoundingSphereParameters(object, options);\n } else if (options.type === ShapeType.HULL) {\n return getConvexPolyhedronParameters(object);\n } else if (options.type === ShapeType.MESH) {\n geometry = getGeometry(object);\n return geometry ? getTrimeshParameters(geometry) : null;\n } else if (options.type) {\n throw new Error(`[CANNON.getShapeParameters] Invalid type \"${options.type}\".`);\n }\n\n geometry = getGeometry(object);\n if (!geometry) return null;\n\n switch (geometry.type) {\n case 'BoxGeometry':\n case 'BoxBufferGeometry':\n return getBoxParameters(geometry);\n case 'CylinderGeometry':\n case 'CylinderBufferGeometry':\n return getCylinderParameters(geometry as CylinderGeometry);\n case 'PlaneGeometry':\n case 'PlaneBufferGeometry':\n return getPlaneParameters(geometry);\n case 'SphereGeometry':\n case 'SphereBufferGeometry':\n return getSphereParameters(geometry as SphereGeometry);\n case 'TubeGeometry':\n case 'BufferGeometry':\n return getBoundingBoxParameters(object);\n default:\n console.warn(\n 'Unrecognized geometry: \"%s\". Using bounding box as shape.', geometry.type\n );\n return getBoxParameters(geometry);\n }\n};\n\n/**\n * Given a THREE.Object3D instance, creates a corresponding CANNON shape.\n */\nexport const threeToCannon = function (object: Object3D, options: ShapeOptions = {}, shapeParameters?: ShapeParameters|null): ShapeResult | null {\n shapeParameters = shapeParameters || getShapeParameters(object, options);\n if (!shapeParameters) {\n return null;\n }\n\n const { type, params, offset, orientation } = shapeParameters;\n\n let shape: Shape;\n if (type === ShapeType.BOX) {\n shape = createBox(params as BoxParameters);\n } else if (type === ShapeType.CYLINDER) {\n shape = createCylinder(params as CylinderParameters);\n } else if (type === ShapeType.SPHERE) {\n shape = createSphere(params as SphereParameters);\n } else if (type === ShapeType.HULL) {\n shape = createConvexPolyhedron(params as ConvexPolyhedronParameters);\n } else {\n shape = createTrimesh(params as TrimeshParameters);\n }\n\n return {\n shape,\n offset,\n orientation,\n };\n};\n\n/******************************************************************************\n * Shape construction\n */\n\nfunction createBox (params: BoxParameters): Box {\n const { x, y, z } = params;\n const shape = new Box(new Vec3(x || 0.025, y || 0.025, z || 0.025));\n return shape;\n}\n\nfunction createCylinder (params: CylinderParameters): Cylinder {\n const { radiusTop, radiusBottom, height, segments } = params;\n\n const shape = new Cylinder(radiusTop, radiusBottom, height, segments);\n\n // Include metadata for serialization.\n // TODO(cleanup): Is this still necessary?\n shape.radiusTop = radiusBottom;\n shape.radiusBottom = radiusBottom;\n shape.height = height;\n shape.numSegments = segments;\n\n return shape;\n}\n\nfunction createSphere (params: SphereParameters): Sphere {\n const shape = new Sphere(params.radius);\n\n return shape;\n}\n\nfunction createConvexPolyhedron (params: ConvexPolyhedronParameters): ConvexPolyhedron {\n const { faces, vertices: verticesArray } = params;\n\n const vertices: Vec3[] = [];\n for (let i = 0; i < verticesArray.length; i += 3) {\n vertices.push(new Vec3(\n verticesArray[i],\n verticesArray[i + 1],\n verticesArray[i + 2]\n ));\n }\n\n const shape = new ConvexPolyhedron({\n faces,\n vertices\n });\n\n return shape;\n}\n\nfunction createTrimesh (params: TrimeshParameters): Trimesh {\n const { vertices, indices } = params\n const shape = new Trimesh(\n vertices as unknown as number[],\n indices as unknown as number[],\n );\n\n return shape;\n}\n\n/******************************************************************************\n * Shape parameters\n */\n\nfunction getBoxParameters (geometry: BufferGeometry): ShapeParameters<ShapeType.BOX> | null {\n const vertices = getVertices(geometry);\n\n if (!vertices.length) return null;\n\n geometry.computeBoundingBox();\n const box = geometry.boundingBox!;\n\n return {\n type: ShapeType.BOX,\n params: {\n x: (box.max.x - box.min.x) / 2,\n y: (box.max.y - box.min.y) / 2,\n z: (box.max.z - box.min.z) / 2,\n },\n };\n}\n\n/** Bounding box needs to be computed with the entire subtree, not just geometry. */\nfunction getBoundingBoxParameters (object: Object3D): ShapeParameters<ShapeType.BOX> | null {\n const clone = object.clone();\n clone.quaternion.set(0, 0, 0, 1);\n clone.updateMatrixWorld();\n\n const box = new Box3().setFromObject(clone);\n\n if (!isFinite(box.min.lengthSq())) return null;\n\n const localPosition = box.translate(clone.position.negate()).getCenter(new Vector3());\n\n return {\n type: ShapeType.BOX,\n params: {\n x: (box.max.x - box.min.x) / 2,\n y: (box.max.y - box.min.y) / 2,\n z: (box.max.z - box.min.z) / 2,\n },\n offset: localPosition.lengthSq()\n ? new Vec3(localPosition.x, localPosition.y, localPosition.z)\n : undefined,\n };\n}\n\n/** Computes 3D convex hull as a CANNON.ConvexPolyhedron. */\nfunction getConvexPolyhedronParameters (object: Object3D): ShapeParameters<ShapeType.HULL> | null {\n const geometry = getGeometry(object);\n\n if (!geometry) return null;\n\n // Perturb.\n const eps = 1e-4;\n for (let i = 0; i < geometry.attributes.position.count; i++) {\n geometry.attributes.position.setXYZ(\n i,\n geometry.attributes.position.getX(i) + (Math.random() - 0.5) * eps,\n geometry.attributes.position.getY(i) + (Math.random() - 0.5) * eps,\n geometry.attributes.position.getZ(i) + (Math.random() - 0.5) * eps,\n );\n }\n\n // Compute the 3D convex hull and collect convex hull vertices and faces.\n const [ positions, indices ] = convexHullToJSON(new ConvexHull().setFromObject(new Mesh(geometry)));\n\n return {\n type: ShapeType.HULL,\n params: {\n vertices: new Float32Array(positions),\n faces: indices,\n },\n };\n}\n\nfunction getCylinderParameters (\n geometry: CylinderGeometry\n): ShapeParameters<ShapeType.CYLINDER> | null {\n const params = geometry.parameters;\n\n return {\n type: ShapeType.CYLINDER,\n params: {\n radiusTop: params.radiusTop,\n radiusBottom: params.radiusBottom,\n height: params.height,\n segments: params.radialSegments,\n },\n orientation: new CQuaternion()\n .setFromEuler(MathUtils.degToRad(-90), 0, 0, 'XYZ')\n .normalize(),\n }\n}\n\nfunction getBoundingCylinderParameters (\n object: Object3D,\n options: ShapeOptions\n): ShapeParameters<ShapeType.CYLINDER> | null {\n const axes = ['x', 'y', 'z'];\n const majorAxis = options.cylinderAxis || 'y';\n const minorAxes = axes.splice(axes.indexOf(majorAxis), 1) && axes;\n const box = new Box3().setFromObject(object);\n\n if (!isFinite(box.min.lengthSq())) return null;\n\n // Compute cylinder dimensions.\n const height = box.max[majorAxis] - box.min[majorAxis];\n const radius = 0.5 * Math.max(\n getComponent(box.max, minorAxes[0]) - getComponent(box.min, minorAxes[0]),\n getComponent(box.max, minorAxes[1]) - getComponent(box.min, minorAxes[1]),\n );\n\n const eulerX = majorAxis === 'y' ? PI_2 : 0;\n const eulerY = majorAxis === 'z' ? PI_2 : 0;\n\n return {\n type: ShapeType.CYLINDER,\n params: {\n radiusTop: radius,\n radiusBottom: radius,\n height,\n segments: 12,\n },\n orientation: new CQuaternion()\n .setFromEuler(eulerX, eulerY, 0, 'XYZ')\n .normalize(),\n offset: new Vec3(\n (box.max.x + box.min.x) / 2,\n (box.max.y + box.min.y) / 2,\n (box.max.z + box.min.z) / 2,\n ),\n };\n}\n\nfunction getPlaneParameters (geometry: BufferGeometry): ShapeParameters<ShapeType.BOX> | null {\n geometry.computeBoundingBox();\n const box = geometry.boundingBox!;\n\n return {\n type: ShapeType.BOX,\n params: {\n x: (box.max.x - box.min.x) / 2 || 0.1,\n y: (box.max.y - box.min.y) / 2 || 0.1,\n z: (box.max.z - box.min.z) / 2 || 0.1,\n },\n };\n}\n\nfunction getSphereParameters (geometry: SphereGeometry): ShapeParameters<ShapeType.SPHERE> | null {\n return {\n type: ShapeType.SPHERE,\n params: { radius: geometry.parameters.radius },\n };\n}\n\nfunction getBoundingSphereParameters (\n object: Object3D,\n options: ShapeOptions\n): ShapeParameters<ShapeType.SPHERE> | null {\n if (options.sphereRadius) {\n return {\n type: ShapeType.SPHERE,\n params: { radius: options.sphereRadius },\n };\n }\n const geometry = getGeometry(object);\n if (!geometry) return null;\n geometry.computeBoundingSphere();\n const sphere = geometry.boundingSphere;\n if(!sphere) return null;\n if(!isFinite(sphere.radius)) return null;\n\n // const localPosition = sphere.center.clone().sub(object.position);\n\n return {\n type: ShapeType.SPHERE,\n params: { radius: geometry.boundingSphere!.radius },\n // offset: localPosition.lengthSq()\n // ? new Vec3(localPosition.x, localPosition.y, localPosition.z)\n // : undefined,\n };\n}\n\nfunction getTrimeshParameters (geometry: BufferGeometry): ShapeParameters<ShapeType.MESH> | null {\n const vertices = getVertices(geometry);\n\n if (!vertices.length) return null;\n\n const indices = new Uint32Array(vertices.length);\n for (let i = 0; i < vertices.length; i++) {\n indices[i] = i;\n }\n\n return {\n type: ShapeType.MESH,\n params: {\n vertices,\n indices,\n },\n };\n}\n\nfunction convexHullToJSON(hull: ConvexHull) {\n // Original ('src') indices do not include interior vertices,\n // but 'hull.vertices' (the list they index) does. Output ('dst')\n // arrays have interior vertices omitted.\n\n const srcIndices = hull.faces.map((f) => {\n const indices = [];\n let edge = f.edge;\n do {\n const vertex = edge.head()\n const index = hull.vertices.indexOf(vertex)\n if(index >=0) indices.push(index);\n edge = edge.next;\n } while (edge !== f.edge);\n return indices;\n });\n const uniqueSrcIndices = Array.from(new Set(srcIndices.flat())).sort();\n\n // Output vertex positions, omitting interior vertices.\n const dstPositions = [];\n for (let i = 0; i < uniqueSrcIndices.length; i++) {\n dstPositions.push(\n hull.vertices[uniqueSrcIndices[i]].point.x,\n hull.vertices[uniqueSrcIndices[i]].point.y,\n hull.vertices[uniqueSrcIndices[i]].point.z,\n );\n }\n\n // Mapping from 'src' (hull.vertices) to 'dst' (dstPositions) indices.\n const srcToDstIndexMap = new Map();\n for (let i = 0; i < uniqueSrcIndices.length; i++) {\n srcToDstIndexMap.set(uniqueSrcIndices[i], i);\n }\n\n // Output triangles, as indices on dstPositions.\n const dstIndices = [];\n for (let i = 0; i < srcIndices.length; i++) {\n dstIndices.push([\n srcToDstIndexMap.get(srcIndices[i][0]),\n srcToDstIndexMap.get(srcIndices[i][1]),\n srcToDstIndexMap.get(srcIndices[i][2]),\n ]);\n }\n\n return [dstPositions, dstIndices] as const;\n}\n","import { Body, Vec3, Quaternion as CQuaternion } from \"cannon-es\"\nimport {\n ComponentDefn,\n ComponentJSON, EntityComponentPlugin,\n IObject3D,\n IObject3DEventMap,\n literalStrings,\n Object3DComponent, Quaternion, Vector3\n} from \"threepipe\"\nimport {Cannon3DShapeComponent} from \"./Cannon3DShapeComponent.ts\";\nimport {CannonMaterial2, CannonPhysicsPlugin} from \"./CannonPhysicsPlugin.ts\";\n\nexport const physicsBodyType = ['static', 'dynamic', 'kinematic'] as const\nexport type PhysicsBodyType = typeof physicsBodyType[number]\n\nexport class Cannon3DBodyComponent extends Object3DComponent {\n static ComponentType = 'Cannon3DBodyComponent'\n static StateProperties: ComponentDefn['StateProperties'] = ['mass', {\n key: 'type',\n type: literalStrings(physicsBodyType),\n }, 'isTrigger', 'material']\n\n declare body: Body\n\n mass = 1\n type: PhysicsBodyType = 'dynamic'\n isTrigger = false\n material: CannonMaterial2 = new CannonMaterial2()\n\n private _typeToCannon(type: PhysicsBodyType) {\n if (type === 'static') return Body.STATIC\n else if (type === 'dynamic') return Body.DYNAMIC\n else if (type === 'kinematic') return Body.KINEMATIC\n return Body.STATIC\n }\n\n updateMassProperties(){\n if (!this.body) return\n try {\n this.body.updateMassProperties()\n }catch (e) {\n console.error('[Cannon3DBodyComponent] updateMassProperties error', e)\n }\n }\n updateBoundingRadius(){\n if (!this.body) return\n try {\n this.body.updateBoundingRadius()\n }catch (e) {\n console.error('[Cannon3DBodyComponent] updateBoundingRadius error', e)\n }\n }\n\n\n constructor() {\n super()\n this.onStateChange('mass', (v)=>{\n if (!this.body) return\n this.body.mass = v\n this.updateMassProperties()\n this.object.setDirty?.({source: 'Cannon3DBodyComponent'})\n })\n this.onStateChange('type', (v)=>{\n if (!this.body) return\n this.body.type = this._typeToCannon(v)\n this.updateMassProperties()\n this.object.setDirty?.({source: 'Cannon3DBodyComponent'})\n })\n this.onStateChange('isTrigger', (v)=>{\n if (!this.body) return\n this.body.isTrigger = v\n this.object.setDirty?.({source: 'Cannon3DBodyComponent'})\n })\n this.onStateChange('material', (v)=>{\n if (!this.body) return\n this.body.material = v\n this.uiConfig?.uiRefresh?.()\n this.object.setDirty?.({source: 'Cannon3DBodyComponent'})\n })\n }\n\n private _objectUpdate = (e: IObject3DEventMap['objectUpdate'])=>{\n if (e.source === 'Cannon3DBodyComponent' || e.source === 'CannonPhysicsPlugin') return\n const changeKey = e?.change ?? e?.key\n const update = !changeKey || changeKey === 'position' || changeKey === 'transform' || changeKey === 'quaternion'\n if (update) this.resetTransform(changeKey)\n }\n\n init(object: IObject3D, state: ComponentJSON['state']) {\n super.init(object, state)\n const cannon = this.ctx.plugin(CannonPhysicsPlugin)\n this.body = new Body()\n this.body.material = this.material\n this.body.mass = this.mass\n this.body.type = this._typeToCannon(this.type)\n this.body.isTrigger = this.isTrigger\n this.updateMassProperties()\n this.resetTransform()\n object.addEventListener('objectUpdate', this._objectUpdate)\n cannon.addBody(this)\n\n object.traverseModels && object.traverseModels(m=>{\n EntityComponentPlugin.GetComponents(m, Cannon3DShapeComponent).forEach(sh=>{\n this.addShape(sh, false)\n })\n }, {widgets: false, visible: false})\n if (this.shapeRefs.length) {\n this.refreshShapes()\n }\n\n }\n\n destroy(): Record<string, any> {\n this.shapeRefs.forEach(shape=>{\n this.removeShape(shape, false)\n })\n this.refreshShapes(false)\n\n this.object.removeEventListener('objectUpdate', this._objectUpdate)\n const cannon = this.ctx.plugin(CannonPhysicsPlugin)\n cannon.removeBody(this)\n this.body = null as any\n return super.destroy()\n }\n\n // update({time}: IAnimationLoopEvent) {\n //\n // }\n\n resetTransform(changeKey?: string) {\n // const changeKey = e?.change ?? e?.key\n if (!changeKey || changeKey === 'position' || changeKey === 'transform')\n this.body.position.set(...this.object.getWorldPosition(new Vector3()).toArray())\n if (!changeKey || changeKey === 'quaternion' || changeKey === 'transform')\n this.body.quaternion.set(...(this.object.getWorldQuaternion(new Quaternion()).toArray() as [number, number, number, number]))\n this.body.angularVelocity.set(0, 0, 0)\n this.body.velocity.set(0, 0, 0)\n }\n\n // static IsCompatible(_object: IObject3D) { return true }\n\n shapeRefs: Cannon3DShapeComponent[] = []\n addShape(shape: Cannon3DShapeComponent, refresh = true) {\n if (!this.shapeRefs.includes(shape)) {\n if (shape.bodyRef && shape.bodyRef !== this) {\n // ignore\n return\n }\n this.shapeRefs.push(shape)\n shape.bodyRef = this\n if (refresh) this.refreshShapes()\n }\n }\n removeShape(shape: Cannon3DShapeComponent, refresh = true) {\n const index = this.shapeRefs.indexOf(shape)\n if (index !== -1) {\n if (shape.bodyRef === this) shape.bodyRef = undefined\n this.shapeRefs.splice(index, 1)\n if (refresh) this.refreshShapes()\n }\n }\n refreshShapes(update = true) {\n let changed = false\n for (const s of this.body.shapes) {\n if (!this.shapeRefs.find(sh=>sh.result.shape === s)) {\n const index = this.body.shapes.indexOf(s)\n if (index !== -1) {\n this.body.shapes.splice(index, 1)\n this.body.shapeOffsets.splice(index, 1)\n this.body.shapeOrientations.splice(index, 1)\n s.body = null\n changed = true\n }\n }\n }\n const bodyObj = this.object\n bodyObj.updateMatrixWorld(true)\n const bodyWorldPos = bodyObj.getWorldPosition(new Vector3())\n const bodyWorldQuat = bodyObj.getWorldQuaternion(new Quaternion())\n for (const s of this.shapeRefs) {\n // s.bodyRef = this\n if (!this.body.shapes.includes(s.result.shape)) {\n const shape = s.result.shape\n this.body.shapes.push(shape)\n const offset = new Vec3()\n const quat = new CQuaternion()\n if(s.result.offset){\n offset.x += s.result.offset.x\n offset.y += s.result.offset.y\n offset.z += s.result.offset.z\n }\n if(s.result.orientation){\n quat.x = s.result.orientation.x\n quat.y = s.result.orientation.y\n quat.z = s.result.orientation.z\n quat.w = s.result.orientation.w\n }\n const shapeObj = s.object\n if(bodyObj !== shapeObj){\n shapeObj.updateMatrixWorld(true)\n const worldPos = shapeObj.getWorldPosition(new Vector3())\n offset.x += worldPos.x - bodyWorldPos.x\n offset.y += worldPos.y - bodyWorldPos.y\n offset.z += worldPos.z - bodyWorldPos.z\n const worldQuat = shapeObj.getWorldQuaternion(new Quaternion())\n const relQuat = worldQuat.multiply(bodyWorldQuat.invert())\n // todo we need to multiply here\n quat.x = relQuat.x\n quat.y = relQuat.y\n quat.z = relQuat.z\n quat.w = relQuat.w\n }\n this.body.shapeOffsets.push(offset)\n this.body.shapeOrientations.push(quat)\n shape.body = this.body\n changed = true\n }\n }\n if (update && changed) {\n this.updateMassProperties()\n this.updateBoundingRadius()\n\n this.body.aabbNeedsUpdate = true\n this.object.setDirty?.({source: 'Cannon3DBodyComponent'})\n }\n }\n}\n","// https://github.com/pmndrs/cannon-es-debugger/blob/master/src/cannon-es-debugger.ts\n\nimport {\n Box,\n ConvexPolyhedron,\n Cylinder,\n Heightfield,\n Quaternion as CannonQuaternion,\n Shape,\n Sphere,\n Trimesh,\n Vec3 as CannonVector3,\n} from 'cannon-es'\nimport {\n BoxGeometry,\n BufferGeometry,\n CylinderGeometry,\n Float32BufferAttribute,\n LineMaterial2,\n Mesh,\n PlaneGeometry,\n SphereGeometry,\n Vector3 as ThreeVector3,\n Wireframe,\n WireframeGeometry3\n} from \"threepipe\";\n\ntype ComplexShape = Shape & {geometryId?: number}\n\nexport function cannonDebugger() {\n const scale = 1\n\n const _tempVec0 = new CannonVector3()\n const _tempVec1 = new CannonVector3()\n const _tempVec2 = new CannonVector3()\n const _tempQuat0 = new CannonQuaternion()\n const _sphereGeometry = new SphereGeometry(1)\n const _boxGeometry = new BoxGeometry(1, 1, 1)\n const _planeGeometry = new PlaneGeometry(10, 10, 10, 10)\n // const _material = new MeshBasicMaterial({color: color ?? 0x00ff00, wireframe: true})\n const _material = new LineMaterial2({\n color: 0x00ff00,\n linewidth: 3, // in world units with size attenuation, pixels otherwise\n vertexColors: false,\n worldUnits: false,\n\n dashed: false,\n alphaToCoverage: true,\n\n toneMapped: false,\n transparent: true,\n depthTest: true,\n depthWrite: false,\n\n allowOverride: false,\n })\n _material.userData.renderToGBuffer = false\n _material.userData.renderToDepth = false\n\n// Move the planeGeometry forward a little bit to prevent z-fighting\n _planeGeometry.translate(0, 0, 0.0001)\n\n function createConvexPolyhedronGeometry(shape: ConvexPolyhedron): BufferGeometry {\n const geometry = new BufferGeometry()\n\n // Add vertices\n const positions = []\n for (let i = 0; i < shape.vertices.length; i++) {\n const vertex = shape.vertices[i]\n positions.push(vertex.x, vertex.y, vertex.z)\n }\n geometry.setAttribute('position', new Float32BufferAttribute(positions, 3))\n\n // Add faces\n const indices = []\n for (let i = 0; i < shape.faces.length; i++) {\n const face = shape.faces[i]\n const a = face[0]\n for (let j = 1; j < face.length - 1; j++) {\n const b = face[j]\n const c = face[j + 1]\n indices.push(a, b, c)\n }\n }\n\n geometry.setIndex(indices)\n geometry.computeBoundingSphere()\n geometry.computeVertexNormals()\n return geometry\n }\n\n function createTrimeshGeometry(shape: Trimesh): BufferGeometry {\n const geometry = new BufferGeometry()\n const positions = []\n const v0 = _tempVec0\n const v1 = _tempVec1\n const v2 = _tempVec2\n\n for (let i = 0; i < shape.indices.length / 3; i++) {\n shape.getTriangleVertices(i, v0, v1, v2)\n positions.push(v0.x, v0.y, v0.z)\n positions.push(v1.x, v1.y, v1.z)\n positions.push(v2.x, v2.y, v2.z)\n }\n\n geometry.setAttribute('position', new Float32BufferAttribute(positions, 3))\n geometry.computeBoundingSphere()\n geometry.computeVertexNormals()\n return geometry\n }\n\n function createHeightfieldGeometry(shape: Heightfield): BufferGeometry {\n const geometry = new BufferGeometry()\n const s = shape.elementSize || 1 // assumes square heightfield, else i*x, j*y\n const positions = shape.data.flatMap((row, i) => row.flatMap((z, j) => [i * s, j * s, z]))\n const indices = []\n\n for (let xi = 0; xi < shape.data.length - 1; xi++) {\n for (let yi = 0; yi < shape.data[xi].length - 1; yi++) {\n const stride = shape.data[xi].length\n const index = xi * stride + yi\n indices.push(index + 1, index + stride, index + stride + 1)\n indices.push(index + stride, index + 1, index)\n }\n }\n\n geometry.setIndex(indices)\n geometry.setAttribute('position', new Float32BufferAttribute(positions, 3))\n geometry.computeBoundingSphere()\n geometry.computeVertexNormals()\n return geometry\n }\n\n function createMesh(shape: Shape): Mesh {\n let mesh = new Mesh()\n const {SPHERE, BOX, PLANE, CYLINDER, CONVEXPOLYHEDRON, TRIMESH, HEIGHTFIELD} = Shape.types\n\n switch (shape.type) {\n case SPHERE: {\n mesh = new Wireframe(new WireframeGeometry3(_sphereGeometry), _material)\n break\n }\n case BOX: {\n mesh = new Wireframe(new WireframeGeometry3(_boxGeometry), _material)\n break\n }\n case PLANE: {\n mesh = new Wireframe(new WireframeGeometry3(_planeGeometry), _material)\n break\n }\n case CYLINDER: {\n const geometry = new CylinderGeometry(\n (shape as Cylinder).radiusTop,\n (shape as Cylinder).radiusBottom,\n (shape as Cylinder).height,\n (shape as Cylinder).numSegments\n )\n mesh = new Wireframe(new WireframeGeometry3(geometry), _material)\n ;(shape as ComplexShape).geometryId = geometry.id\n break\n }\n case CONVEXPOLYHEDRON: {\n const geometry = createConvexPolyhedronGeometry(shape as ConvexPolyhedron)\n mesh = new Wireframe(new WireframeGeometry3(geometry), _material)\n ;(shape as ComplexShape).geometryId = geometry.id\n break\n }\n case TRIMESH: {\n const geometry = createTrimeshGeometry(shape as Trimesh)\n mesh = new Wireframe(new WireframeGeometry3(geometry), _material)\n ;(shape as ComplexShape).geometryId = geometry.id\n break\n }\n case HEIGHTFIELD: {\n const geometry = createHeightfieldGeometry(shape as Heightfield)\n mesh = new Wireframe(new WireframeGeometry3(geometry), _material)\n ;(shape as ComplexShape).geometryId = geometry.id\n break\n }\n }\n return mesh\n }\n\n function scaleMesh(mesh: Mesh, shape: Shape | ComplexShape): void {\n const {SPHERE, BOX, PLANE, CYLINDER, CONVEXPOLYHEDRON, TRIMESH, HEIGHTFIELD} = Shape.types\n switch (shape.type) {\n case SPHERE: {\n const {radius} = shape as Sphere\n mesh.scale.set(radius * scale, radius * scale, radius * scale)\n break\n }\n case BOX: {\n mesh.scale.copy((shape as Box).halfExtents as unknown as ThreeVector3)\n mesh.scale.multiplyScalar(2 * scale)\n break\n }\n case PLANE: {\n break\n }\n case CYLINDER: {\n mesh.scale.set(1 * scale, 1 * scale, 1 * scale)\n break\n }\n case CONVEXPOLYHEDRON: {\n mesh.scale.set(1 * scale, 1 * scale, 1 * scale)\n break\n }\n case TRIMESH: {\n mesh.scale.copy((shape as Trimesh).scale as unknown as ThreeVector3).multiplyScalar(scale)\n break\n }\n case HEIGHTFIELD: {\n mesh.scale.set(1 * scale, 1 * scale, 1 * scale)\n break\n }\n }\n }\n\n function typeMatch(mesh: Mesh|undefined, shape: Shape | ComplexShape): boolean {\n if (!mesh) return false\n const {geometry} = mesh\n return (\n geometry instanceof SphereGeometry && shape.type === Shape.types.SPHERE ||\n geometry instanceof BoxGeometry && shape.type === Shape.types.BOX ||\n geometry instanceof PlaneGeometry && shape.type === Shape.types.PLANE ||\n // geometry.id === (shape as ComplexShape).geometryId && shape.type === Shape.types.BOX ||\n // geometry.id === (shape as ComplexShape).geometryId && shape.type === Shape.types.SPHERE ||\n // geometry.id === (shape as ComplexShape).geometryId && shape.type === Shape.types.PLANE ||\n geometry.id === (shape as ComplexShape).geometryId && shape.type === Shape.types.CONVEXPOLYHEDRON ||\n geometry.id === (shape as ComplexShape).geometryId && shape.type === Shape.types.TRIMESH ||\n geometry.id === (shape as ComplexShape).geometryId && shape.type === Shape.types.HEIGHTFIELD\n )\n }\n\n function updateMesh(mesh: Mesh|undefined, shape: Shape | ComplexShape) {\n if (!typeMatch(mesh, shape)) {\n mesh = createMesh(shape)\n }\n mesh && scaleMesh(mesh, shape)\n return mesh\n }\n\n\n return {\n createConvexPolyhedronGeometry,\n createTrimeshGeometry,\n createHeightfieldGeometry,\n createMesh,\n scaleMesh,\n typeMatch,\n updateMesh,\n }\n}\n\nexport const CannonDebugger = cannonDebugger();\n","import {\n AHelperWidget,\n ComponentDefn,\n ComponentJSON,\n EntityComponentPlugin, Group,\n IMaterial,\n IObject3D,\n literalStrings,\n Mesh,\n Object3DComponent, Object3DWidgetsPlugin,\n PartialRecord\n} from \"threepipe\"\nimport {getShapeParameters, ShapeParameters, ShapeResult, ShapeType, threeToCannon} from \"./threeToCannon\"\nimport {Box, Quaternion as CQuaternion, Shape, Vec3} from \"cannon-es\"\nimport {Cannon3DBodyComponent} from \"./Cannon3DBodyComponent.ts\";\nimport {CannonDebugger} from \"./helper.ts\";\n\nexport const typeToCannon = {\n autoBox: ShapeType.BOX,\n autoCylinder: ShapeType.CYLINDER,\n autoSphere: ShapeType.SPHERE,\n autoConvex: ShapeType.HULL,\n autoTrimesh: ShapeType.MESH,\n box: ShapeType.BOX,\n sphere: ShapeType.SPHERE,\n cylinder: ShapeType.CYLINDER,\n convex: ShapeType.HULL,\n trimesh: ShapeType.MESH,\n // plane: ShapeType.PLANE,\n} as const\n\nexport type CannonShapeType = keyof typeof typeToCannon\n\nexport const cannonShapeTypes = Object.keys(typeToCannon) as CannonShapeType[]\n\nexport const cannonShapeTypeParams: PartialRecord<CannonShapeType, ShapeParameters['params']> = {\n box: {x: 1, y: 1, z: 1},\n sphere: {radius: 1},\n cylinder: {radiusTop: 1, radiusBottom: 1, height: 1, segments: 8},\n convex: {vertices: new Float32Array([1, 1, 1, -1, 1, 1, -1, -1, 1, 1, -1, 1, 0, 0, -1]), faces: [[0, 1, 2, 3], [4, 0, 3], [4, 3, 2], [4, 2, 1], [4, 1, 0]]},\n trimesh: {vertices: new Float32Array([1, 1, 1, -1, -1, 1, -1, 1, -1, 1, -1, -1]), indices: new Uint32Array([0, 1, 2, 0, 3, 1, 0, 2, 3, 1, 3, 2])},\n // not for auto\n}\n\nexport class Cannon3DShapeComponent extends Object3DComponent {\n static ComponentType = 'Cannon3DShapeComponent'\n static StateProperties: ComponentDefn['StateProperties'] = [{\n key: 'type',\n type: literalStrings(cannonShapeTypes),\n }]\n static EmptyResult: ShapeResult = {shape: new Box(new Vec3(0.025, 0.025, 0.025))}\n\n result: ShapeResult = Cannon3DShapeComponent.EmptyResult\n bodyRef: Cannon3DBodyComponent | undefined\n type: CannonShapeType = 'autoBox'\n params: ShapeParameters | null = null\n\n constructor() {\n super()\n this.onStateChange('type', () => {\n // const shapeType = typeToCannon[this.shapeType]\n const params = cannonShapeTypeParams[this.type]\n if (params) {\n const params1 = {}\n Object.entries(params).forEach(([k, v]) => {\n (params1 as any)[k] = (v as Array<any>).slice ? (v as Array<any>).slice() : v\n })\n this.params = {\n type: typeToCannon[this.type],\n params: params1 as any,\n offset: new Vec3(),\n orientation: new CQuaternion(),\n }\n } else {\n this.params = null\n }\n if (!this.object) return\n this.refreshShape()\n })\n }\n\n // static IsCompatible(_object: IObject3D) { return true }\n\n init(object: IObject3D, state: ComponentJSON['state']) {\n super.init(object, state)\n this.refreshShape(false)\n const body = EntityComponentPlugin.GetComponentInParent(object, Cannon3DBodyComponent)\n if (!body) {\n // console.warn('Cannon3DShapeComponent: No Cannon3DBodyComponent found in parent hierarchy')\n } else {\n body.addShape(this)\n }\n this.object.addEventListener('objectUpdate', this.objectUpdate)\n this.object.addEventListener('childadded', this.childadded)\n this.object.addEventListener('childremoved', this.childremoved)\n this.ctx.viewer.addEventListener('preFrame', this.preFrame)\n }\n\n destroy(): Record<string, any> {\n if (this.bodyRef) {\n this.bodyRef.removeShape(this, false)\n this.bodyRef = undefined\n }\n this.object.removeEventListener('objectUpdate', this.objectUpdate)\n this.ctx.viewer.removeEventListener('preFrame', this.preFrame)\n this.result = Cannon3DShapeComponent.EmptyResult\n return super.destroy()\n }\n\n refreshShape(refreshBody = true) {\n // todo auto refresh on geometry or hierarchy changed if set to auto\n if (!this.object.__cannonShapes) this.object.__cannonShapes = []\n\n if(this.result){\n const index = this.object.__cannonShapes.indexOf(this.result)\n if(index !== -1) this.object.__cannonShapes.splice(index, 1)\n }\n\n const shapeType = typeToCannon[this.type]\n const shapeParameters = this.params ?? (shapeType ? getShapeParameters(this.object, {type: shapeType}) : null)\n\n // console.log('shapeParameters', shapeParameters)\n if (shapeParameters) {\n this.result = threeToCannon(this.object, undefined, shapeParameters)!\n } else {\n this.result = Cannon3DShapeComponent.EmptyResult\n }\n\n if (!this.object.__cannonShapes.includes(this.result)) this.object.__cannonShapes.push(this.result)\n\n if (refreshBody && this.bodyRef) this.bodyRef.refreshShapes()\n\n this.object.setDirty?.()\n this.ctx.plugin(Object3DWidgetsPlugin)?.refreshObject(this.object)\n }\n\n private _needsUpdate = false\n objectUpdate = (e: any)=>{\n }\n\n childadded = (e: any)=>{\n this._needsUpdate = true\n e.child.addEventListener('objectUpdate', this.objectUpdate)\n e.child.addEventListener('childadded', this.childadded)\n e.child.addEventListener('childremoved', this.childremoved)\n // console.log('childadded', {...e})\n }\n childremoved = (e: any)=>{\n this._needsUpdate = true\n e.child.removeEventListener('objectUpdate', this.objectUpdate)\n e.child.removeEventListener('childadded', this.childadded)\n e.child.removeEventListener('childremoved', this.childremoved)\n // console.log('childremoved', {...e})\n }\n\n preFrame = ()=>{\n if(this._needsUpdate){\n this._needsUpdate = false\n this.refreshShape()\n }\n }\n}\n\nexport class Cannon3DShapeHelper extends AHelperWidget {\n autoUpgradeChildren = false // used elsewhere\n private _shapes: ShapeResult[] = []\n private _meshes = new WeakMap<Shape, Mesh>()\n declare object: IObject3D | undefined\n\n private _gp = new Group()\n constructor(object: IObject3D) {\n super(object, false)\n\n this.attach(object)\n this.add(this._gp)\n this.visible = false\n }\n\n update() {\n super.update()\n\n this._gp.scale.setFromMatrixScale(this.matrixWorld)\n this._gp.scale.set(\n 1./this._gp.scale.x,\n 1./this._gp.scale.y,\n 1./this._gp.scale.z\n )\n\n const shapes = (this.object?.__cannonShapes || []) as ShapeResult[]\n const added = shapes.filter(s => !this._shapes.includes(s))\n const removed = this._shapes.filter(s => !shapes.includes(s))\n if (!added.length && !removed.length) return\n\n for (const shape of removed) {\n const mesh = this._meshes.get(shape.shape)\n if (mesh) {\n this._gp.remove(mesh)\n mesh.geometry.dispose()\n ;(mesh.material as IMaterial).dispose()\n this._meshes.delete(shape.shape)\n }\n }\n this._shapes = []\n for (const shape of shapes) {\n const current = this._meshes.get(shape.shape)\n // update\n const mesh = CannonDebugger.updateMesh(current, shape.shape)\n if (mesh !== current && mesh) {\n this._gp.add(mesh)\n if (current) {\n current.removeFromParent()\n current.geometry.dispose()\n ;(current.material as IMaterial).dispose()\n }\n this._meshes.set(shape.shape, mesh)\n }\n if(mesh){\n if(shape.offset){\n mesh.position.set(shape.offset.x, shape.offset.y, shape.offset.z)\n }\n if(shape.orientation){\n mesh.quaternion.set(shape.orientation.x, shape.orientation.y, shape.orientation.z, shape.orientation.w)\n }\n }\n this._shapes.push(shape)\n }\n\n }\n\n dispose() {\n this._shapes = []\n this.children.forEach(c => {\n if (c instanceof Mesh) {\n c.geometry.dispose()\n ;(c.material as IMaterial).dispose()\n }\n })\n super.dispose()\n }\n\n static Check(obj: IObject3D) {\n return !!EntityComponentPlugin.GetComponentData(obj, Cannon3DShapeComponent)\n }\n\n static Create(obj: IObject3D) {\n return new Cannon3DShapeHelper(obj as any)\n }\n}\n\ndeclare module 'threepipe' {\n interface IObject3D{\n /**\n * Shapes associated with this object\n * @internal - for cannon js physics\n */\n ['__cannonShapes']?: ShapeResult[]\n }\n}\n","import { Body, Box, ConeTwistConstraint, Constraint, Sphere, Vec3 } from \"cannon-es\"\nimport {\n BoxGeometry,\n Bone,\n ComponentDefn,\n ComponentJSON,\n IObject3D,\n Mesh,\n MeshStandardMaterial,\n Object3D,\n Object3DComponent,\n Quaternion,\n SkinnedMesh,\n SphereGeometry,\n uiFolderContainer,\n Vector3,\n ViewerEventMap\n} from \"threepipe\"\nimport { CannonMaterial2, CannonPhysicsPlugin } from \"./CannonPhysicsPlugin.ts\"\n\nexport interface RagdollConfig {\n scale: number\n angle: number\n angleShoulders: number\n twistAngle: number\n}\n\nexport interface RagdollParts {\n lowerLeftLeg: Body\n lowerRightLeg: Body\n upperLeftLeg: Body\n upperRightLeg: Body\n pelvis: Body\n upperBody: Body\n head: Body\n upperLeftArm: Body\n upperRightArm: Body\n lowerLeftArm: Body\n lowerRightArm: Body\n}\n\nexport interface RagdollConstraints {\n neckJoint: ConeTwistConstraint\n leftKneeJoint: ConeTwistConstraint\n rightKneeJoint: ConeTwistConstraint\n leftHipJoint: ConeTwistConstraint\n rightHipJoint: ConeTwistConstraint\n spineJoint: ConeTwistConstraint\n leftShoulder: ConeTwistConstraint\n rightShoulder: ConeTwistConstraint\n leftElbowJoint: ConeTwistConstraint\n rightElbowJoint: ConeTwistConstraint\n}\n\n@uiFolderContainer('Ragdoll')\nexport class CannonRagdollComponent extends Object3DComponent {\n static ComponentType = 'CannonRagdollComponent'\n static StateProperties: ComponentDefn['StateProperties'] = [\n 'scale',\n 'angle',\n 'angleShoulders',\n 'twistAngle',\n 'mass',\n 'autoCreateOnInit',\n 'hideRagdollMeshes'\n ]\n\n scale = 1\n\n angle = Math.PI / 4\n\n // Increased to allow arms to fall more naturally (nearly parallel to body)\n angleShoulders = Math.PI / 2\n\n twistAngle = Math.PI / 8\n\n mass = 1\n\n /** If true, creates ragdoll bodies on init. If false, waits for activate() call */\n autoCreateOnInit = true\n\n /** If true, hides the debug ragdoll meshes (useful when using with character model) */\n hideRagdollMeshes = false\n\n material: CannonMaterial2 = new CannonMaterial2()\n\n private _bodies: Body[] = []\n private _constraints: Constraint[] = []\n private _parts: RagdollParts | null = null\n private _ragdollConstraints: RagdollConstraints | null = null\n private _cannon: CannonPhysicsPlugin | null = null\n\n // Visual meshes\n private _meshes: Mesh[] = []\n private _meshContainer: Object3D | null = null\n private _visualMaterial: MeshStandardMaterial | null = null\n private _lastObjectPosition = new Vector3()\n private _lastObjectQuaternion = new Quaternion()\n private _initialized = false\n\n // Ragdoll state\n private _isActive = false\n private _characterMeshes: SkinnedMesh[] = []\n private _boneMap: Map<string, Bone> = new Map()\n\n // Store initial bone transforms (bind pose) and initial ragdoll body transforms\n private _initialBoneQuats: Map<string, Quaternion> = new Map()\n private _initialBoneWorldQuats: Map<string, Quaternion> = new Map()\n private _initialBodyQuats: Map<Body, Quaternion> = new Map()\n\n // Bone name mappings (common Mixamo bone names)\n private _boneNames = {\n head: ['Head', 'mixamorigHead', 'head'],\n neck: ['Neck', 'mixamorigNeck', 'neck'],\n spine: ['Spine', 'mixamorigSpine', 'spine'],\n spine1: ['Spine1', 'mixamorigSpine1', 'spine1'],\n spine2: ['Spine2', 'mixamorigSpine2', 'spine2'],\n hips: ['Hips', 'mixamorigHips', 'hips', 'pelvis'],\n leftUpLeg: ['LeftUpLeg', 'mixamorigLeftUpLeg', 'left_upper_leg', 'LeftThigh'],\n rightUpLeg: ['RightUpLeg', 'mixamorigRightUpLeg', 'right_upper_leg', 'RightThigh'],\n leftLeg: ['LeftLeg', 'mixamorigLeftLeg', 'left_lower_leg', 'LeftShin'],\n rightLeg: ['RightLeg', 'mixamorigRightLeg', 'right_lower_leg', 'RightShin'],\n leftArm: ['LeftArm', 'mixamorigLeftArm', 'left_upper_arm', 'LeftShoulder'],\n rightArm: ['RightArm', 'mixamorigRightArm', 'right_upper_arm', 'RightShoulder'],\n leftForeArm: ['LeftForeArm', 'mixamorigLeftForeArm', 'left_lower_arm', 'LeftElbow'],\n rightForeArm: ['RightForeArm', 'mixamorigRightForeArm', 'right_lower_arm', 'RightElbow'],\n }\n\n // Reusable temp objects for transform calculations\n private _currentObjectPosition = new Vector3()\n private _currentObjectQuaternion = new Quaternion()\n private _deltaQuaternion = new Quaternion()\n private _invLastQuaternion = new Quaternion()\n private _tempVec3 = new Vector3()\n private _pivotPoint = new Vector3()\n private _tempWorldPos = new Vector3()\n private _tempWorldQuat = new Quaternion()\n\n get bodies(): Body[] {\n return this._bodies\n }\n\n get constraints(): Constraint[] {\n return this._constraints\n }\n\n get parts(): RagdollParts | null {\n return this._parts\n }\n\n get ragdollConstraints(): RagdollConstraints | null {\n return this._ragdollConstraints\n }\n\n /** Returns true if ragdoll physics is currently active */\n get isActive(): boolean {\n return this._isActive\n }\n\n constructor() {\n super()\n this.onStateChange('scale', () => this._recreateRagdoll())\n this.onStateChange('angle', () => this._updateConstraints())\n this.onStateChange('angleShoulders', () => this._updateConstraints())\n this.onStateChange('twistAngle', () => this._updateConstraints())\n this.onStateChange('mass', () => this._updateMass())\n this.onStateChange('hideRagdollMeshes', () => this._updateMeshVisibility())\n }\n\n init(object: IObject3D, state: ComponentJSON['state']) {\n super.init(object, state)\n this._cannon = this.ctx.plugin(CannonPhysicsPlugin)\n\n // Clean up any existing ragdoll first\n this._removeRagdoll()\n\n // Create visual material\n if (!this._visualMaterial) {\n this._visualMaterial = new MeshStandardMaterial({ color: 0x888888 })\n }\n\n // Create container for meshes in the scene (not the object, to avoid saving)\n if (!this._meshContainer) {\n this._meshContainer = new Object3D()\n this._meshContainer.name = `RagdollMeshes_${this.object.uuid}`\n // Add to scene instead of object to prevent serialization\n this.ctx.viewer?.scene.add(this._meshContainer)\n }\n\n // Find character meshes and build bone map\n this._findCharacterMeshes()\n this._buildBoneMap()\n\n if (this.autoCreateOnInit) {\n this._createRagdoll()\n // Start deactivated - bodies are kinematic until activated\n this._deactivateBodies()\n }\n\n this._updateMeshVisibility()\n }\n\n destroy(): Record<string, any> {\n this._removeRagdoll()\n\n // Remove mesh container from scene\n if (this._meshContainer) {\n this.ctx.viewer?.scene.remove(this._meshContainer)\n this._meshContainer = null\n }\n\n // Dispose material\n if (this._visualMaterial) {\n this._visualMaterial.dispose()\n this._visualMaterial = null\n }\n\n this._cannon = null\n return super.destroy()\n }\n\n // Called automatically by the component system each frame\n preFrame(_event: ViewerEventMap[\"preFrame\"]): void {\n if (this._isActive) {\n // When ragdoll is active, sync bones to follow ragdoll bodies\n this._syncRagdollToBones()\n } else {\n // When not active, sync ragdoll to follow object transform\n this._syncObjectPosition()\n }\n this._updateMeshes()\n }\n\n /**\n * Syncs the character's bones to match the ragdoll body positions/rotations.\n * Called each frame when ragdoll is active.\n *\n * The approach:\n * 1. Calculate how much the ragdoll body has rotated in world space (delta from initial)\n * 2. Apply that same world-space delta to the bone's initial world orientation\n * 3. Convert the new world orientation back to local space for the bone\n *\n * Note: Only the root bone (hips) gets position updates. Other bones only get rotation updates\n * because in a skeleton hierarchy, bone positions are fixed (defined by bone length).\n */\n private _syncRagdollToBones() {\n if (!this._parts || this._characterMeshes.length === 0) return\n\n // Helper to sync a bone's rotation to a ragdoll body\n const syncBoneRotation = (body: Body, boneNames: string[]) => {\n const bone = this._findBone(boneNames)\n if (!bone) return\n\n const boneName = bone.name\n\n // Get stored initial values\n const initialBodyQuat = this._initialBodyQuats.get(body)\n const initialBoneWorldQuat = this._initialBoneWorldQuats.get(boneName)\n\n if (!initialBodyQuat || !initialBoneWorldQuat) {\n return\n }\n\n // Get the body's current world quaternion\n const currentBodyQuat = new Quaternion(\n body.quaternion.x,\n body.quaternion.y,\n body.quaternion.z,\n body.quaternion.w\n )\n\n // Calculate delta rotation in world space: how much has the body rotated?\n // deltaQuat = currentBodyQuat * inverse(initialBodyQuat)\n const initialBodyQuatInverse = initialBodyQuat.clone().invert()\n const worldDeltaQuat = currentBodyQuat.clone().multiply(initialBodyQuatInverse)\n\n // Apply world delta to the bone's initial world orientation\n // newBoneWorldQuat = worldDeltaQuat * initialBoneWorldQuat\n const newBoneWorldQuat = worldDeltaQuat.clone().multiply(initialBoneWorldQuat)\n\n // Convert new world quaternion to local space\n if (bone.parent) {\n // Get parent's current world quaternion\n const parentWorldQuat = new Quaternion()\n bone.parent.getWorldQuaternion(parentWorldQuat)\n\n // localQuat = inverse(parentWorldQuat) * newBoneWorldQuat\n const parentWorldQuatInverse = parentWorldQuat.clone().invert()\n const newLocalQuat = parentWorldQuatInverse.clone().multiply(newBoneWorldQuat)\n\n bone.quaternion.copy(newLocalQuat)\n } else {\n // No parent, world = local\n bone.quaternion.copy(newBoneWorldQuat)\n }\n }\n\n // Sync root bone (hips) - this one gets both position and rotation\n const hipsBone = this._findBone(this._boneNames.hips)\n if (hipsBone && this._parts.pelvis) {\n // Position: only the root bone should move in world space\n this._tempWorldPos.set(\n this._parts.pelvis.position.x,\n this._parts.pelvis.position.y,\n this._parts.pelvis.position.z\n )\n\n if (hipsBone.parent) {\n const parentMatrixWorldInverse = hipsBone.parent.matrixWorld.clone().invert()\n this._tempWorldPos.applyMatrix4(parentMatrixWorldInverse)\n }\n hipsBone.position.copy(this._tempWorldPos)\n\n // Rotation\n syncBoneRotation(this._parts.pelvis, this._boneNames.hips)\n }\n\n // Sync all other bones - rotation only (no position changes)\n syncBoneRotation(this._parts.head, this._boneNames.head)\n syncBoneRotation(this._parts.upperBody, this._boneNames.spine2)\n syncBoneRotation(this._parts.upperLeftLeg, this._boneNames.leftUpLeg)\n syncBoneRotation(this._parts.upperRightLeg, this._boneNames.rightUpLeg)\n syncBoneRotation(this._parts.lowerLeftLeg, this._boneNames.leftLeg)\n syncBoneRotation(this._parts.lowerRightLeg, this._boneNames.rightLeg)\n syncBoneRotation(this._parts.upperLeftArm, this._boneNames.leftArm)\n syncBoneRotation(this._parts.upperRightArm, this._boneNames.rightArm)\n syncBoneRotation(this._parts.lowerLeftArm, this._boneNames.leftForeArm)\n syncBoneRotation(this._parts.lowerRightArm, this._boneNames.rightForeArm)\n\n // Update the skeleton's matrix world\n for (const skinnedMesh of this._characterMeshes) {\n if (skinnedMesh.skeleton) {\n skinnedMesh.skeleton.update()\n }\n }\n }\n\n private _syncObjectPosition() {\n if (!this._initialized || this._bodies.length === 0) return\n\n // Get current object world transform\n this.object.getWorldPosition(this._currentObjectPosition)\n this.object.getWorldQuaternion(this._currentObjectQuaternion)\n\n // Calculate position delta\n const deltaX = this._currentObjectPosition.x - this._lastObjectPosition.x\n const deltaY = this._currentObjectPosition.y - this._lastObjectPosition.y\n const deltaZ = this._currentObjectPosition.z - this._lastObjectPosition.z\n\n // Check if rotation changed\n const rotationChanged = !this._currentObjectQuaternion.equals(this._lastObjectQuaternion)\n\n // If rotation changed, we need to rotate all bodies around the object's position\n if (rotationChanged) {\n // Calculate the delta rotation: deltaQ = currentQ * inverse(lastQ)\n this._invLastQuaternion.copy(this._lastObjectQuaternion).invert()\n this._deltaQuaternion.copy(this._currentObjectQuaternion).multiply(this._invLastQuaternion)\n\n // Pivot point is the object's last position (before any position change)\n this._pivotPoint.copy(this._lastObjectPosition)\n\n // Rotate each body around the pivot point\n for (const body of this._bodies) {\n // Get body position relative to pivot\n this._tempVec3.set(\n body.position.x - this._pivotPoint.x,\n body.position.y - this._pivotPoint.y,\n body.position.z - this._pivotPoint.z\n )\n\n // Rotate the relative position by delta quaternion\n this._tempVec3.applyQuaternion(this._deltaQuaternion)\n\n // Set new position (pivot + rotated relative position)\n body.position.x = this._pivotPoint.x + this._tempVec3.x\n body.position.y = this._pivotPoint.y + this._tempVec3.y\n body.position.z = this._pivotPoint.z + this._tempVec3.z\n\n // Also rotate the body's own quaternion\n // Convert cannon quaternion to three quaternion, apply delta, convert back\n const bodyQuat = new Quaternion(\n body.quaternion.x,\n body.quaternion.y,\n body.quaternion.z,\n body.quaternion.w\n )\n bodyQuat.premultiply(this._deltaQuaternion)\n body.quaternion.set(bodyQuat.x, bodyQuat.y, bodyQuat.z, bodyQuat.w)\n }\n\n // Update last quaternion\n this._lastObjectQuaternion.copy(this._currentObjectQuaternion)\n }\n\n // Apply position delta (after rotation, so we translate the already-rotated positions)\n if (deltaX !== 0 || deltaY !== 0 || deltaZ !== 0) {\n for (const body of this._bodies) {\n body.position.x += deltaX\n body.position.y += deltaY\n body.position.z += deltaZ\n }\n\n // Update last position\n this._lastObjectPosition.copy(this._currentObjectPosition)\n }\n }\n\n private _updateMeshes() {\n if (!this._parts || this._meshes.length === 0) return\n\n // Sync each mesh position/rotation with its corresponding body\n for (let i = 0; i < this._bodies.length && i < this._meshes.length; i++) {\n const body = this._bodies[i]\n const mesh = this._meshes[i]\n\n mesh.position.set(body.position.x, body.position.y, body.position.z)\n mesh.quaternion.set(\n body.quaternion.x,\n body.quaternion.y,\n body.quaternion.z,\n body.quaternion.w\n )\n }\n }\n\n private _recreateRagdoll() {\n if (!this._cannon) return\n this._removeRagdoll()\n this._createRagdoll()\n this.object.setDirty?.({ source: 'CannonRagdollComponent' })\n }\n\n private _updateMass() {\n for (const body of this._bodies) {\n body.mass = this.mass\n body.updateMassProperties()\n }\n this.object.setDirty?.({ source: 'CannonRagdollComponent' })\n }\n\n private _updateConstraints() {\n // Recreate constraints with new angles\n this._recreateRagdoll()\n }\n\n private _createRagdoll() {\n if (!this._cannon) return\n\n const scale = this.scale\n const angle = this.angle\n const angleShoulders = this.angleShoulders\n const twistAngle = this.twistAngle\n\n // Dimensions (same as original)\n const shouldersDistance = 0.5 * scale\n const upperArmLength = 0.4 * scale\n const lowerArmLength = 0.4 * scale\n const upperArmSize = 0.2 * scale\n const lowerArmSize = 0.2 * scale\n const neckLength = 0.1 * scale\n const headRadius = 0.25 * scale\n const upperBodyLength = 0.6 * scale\n const pelvisLength = 0.4 * scale\n const upperLegLength = 0.5 * scale\n const upperLegSize = 0.2 * scale\n const lowerLegSize = 0.2 * scale\n const lowerLegLength = 0.5 * scale\n\n // Shapes - Original uses Z as up, we use Y as up\n // Original: Box(x, y, z) where Z is height for vertical parts\n // Ours: Box(x, y, z) where Y is height for vertical parts\n const headShape = new Sphere(headRadius)\n\n // Arms extend along X axis (horizontal)\n const upperArmShape = new Box(\n new Vec3(upperArmLength * 0.5, upperArmSize * 0.5, upperArmSize * 0.5)\n )\n const lowerArmShape = new Box(\n new Vec3(lowerArmLength * 0.5, lowerArmSize * 0.5, lowerArmSize * 0.5)\n )\n\n // Upper body: X is width (shoulders), Z is depth, Y is height\n // Original: (shouldersDistance * 0.5, lowerArmSize * 0.5, upperBodyLength * 0.5)\n // Convert Z->Y for height\n const upperBodyShape = new Box(\n new Vec3(shouldersDistance * 0.5, upperBodyLength * 0.5, lowerArmSize * 0.5)\n )\n const pelvisShape = new Box(\n new Vec3(shouldersDistance * 0.5, pelvisLength * 0.5, lowerArmSize * 0.5)\n )\n\n // Legs: vertical, so Y is the length\n const upperLegShape = new Box(\n new Vec3(upperLegSize * 0.5, upperLegLength * 0.5, lowerArmSize * 0.5)\n )\n const lowerLegShape = new Box(\n new Vec3(lowerLegSize * 0.5, lowerLegLength * 0.5, lowerArmSize * 0.5)\n )\n\n // Get world position and rotation of the object as the base transform\n const basePos = this.object.getWorldPosition(new Vector3())\n const baseQuat = this.object.getWorldQuaternion(new Quaternion())\n\n // Helper to transform a local offset by the object's world rotation and add to world position\n const transformLocalToWorld = (localOffset: Vector3): Vec3 => {\n const worldOffset = localOffset.clone().applyQuaternion(baseQuat)\n return new Vec3(\n basePos.x + worldOffset.x,\n basePos.y + worldOffset.y,\n basePos.z + worldOffset.z\n )\n }\n\n // Helper to create mesh for a body\n const createMeshForBody = (body: Body, isHead = false): Mesh => {\n let geometry\n if (isHead) {\n geometry = new SphereGeometry(headRadius, 16, 16)\n } else {\n const shape = body.shapes[0] as Box\n geometry = new BoxGeometry(\n shape.halfExtents.x * 2,\n shape.halfExtents.y * 2,\n shape.halfExtents.z * 2\n )\n }\n const mesh = new Mesh(geometry, this._visualMaterial!)\n mesh.position.set(body.position.x, body.position.y, body.position.z)\n this._meshContainer?.add(mesh)\n this._meshes.push(mesh)\n return mesh\n }\n\n // Lower legs - positions converted from Z-up to Y-up\n // Original: position(x, 0, lowerLegLength/2) -> ours: position(x, lowerLegLength/2, 0)\n const lowerLeftLeg = new Body({\n mass: this.mass,\n position: transformLocalToWorld(new Vector3(shouldersDistance / 2, lowerLegLength / 2, 0)),\n material: this.material,\n })\n const lowerRightLeg = new Body({\n mass: this.mass,\n position: transformLocalToWorld(new Vector3(-shouldersDistance / 2, lowerLegLength / 2, 0)),\n material: this.material,\n })\n lowerLeftLeg.addShape(lowerLegShape)\n lowerRightLeg.addShape(lowerLegShape)\n lowerLeftLeg.quaternion.set(baseQuat.x, baseQuat.y, baseQuat.z, baseQuat.w)\n lowerRightLeg.quaternion.set(baseQuat.x, baseQuat.y, baseQuat.z, baseQuat.w)\n this._bodies.push(lowerLeftLeg, lowerRightLeg)\n createMeshForBody(lowerLeftLeg)\n createMeshForBody(lowerRightLeg)\n\n // Upper legs\n const upperLeftLeg = new Body({\n mass: this.mass,\n position: transformLocalToWorld(new Vector3(shouldersDistance / 2, lowerLegLength + upperLegLength / 2, 0)),\n material: this.material,\n })\n const upperRightLeg = new Body({\n mass: this.mass,\n position: transformLocalToWorld(new Vector3(-shouldersDistance / 2, lowerLegLength + upperLegLength / 2, 0)),\n material: this.material,\n })\n upperLeftLeg.addShape(upperLegShape)\n upperRightLeg.addShape(upperLegShape)\n upperLeftLeg.quaternion.set(baseQuat.x, baseQuat.y, baseQuat.z, baseQuat.w)\n upperRightLeg.quaternion.set(baseQuat.x, baseQuat.y, baseQuat.z, baseQuat.w)\n this._bodies.push(upperLeftLeg, upperRightLeg)\n createMeshForBody(upperLeftLeg)\n createMeshForBody(upperRightLeg)\n\n // Pelvis\n const pelvisLocalY = lowerLegLength + upperLegLength + pelvisLength / 2\n const pelvis = new Body({\n mass: this.mass,\n position: transformLocalToWorld(new Vector3(0, pelvisLocalY, 0)),\n material: this.material,\n })\n pelvis.addShape(pelvisShape)\n pelvis.quaternion.set(baseQuat.x, baseQuat.y, baseQuat.z, baseQuat.w)\n this._bodies.push(pelvis)\n createMeshForBody(pelvis)\n\n // Upper body\n const upperBodyLocalY = pelvisLocalY + pelvisLength / 2 + upperBodyLength / 2\n const upperBody = new Body({\n mass: this.mass,\n position: transformLocalToWorld(new Vector3(0, upperBodyLocalY, 0)),\n material: this.material,\n })\n upperBody.addShape(upperBodyShape)\n upperBody.quaternion.set(baseQuat.x, baseQuat.y, baseQuat.z, baseQuat.w)\n this._bodies.push(upperBody)\n createMeshForBody(upperBody)\n\n // Head\n const headLocalY = upperBodyLocalY + upperBodyLength / 2 + headRadius + neckLength\n const head = new Body({\n mass: this.mass,\n position: transformLocalToWorld(new Vector3(0, headLocalY, 0)),\n material: this.material,\n })\n head.addShape(headShape)\n head.quaternion.set(baseQuat.x, baseQuat.y, baseQuat.z, baseQuat.w)\n this._bodies.push(head)\n createMeshForBody(head, true)\n\n // Upper arms - at shoulder height\n const armLocalY = upperBodyLocalY + upperBodyLength / 2\n const upperLeftArm = new Body({\n mass: this.mass,\n position: transformLocalToWorld(new Vector3(shouldersDistance / 2 + upperArmLength / 2, armLocalY, 0)),\n material: this.material,\n })\n const upperRightArm = new Body({\n mass: this.mass,\n position: transformLocalToWorld(new Vector3(-shouldersDistance / 2 - upperArmLength / 2, armLocalY, 0)),\n material: this.material,\n })\n upperLeftArm.addShape(upperArmShape)\n upperRightArm.addShape(upperArmShape)\n upperLeftArm.quaternion.set(baseQuat.x, baseQuat.y, baseQuat.z, baseQuat.w)\n upperRightArm.quaternion.set(baseQuat.x, baseQuat.y, baseQuat.z, baseQuat.w)\n this._bodies.push(upperLeftArm, upperRightArm)\n createMeshForBody(upperLeftArm)\n createMeshForBody(upperRightArm)\n\n // Lower arms\n const lowerLeftArm = new Body({\n mass: this.mass,\n position: transformLocalToWorld(new Vector3(\n shouldersDistance / 2 + upperArmLength + lowerArmLength / 2,\n armLocalY,\n 0\n )),\n material: this.material,\n })\n const lowerRightArm = new Body({\n mass: this.mass,\n position: transformLocalToWorld(new Vector3(\n -shouldersDistance / 2 - upperArmLength - lowerArmLength / 2,\n armLocalY,\n 0\n )),\n material: this.material,\n })\n lowerLeftArm.addShape(lowerArmShape)\n lowerRightArm.addShape(lowerArmShape)\n lowerLeftArm.quaternion.set(baseQuat.x, baseQuat.y, baseQuat.z, baseQuat.w)\n lowerRightArm.quaternion.set(baseQuat.x, baseQuat.y, baseQuat.z, baseQuat.w)\n this._bodies.push(lowerLeftArm, lowerRightArm)\n createMeshForBody(lowerLeftArm)\n createMeshForBody(lowerRightArm)\n\n // Store parts reference\n this._parts = {\n lowerLeftLeg,\n lowerRightLeg,\n upperLeftLeg,\n upperRightLeg,\n pelvis,\n upperBody,\n head,\n upperLeftArm,\n upperRightArm,\n lowerLeftArm,\n lowerRightArm,\n }\n\n // Add bodies to world\n for (const body of this._bodies) {\n this._cannon.world.addBody(body)\n }\n\n // CONSTRAINTS - Convert from Z-up to Y-up\n // Original uses UNIT_Z for vertical axis, we use UNIT_Y\n // Pivots: original (x, y, z) where z is height -> ours (x, y, z) where y is height\n // So pivot (x, 0, z) -> (x, z, 0)\n\n // Neck joint\n // Original: pivotA(0, 0, -headRadius - neckLength/2), pivotB(0, 0, upperBodyLength/2)\n // Ours: pivotA(0, -headRadius - neckLength/2, 0), pivotB(0, upperBodyLength/2, 0)\n const neckJoint = new ConeTwistConstraint(head, upperBody, {\n pivotA: new Vec3(0, -headRadius - neckLength / 2, 0),\n pivotB: new Vec3(0, upperBodyLength / 2, 0),\n axisA: Vec3.UNIT_Y,\n axisB: Vec3.UNIT_Y,\n angle,\n twistAngle,\n })\n this._constraints.push(neckJoint)\n\n // Knee joints\n // Original: pivotA(0, 0, lowerLegLength/2), pivotB(0, 0, -upperLegLength/2)\n // Ours: pivotA(0, lowerLegLength/2, 0), pivotB(0, -upperLegLength/2, 0)\n const leftKneeJoint = new ConeTwistConstraint(lowerLeftLeg, upperLeftLeg, {\n pivotA: new Vec3(0, lowerLegLength / 2, 0),\n pivotB: new Vec3(0, -upperLegLength / 2, 0),\n axisA: Vec3.UNIT_Y,\n axisB: Vec3.UNIT_Y,\n angle,\n twistAngle,\n })\n const rightKneeJoint = new ConeTwistConstraint(lowerRightLeg, upperRightLeg, {\n pivotA: new Vec3(0, lowerLegLength / 2, 0),\n pivotB: new Vec3(0, -upperLegLength / 2, 0),\n axisA: Vec3.UNIT_Y,\n axisB: Vec3.UNIT_Y,\n angle,\n twistAngle,\n })\n this._constraints.push(leftKneeJoint, rightKneeJoint)\n\n // Hip joints\n // Original: pivotA(0, 0, upperLegLength/2), pivotB(shouldersDistance/2, 0, -pelvisLength/2)\n // Ours: pivotA(0, upperLegLength/2, 0), pivotB(shouldersDistance/2, -pelvisLength/2, 0)\n const leftHipJoint = new ConeTwistConstraint(upperLeftLeg, pelvis, {\n pivotA: new Vec3(0, upperLegLength / 2, 0),\n pivotB: new Vec3(shouldersDistance / 2, -pelvisLength / 2, 0),\n axisA: Vec3.UNIT_Y,\n axisB: Vec3.UNIT_Y,\n angle,\n twistAngle,\n })\n const rightHipJoint = new ConeTwistConstraint(upperRightLeg, pelvis, {\n pivotA: new Vec3(0, upperLegLength / 2, 0),\n pivotB: new Vec3(-shouldersDistance / 2, -pelvisLength / 2, 0),\n axisA: Vec3.UNIT_Y,\n axisB: Vec3.UNIT_Y,\n angle,\n twistAngle,\n })\n this._constraints.push(leftHipJoint, rightHipJoint)\n\n // Spine\n // Original: pivotA(0, 0, pelvisLength/2), pivotB(0, 0, -upperBodyLength/2)\n // Ours: pivotA(0, pelvisLength/2, 0), pivotB(0, -upperBodyLength/2, 0)\n const spineJoint = new ConeTwistConstraint(pelvis, upperBody, {\n pivotA: new Vec3(0, pelvisLength / 2, 0),\n pivotB: new Vec3(0, -upperBodyLength / 2, 0),\n axisA: Vec3.UNIT_Y,\n axisB: Vec3.UNIT_Y,\n angle,\n twistAngle,\n })\n this._constraints.push(spineJoint)\n\n // Shoulders - In Y-up world, arms need to rotate around Z axis to swing down\n // The cone axis should be Z so the arm can swing in the X-Y plane (up/down motion)\n const leftShoulder = new ConeTwistConstraint(upperBody, upperLeftArm, {\n pivotA: new Vec3(shouldersDistance / 2, upperBodyLength / 2, 0),\n pivotB: new Vec3(-upperArmLength / 2, 0, 0),\n axisA: Vec3.UNIT_Z,\n axisB: Vec3.UNIT_Z,\n angle: angleShoulders,\n twistAngle,\n })\n const rightShoulder = new ConeTwistConstraint(upperBody, upperRightArm, {\n pivotA: new Vec3(-shouldersDistance / 2, upperBodyLength / 2, 0),\n pivotB: new Vec3(upperArmLength / 2, 0, 0),\n axisA: Vec3.UNIT_Z,\n axisB: Vec3.UNIT_Z,\n angle: angleShoulders,\n twistAngle,\n })\n this._constraints.push(leftShoulder, rightShoulder)\n\n // Elbow joints - also need Z axis for bending in Y-up world\n const leftElbowJoint = new ConeTwistConstraint(lowerLeftArm, upperLeftArm, {\n pivotA: new Vec3(-lowerArmLength / 2, 0, 0),\n pivotB: new Vec3(upperArmLength / 2, 0, 0),\n axisA: Vec3.UNIT_Z,\n axisB: Vec3.UNIT_Z,\n angle,\n twistAngle,\n })\n const rightElbowJoint = new ConeTwistConstraint(lowerRightArm, upperRightArm, {\n pivotA: new Vec3(lowerArmLength / 2, 0, 0),\n pivotB: new Vec3(-upperArmLength / 2, 0, 0),\n axisA: Vec3.UNIT_Z,\n axisB: Vec3.UNIT_Z,\n angle,\n twistAngle,\n })\n this._constraints.push(leftElbowJoint, rightElbowJoint)\n\n // Store constraints reference\n this._ragdollConstraints = {\n neckJoint,\n leftKneeJoint,\n rightKneeJoint,\n leftHipJoint,\n rightHipJoint,\n spineJoint,\n leftShoulder,\n rightShoulder,\n leftElbowJoint,\n rightElbowJoint,\n }\n\n // Add constraints to world\n for (const constraint of this._constraints) {\n this._cannon.world.addConstraint(constraint)\n }\n\n // Store initial object transform for tracking movement\n this.object.getWorldPosition(this._lastObjectPosition)\n this.object.getWorldQuaternion(this._lastObjectQuaternion)\n this._initialized = true\n }\n\n private _removeRagdoll() {\n // Remove constraints from world\n for (const constraint of this._constraints) {\n this._cannon?.world.removeConstraint(constraint)\n }\n this._constraints = []\n this._ragdollConstraints = null\n\n // Remove bodies from world\n for (const body of this._bodies) {\n this._cannon?.world.removeBody(body)\n }\n this._bodies = []\n this._parts = null\n\n // Remove and dispose meshes\n for (const mesh of this._meshes) {\n mesh.geometry.dispose()\n this._meshContainer?.remove(mesh)\n }\n this._meshes = []\n }\n\n /**\n * Reset the ragdoll to its initial position relative to the object\n */\n resetPosition() {\n if (!this._parts) return\n\n const basePos = this.object.getWorldPosition(new Vector3())\n const scale = this.scale\n\n const shouldersDistance = 0.5 * scale\n const lowerLegLength = 0.5 * scale\n const upperLegLength = 0.5 * scale\n const pelvisLength = 0.4 * scale\n const upperBodyLength = 0.6 * scale\n const headRadius = 0.25 * scale\n const neckLength = 0.1 * scale\n const upperArmLength = 0.4 * scale\n const lowerArmLength = 0.4 * scale\n\n const resetBody = (body: Body, pos: Vec3) => {\n body.position.copy(pos)\n body.velocity.set(0, 0, 0)\n body.angularVelocity.set(0, 0, 0)\n body.quaternion.set(0, 0, 0, 1)\n }\n\n resetBody(this._parts.lowerLeftLeg, new Vec3(\n basePos.x + shouldersDistance / 2,\n basePos.y + lowerLegLength / 2,\n basePos.z\n ))\n resetBody(this._parts.lowerRightLeg, new Vec3(\n basePos.x - shouldersDistance / 2,\n basePos.y + lowerLegLength / 2,\n basePos.z\n ))\n resetBody(this._parts.upperLeftLeg, new Vec3(\n basePos.x + shouldersDistance / 2,\n basePos.y + lowerLegLength + upperLegLength / 2,\n basePos.z\n ))\n resetBody(this._parts.upperRightLeg, new Vec3(\n basePos.x - shouldersDistance / 2,\n basePos.y + lowerLegLength + upperLegLength / 2,\n basePos.z\n ))\n\n const pelvisY = basePos.y + lowerLegLength + upperLegLength + pelvisLength / 2\n resetBody(this._parts.pelvis, new Vec3(basePos.x, pelvisY, basePos.z))\n\n const upperBodyY = pelvisY + pelvisLength / 2 + upperBodyLength / 2\n resetBody(this._parts.upperBody, new Vec3(basePos.x, upperBodyY, basePos.z))\n\n const headY = upperBodyY + upperBodyLength / 2 + headRadius + neckLength\n resetBody(this._parts.head, new Vec3(basePos.x, headY, basePos.z))\n\n const armY = upperBodyY + upperBodyLength / 2\n resetBody(this._parts.upperLeftArm, new Vec3(\n basePos.x + shouldersDistance / 2 + upperArmLength / 2,\n armY,\n basePos.z\n ))\n resetBody(this._parts.upperRightArm, new Vec3(\n basePos.x - shouldersDistance / 2 - upperArmLength / 2,\n armY,\n basePos.z\n ))\n resetBody(this._parts.lowerLeftArm, new Vec3(\n basePos.x + shouldersDistance / 2 + upperArmLength + lowerArmLength / 2,\n armY,\n basePos.z\n ))\n resetBody(this._parts.lowerRightArm, new Vec3(\n basePos.x - shouldersDistance / 2 - upperArmLength - lowerArmLength / 2,\n armY,\n basePos.z\n ))\n\n this.object.setDirty?.({ source: 'CannonRagdollComponent' })\n }\n\n /**\n * Apply an impulse to all bodies\n */\n applyImpulse(impulse: Vec3, worldPoint?: Vec3) {\n for (const body of this._bodies) {\n body.applyImpulse(impulse, worldPoint || body.position)\n }\n }\n\n /**\n * Apply an impulse to a specific body part\n */\n applyImpulseToPart(partName: keyof RagdollParts, impulse: Vec3, worldPoint?: Vec3) {\n if (!this._parts) return\n const body = this._parts[partName]\n if (body) {\n body.applyImpulse(impulse, worldPoint || body.position)\n }\n }\n\n private _updateMeshVisibility() {\n if (this._meshContainer) {\n this._meshContainer.visible = !this.hideRagdollMeshes\n }\n }\n\n private _findCharacterMeshes() {\n this._characterMeshes = []\n this.object.traverse((child) => {\n if ((child as unknown as SkinnedMesh).isSkinnedMesh) {\n this._characterMeshes.push(child as unknown as SkinnedMesh)\n }\n })\n }\n\n private _buildBoneMap() {\n this._boneMap.clear()\n this.object.traverse((child) => {\n if ((child as Bone).isBone) {\n const bone = child as Bone\n // Map by exact name\n this._boneMap.set(bone.name, bone)\n // Also map by lowercase for case-insensitive matching\n this._boneMap.set(bone.name.toLowerCase(), bone)\n }\n })\n }\n\n private _findBone(boneNames: string[]): Bone | null {\n for (const name of boneNames) {\n const bone = this._boneMap.get(name) || this._boneMap.get(name.toLowerCase())\n if (bone) return bone\n }\n return null\n }\n\n private _getBoneWorldPosition(bone: Bone): Vector3 {\n bone.getWorldPosition(this._tempWorldPos)\n return this._tempWorldPos.clone()\n }\n\n private _getBoneWorldQuaternion(bone: Bone): Quaternion {\n bone.getWorldQuaternion(this._tempWorldQuat)\n return this._tempWorldQuat.clone()\n }\n\n start() {\n super.start();\n setTimeout(()=>{\n this.activate();\n }, 2000)\n }\n\n /**\n * Activates the ragdoll physics simulation.\n * Call this when the character should start ragdolling (e.g., on death).\n * @param impulse Optional initial impulse to apply (e.g., from bullet impact)\n * @param impactPoint Optional world point where impulse is applied\n */\n activate(impulse?: Vec3, impactPoint?: Vec3) {\n if (this._isActive) return\n\n // Create ragdoll if not created yet\n if (!this._parts) {\n this._createRagdoll()\n }\n\n // Store initial bone quaternions (local space) before activation\n this._storeInitialBoneQuats()\n\n // Store initial body quaternions (world space)\n this._storeInitialBodyQuats()\n\n // Activate physics bodies (make them dynamic)\n this._activateBodies()\n\n // Show ragdoll meshes if not hidden\n if (this._meshContainer) {\n this._meshContainer.visible = !this.hideRagdollMeshes\n }\n\n // Apply initial impulse if provided\n if (impulse) {\n // Apply impulse to central body parts (pelvis, upperBody, head)\n // Limbs will follow naturally due to constraints and gravity\n if (this._parts) {\n this._parts.pelvis.applyImpulse(impulse, new Vec3(0, 0, 0))\n this._parts.upperBody.applyImpulse(impulse, new Vec3(0, 0, 0))\n this._parts.head.applyImpulse(impulse, new Vec3(0, 0, 0))\n }\n }\n\n this._isActive = true\n }\n\n /**\n * Store initial bone quaternions (both local and world space) for rotation offset calculation\n */\n private _storeInitialBoneQuats() {\n this._initialBoneQuats.clear()\n this._initialBoneWorldQuats.clear()\n\n const storeBoneQuat = (boneNames: string[]) => {\n const bone = this._findBone(boneNames)\n if (bone) {\n // Store local quaternion\n this._initialBoneQuats.set(bone.name, bone.quaternion.clone())\n // Store world quaternion\n const worldQuat = new Quaternion()\n bone.getWorldQuaternion(worldQuat)\n this._initialBoneWorldQuats.set(bone.name, worldQuat)\n }\n }\n\n storeBoneQuat(this._boneNames.head)\n storeBoneQuat(this._boneNames.spine2)\n storeBoneQuat(this._boneNames.hips)\n storeBoneQuat(this._boneNames.leftUpLeg)\n storeBoneQuat(this._boneNames.rightUpLeg)\n storeBoneQuat(this._boneNames.leftLeg)\n storeBoneQuat(this._boneNames.rightLeg)\n storeBoneQuat(this._boneNames.leftArm)\n storeBoneQuat(this._boneNames.rightArm)\n storeBoneQuat(this._boneNames.leftForeArm)\n storeBoneQuat(this._boneNames.rightForeArm)\n }\n\n /**\n * Store initial body quaternions (world space) for rotation offset calculation\n */\n private _storeInitialBodyQuats() {\n this._initialBodyQuats.clear()\n\n for (const body of this._bodies) {\n this._initialBodyQuats.set(body, new Quaternion(\n body.quaternion.x,\n body.quaternion.y,\n body.quaternion.z,\n body.quaternion.w\n ))\n }\n }\n\n /**\n * Deactivates the ragdoll and restores the character.\n * Call this to reset the character to normal state.\n */\n deactivate() {\n if (!this._isActive) return\n\n // Deactivate physics bodies (make them kinematic)\n this._deactivateBodies()\n\n // Show character mesh, hide ragdoll\n this._setCharacterVisible(true)\n if (this._meshContainer) {\n this._meshContainer.visible = false\n }\n\n this._isActive = false\n }\n\n private _matchBonesToRagdoll() {\n if (!this._parts) return\n\n // Match each ragdoll body to its corresponding bone position\n const matchBodyToBone = (body: Body, boneNames: string[]) => {\n const bone = this._findBone(boneNames)\n if (bone) {\n const worldPos = this._getBoneWorldPosition(bone)\n const worldQuat = this._getBoneWorldQuaternion(bone)\n body.position.set(worldPos.x, worldPos.y, worldPos.z)\n body.quaternion.set(worldQuat.x, worldQuat.y, worldQuat.z, worldQuat.w)\n body.velocity.set(0, 0, 0)\n body.angularVelocity.set(0, 0, 0)\n }\n }\n\n matchBodyToBone(this._parts.head, this._boneNames.head)\n matchBodyToBone(this._parts.upperBody, this._boneNames.spine2)\n matchBodyToBone(this._parts.pelvis, this._boneNames.hips)\n matchBodyToBone(this._parts.upperLeftLeg, this._boneNames.leftUpLeg)\n matchBodyToBone(this._parts.upperRightLeg, this._boneNames.rightUpLeg)\n matchBodyToBone(this._parts.lowerLeftLeg, this._boneNames.leftLeg)\n matchBodyToBone(this._parts.lowerRightLeg, this._boneNames.rightLeg)\n matchBodyToBone(this._parts.upperLeftArm, this._boneNames.leftArm)\n matchBodyToBone(this._parts.upperRightArm, this._boneNames.rightArm)\n matchBodyToBone(this._parts.lowerLeftArm, this._boneNames.leftForeArm)\n matchBodyToBone(this._parts.lowerRightArm, this._boneNames.rightForeArm)\n }\n\n private _activateBodies() {\n for (const body of this._bodies) {\n body.type = Body.DYNAMIC\n body.mass = this.mass\n body.updateMassProperties()\n body.wakeUp()\n }\n }\n\n private _deactivateBodies() {\n for (const body of this._bodies) {\n body.type = Body.KINEMATIC\n body.mass = 0\n body.velocity.set(0, 0, 0)\n body.angularVelocity.set(0, 0, 0)\n }\n }\n\n private _setCharacterVisible(visible: boolean) {\n for (const mesh of this._characterMeshes) {\n mesh.visible = visible\n }\n }\n\n private _findClosestBody(point: Vec3): Body | null {\n let closest: Body | null = null\n let minDist = Infinity\n\n for (const body of this._bodies) {\n const dx = body.position.x - point.x\n const dy = body.position.y - point.y\n const dz = body.position.z - point.z\n const dist = dx * dx + dy * dy + dz * dz\n\n if (dist < minDist) {\n minDist = dist\n closest = body\n }\n }\n\n return closest\n }\n}\n","import {Body, ContactMaterial, Material as CannonMaterial, Shape, World} from \"cannon-es\"\nimport {\n AViewerPluginSync,\n EntityComponentPlugin,\n FrameFadePlugin, generateUUID,\n IObject3D,\n IViewerEvent,\n Matrix4,\n Object3DWidgetsPlugin,\n Quaternion,\n serialize,\n ThreeSerialization,\n ThreeViewer,\n TObject3DComponent,\n TypeSystem,\n uiConfig,\n uiFolderContainer, uiInput, uiMonitor, uiNumber,\n uiToggle,\n Vector3\n} from \"threepipe\"\nimport {Cannon3DShapeComponent, Cannon3DShapeHelper} from \"./Cannon3DShapeComponent.ts\";\nimport {Cannon3DBodyComponent} from \"./Cannon3DBodyComponent.ts\";\nimport {CannonRagdollComponent} from \"./CannonRagdollComponent.ts\";\n\n@uiFolderContainer('Cannon Material')\nexport class CannonMaterial2 extends CannonMaterial{\n @uiInput()\n declare name: string\n @uiMonitor()\n uuid: string = generateUUID()\n @uiNumber()\n declare friction\n @uiNumber()\n declare restitution\n}\nThreeSerialization.MakeSerializable(CannonMaterial as any, 'CannonMaterial', ['friction', 'restitution']) // this is not needed actually, but just in case\nThreeSerialization.MakeSerializable(CannonMaterial2 as any, 'CannonMaterial', ['name', 'uuid', 'friction', 'restitution']) // this should be after CannonMaterial\nThreeSerialization.MakeSerializable(ContactMaterial as any, 'CannonContactMaterial', [/* 'materials', */'friction', 'restitution', 'contactEquationStiffness', 'contactEquationRelaxation', 'frictionEquationStiffness', 'frictionEquationRelaxation'])\nTypeSystem.AddClass({\n key: 'CannonMaterial',\n getId(obj: CannonMaterial2) {\n return obj.uuid\n },\n getLabel(obj?: CannonMaterial2) {\n return obj ? obj.name : 'Cannon Material'\n },\n setName(obj: CannonMaterial2, name: string) {\n obj.name = name\n },\n ctor: CannonMaterial2,\n})\n\n// uses https://github.com/pmndrs/cannon-es\n\n@uiFolderContainer('Physics')\nexport class CannonPhysicsPlugin extends AViewerPluginSync {\n public static readonly PluginType = 'CannonPhysicsPlugin'\n private _world: World = new World()\n get world() { return this._world }\n // dependencies: Class<IViewerPlugin<any>>[]\n\n @serialize()\n @uiToggle()\n enabled = true\n\n static CannonTypes = {\n Body, Shape, World, Material: CannonMaterial, ContactMaterial,\n }\n @uiToggle('Running', (_that: CannonPhysicsPlugin)=>({onChange: ()=>{return}}))\n running = true\n\n nextSteps = 0\n\n @uiConfig()\n stepPhysics: any = {\n stepCount: 100,\n delta: 0.1,\n step: () => {\n this.nextSteps = this.stepPhysics.stepCount\n },\n }\n\n @uiConfig()\n @serialize()\n defaultMaterial = new CannonMaterial2('default')\n\n // @uiButton('Make Root Bodies')\n // makeRootBodies = () => {\n // this._viewer?.scene.modelRoot.children.forEach((child) => {\n // this.makeBody(child)\n // })\n // }\n\n // stepMultiple = () => {\n // console.log(this.enabled, this.nextSteps)\n // if (this.enabled) return\n // this.nextSteps = 100\n // // this.enabled = true\n // // this._viewer?.doOnce('postFrame', () => {\n // // // Step the physics world\n // // for (let i = 0; i < 100; i++) {\n // // this._world.step(0.1)\n // // }\n // // // this._viewer?.doOnce('postFrame', () => {\n // // // this.enabled = false\n // // // })\n // // })\n // // this._viewer?.setDirty()\n // }\n\n constructor(enabled = true, running = false) {\n super()\n this.enabled = enabled\n this.running = running\n\n // replaced for UI\n this.defaultMaterial.friction = 0\n this.defaultMaterial.restitution = 0\n this._world.defaultMaterial = this.defaultMaterial\n this._world.defaultContactMaterial.materials = [this.defaultMaterial, this.defaultMaterial]\n\n const collisionEv: CollisionEvent = {} as any\n this._world.addEventListener('beginContact', (e: any)=>{\n const compA = this.cannonBodies.get(e.bodyA)\n const compB = this.cannonBodies.get(e.bodyB)\n if(!compA || !compB){\n console.warn('[CannonPhysicsPlugin] Contact bodies not managed by plugin', e.bodyA, e.bodyB)\n return\n }\n collisionEv.object = compB.object\n collisionEv.body = compB\n EntityComponentPlugin.ObjectDispatch(compA.object, 'onBeginContact', collisionEv)\n collisionEv.object = compA.object\n collisionEv.body = compA\n EntityComponentPlugin.ObjectDispatch(compB.object, 'onBeginContact', collisionEv)\n })\n this._world.addEventListener('endContact', (e: any)=>{\n const compA = this.cannonBodies.get(e.bodyA)\n const compB = this.cannonBodies.get(e.bodyB)\n if(!compA || !compB){\n console.warn('[CannonPhysicsPlugin] Contact bodies not managed by plugin', e.bodyA, e.bodyB)\n return\n }\n collisionEv.object = compB.object\n collisionEv.body = compB\n EntityComponentPlugin.ObjectDispatch(compA.object, 'onEndContact', collisionEv)\n collisionEv.object = compA.object\n collisionEv.body = compA\n EntityComponentPlugin.ObjectDispatch(compB.object, 'onEndContact', collisionEv)\n })\n // this._world.addEventListener('beginShapeContact', (e)=>{\n // console.log(e)\n // })\n // this._world.addEventListener('endShapeContact', (e)=>{\n // console.log(e)\n // })\n // this._world.addEventListener(Body.COLLIDE_EVENT_NAME, (e)=>{\n // console.log(e)\n // })\n this._world.gravity.set(0, -9.81, 0)\n // this._world.gravity.set(0, 0, 0)\n\n //\n // // Max solver iterations: Use more for better force propagation, but keep in mind that it's not very computationally cheap!\n // this._world.solver.iterations = 20\n //\n // // Tweak contact properties.\n // // Contact stiffness - use to make softer/harder contacts\n // this._world.defaultContactMaterial.contactEquationStiffness = 1e10\n // this._world.defaultContactMaterial.contactEquationRelaxation = 10\n //\n\n // coeff of restitution: 0 = no bounce, 1 = perfect bounce\n\n // test\n\n // const mat = new CannonMaterial('defaultMat')\n // mat.friction = 0.351\n // mat.restitution = 0.63\n // const contactMat = new ContactMaterial(mat, mat, {friction: 0.13, restitution: 0.563})\n //\n // const mjson = ThreeSerialization.Serialize(mat)\n // const mat2 = ThreeSerialization.Deserialize(mjson, null) as CannonMaterial\n // const mat3 = ThreeSerialization.Deserialize(mjson, mat) as CannonMaterial\n // console.log(mjson, mat2, mat3, mat3 === mat)\n //\n // const cmjson = ThreeSerialization.Serialize(contactMat)\n // const contactMat2 = ThreeSerialization.Deserialize(cmjson, null) as ContactMaterial\n // const contactMat3 = ThreeSerialization.Deserialize(cmjson, contactMat) as ContactMaterial\n // console.log(cmjson, contactMat2, contactMat3, contactMat3 === contactMat)\n\n }\n\n dependencies = [EntityComponentPlugin]\n\n // private _bodyMeshMap = new WeakMap<Body, Object3D>()\n\n private _v1 = new Vector3()\n private _v2 = new Vector3()\n private _s2 = new Vector3()\n private _q1 = new Quaternion()\n private _q2 = new Quaternion()\n private _m1 = new Matrix4()\n private _m2 = new Matrix4()\n frameFadeToggled = false\n\n protected _preFrame = (e: IViewerEvent) => {\n const viewer = this._viewer\n if (!viewer) return\n if(this.isDisabled()) return\n const frameFadePlugin = viewer.getPlugin(FrameFadePlugin)\n // todo use isDisabled\n if (!this.running) {\n if (this.nextSteps > 0) this.running = true\n else {\n if (frameFadePlugin && this.frameFadeToggled) {\n frameFadePlugin.enable(CannonPhysicsPlugin.PluginType)\n this.frameFadeToggled = false\n }\n this._dirty = false\n return\n }\n }\n if (frameFadePlugin && !this.frameFadeToggled) {\n frameFadePlugin.disable(CannonPhysicsPlugin.PluginType)\n }\n\n try {\n // Step the physics world\n if (this.nextSteps > 0) {\n for (let i = 0; i < this.stepPhysics.stepCount; i++) {\n this._world.step(this.stepPhysics.delta)\n }\n } else {\n // todo use dt\n // const dt = e.deltaTime\n this._world.fixedStep()\n }\n }catch (e) {\n console.error('[CannonPhysicsPlugin] Error stepping physics world')\n console.error(e)\n }\n\n this._dirty = false\n let dirty = false\n // Update the bodies\n for (const bodyC of this.bodyComponents.values()) {\n if (bodyC.mass === 0) continue\n const mesh = bodyC.object\n const body = bodyC.body\n if (!mesh) continue\n dirty = false\n mesh.updateWorldMatrix(true, false)\n mesh.getWorldPosition(this._v2)\n mesh.getWorldQuaternion(this._q2)\n mesh.getWorldScale(this._s2)\n this._v1.copy(body.position)\n if (!dirty && this._v2.manhattanDistanceTo(this._v1) > 0) {\n dirty = true\n // world = parent.local\n // parent-1 . world = local\n }\n this._q1.copy(body.quaternion as any)\n if (!dirty && this._q2.angleTo(this._q1) > 0) {\n dirty = true\n }\n if (dirty) {\n this._m1.compose(this._v1, this._q1, this._s2)\n if (!mesh.parent) {\n // throw new Error('no parent')\n console.error('[CannonPhysicsPlugin] Mesh has no parent, cannot set world transform', mesh)\n }else {\n this._m2.copy(mesh.parent.matrixWorld).invert()\n this._m2.multiply(this._m1)\n this._m2.decompose(this._v1, this._q1, this._s2)\n mesh.position.copy(this._v1)\n mesh.quaternion.copy(this._q1)\n mesh.setDirty && mesh.setDirty({change: 'transform', source: 'CannonPhysicsPlugin'})\n }\n }\n }\n this._dirty = dirty\n viewer.setDirty()\n // viewer.scene.setDirty({sceneUpdate: false})\n viewer.renderManager.resetShadows()\n\n if (this.nextSteps > 0) {\n this.running = false\n this.nextSteps = 0\n }\n }\n\n private _onRemove: (()=>void)[] = []\n\n async onAdded(viewer: ThreeViewer): Promise<\n void> {\n super.onAdded(viewer)\n\n const offUpdate = viewer.on('preFrame', {\n order: -1, // before most things\n callback: this._preFrame,\n })\n if (offUpdate) this._onRemove.push(offUpdate)\n\n Object.values(this.componentTypes).forEach((compType) => {\n viewer.getPlugin(EntityComponentPlugin)?.addComponentType(compType)\n })\n\n viewer.object3dManager.getObjects().forEach(object=>this._objectAdd({object}))\n viewer.object3dManager.addEventListener('objectAdd', this._objectAdd)\n viewer.object3dManager.addEventListener('objectRemove', this._objectRemove)\n\n viewer.forPlugin(Object3DWidgetsPlugin, (wplugin) => {\n wplugin.helpers.push(Cannon3DShapeHelper)\n }, (wplugin)=>{\n const i = wplugin.helpers.indexOf(Cannon3DShapeHelper)\n if (i >= 0) wplugin.helpers.splice(i, 1)\n })\n\n // viewer.scene.addEventListener('update', (e) => {\n // this._bodyMeshMap.forEach((mesh, body) => {\n // body.velocity.set(0, 0, 0)\n // body.angularVelocity.set(0, 0, 0)\n // })\n // })\n }\n\n private _objectAdd = (e: {object?: IObject3D})=>{\n const obj = e.object\n // console.log('pbject add', obj?.name, obj?.userData, obj)\n if (obj?.userData?.physicsMass === undefined) return\n const ecs = this._viewer?.getPlugin(EntityComponentPlugin)\n if (!ecs) return\n const existing = EntityComponentPlugin.GetComponentData(obj, this.componentTypes.body)\n if (existing) return\n // const pBody = ecs.addComponent(obj, this.componentTypes.body).component\n // const pShape = ecs.addComponent(obj, this.componentTypes.shape).component\n // if (!pBody || !pShape) return\n // pBody.mass = typeof obj.userData.physicsMass === 'number' ? obj.userData.physicsMass : 0\n // if (obj.userData.physicsBodyType !== undefined) {\n // if (typeof obj.userData.physicsBodyType === 'string' && physicsBodyType.includes(obj.userData.physicsBodyType as PhysicsBodyType)) {\n // pBody.type = obj.userData.physicsBodyType as PhysicsBodyType\n // }\n // }\n // if (obj.userData.physicsShape !== undefined) {\n // if (typeof obj.userData.physicsShape === 'string' && cannonShapeTypes.includes(obj.userData.physicsShape as CannonShapeType)) {\n // pShape.type = obj.userData.physicsShape as CannonShapeType\n // }\n // }\n }\n\n private _objectRemove = (e: {object?: IObject3D})=>{\n const obj = e.object\n if (!obj?.userData?.physicsMass === undefined) return\n\n }\n\n onRemove(viewer: ThreeViewer) {\n this._onRemove.forEach(off=>off())\n Object.values(this.componentTypes).forEach((compType) => {\n viewer.getPlugin(EntityComponentPlugin)?.removeComponentType(compType)\n })\n viewer.object3dManager.removeEventListener('objectAdd', this._objectAdd)\n viewer.object3dManager.removeEventListener('objectRemove', this._objectRemove)\n viewer.object3dManager.getObjects().forEach(object=>this._objectRemove({object}))\n\n // todo assert all bodies removed?\n\n super.onRemove(viewer)\n }\n\n readonly componentTypes = {\n body: Cannon3DBodyComponent,\n shape: Cannon3DShapeComponent,\n ragdoll: CannonRagdollComponent,\n } satisfies Record<string, TObject3DComponent>\n\n bodyComponents = new Set<Cannon3DBodyComponent>()\n cannonBodies = new WeakMap<Body, Cannon3DBodyComponent>()\n addBody(body: Cannon3DBodyComponent) {\n if (this.bodyComponents.has(body)) return\n this.bodyComponents.add(body)\n this._world.addBody(body.body)\n this.cannonBodies.set(body.body, body)\n // this._bodyMeshMap.set(body.body, body.object)\n // this._viewer?.setDirty()\n }\n removeBody(body: Cannon3DBodyComponent) {\n if (!this.bodyComponents.has(body)) return\n this.bodyComponents.delete(body)\n this._world.removeBody(body.body)\n this.cannonBodies.delete(body.body)\n // this._bodyMeshMap.delete(body.body)\n // this._viewer?.setDirty()\n }\n\n}\n\nexport interface CollisionEvent{\n object: IObject3D\n body: Cannon3DBodyComponent\n}\ndeclare module 'threepipe'{\n interface Object3DComponent{\n onBeginContact?(collisionEvent: any):void\n onEndContact?(collisionEvent: any):void\n\n }\n}\n","import {\n copyObject3DUserData,\n getPartialProps,\n IMaterial,\n ImportResult,\n ImportResultExtras,\n IObject3D,\n Quaternion,\n setPartialProps,\n ThreeViewer,\n Vector3,\n} from 'threepipe'\n\ntype RuntimeErrorHandler = (error: unknown) => void\n\nconst defaultObjectOverrides = ['visible', 'name', 'position', 'quaternion', 'scale']\nconst defaultMaterialOverrides = ['name']\nconst objectProperties: (keyof IObject3D)[] = [\n 'position',\n 'quaternion',\n 'scale',\n 'visible',\n 'castShadow',\n 'receiveShadow',\n 'frustumCulled',\n 'renderOrder',\n]\n\n/**\n * Loads the embedded rootPath references written by the editor's AssetTracker.\n * This is deliberately runtime-only: it keeps root overrides, but has no file\n * watching, picking, export hooks, refresh subscriptions, or editor registry.\n */\nexport class RuntimeNestedAssetLoader {\n private readonly importer: ThreeViewer['assetManager']['importer']\n private readonly cache = new Map<string, Promise<ImportResult | undefined>>()\n private readonly pending = new Set<Promise<void>>()\n\n constructor(\n private readonly viewer: ThreeViewer,\n private readonly onError: RuntimeErrorHandler,\n ) {\n this.importer = viewer.assetManager.importer\n this.importer.addEventListener('processRaw', this.onProcessRaw)\n }\n\n dispose() {\n this.importer.removeEventListener('processRaw', this.onProcessRaw)\n this.cache.clear()\n this.pending.clear()\n }\n\n async loadObjectDependencies(object: IObject3D): Promise<void> {\n if (!object.traverse) return\n\n const objects: IObject3D[] = []\n const materials = new Set<IMaterial>()\n object.traverse((child: IObject3D) => {\n objects.push(child)\n const material = (child as IObject3D & {material?: IMaterial | IMaterial[]}).material\n if (material) {\n const entries = Array.isArray(material) ? material : [material]\n entries.forEach((entry) => entry?.isMaterial && materials.add(entry))\n }\n })\n\n const loads: Promise<void>[] = []\n for (const child of objects) {\n if (!this.isEmbeddedReference(child)) continue\n if (child._loadingPromise) {\n loads.push(child._loadingPromise.then(() => undefined))\n continue\n }\n\n if (!(child.userData.sProperties as string[]).length) {\n child.userData.sProperties = [...defaultObjectOverrides]\n }\n child._sChildren ||= []\n const load = this.loadReference(child)\n child._loadingPromise = load\n loads.push(load)\n }\n\n for (const material of materials) {\n if (!this.isEmbeddedReference(material)) continue\n if (material._loadingPromise) {\n loads.push(material._loadingPromise.then(() => undefined))\n continue\n }\n\n if (!(material.userData.sProperties as string[]).length) {\n material.userData.sProperties = [...defaultMaterialOverrides]\n }\n const load = this.loadReference(material)\n material._loadingPromise = load\n loads.push(load)\n }\n\n if (!loads.length) return\n const loading = Promise.allSettled(loads).then((results) => {\n for (const result of results) {\n if (result.status === 'rejected') this.onError(result.reason)\n }\n })\n object._loadingPromise = loading\n this.track(loading)\n await loading\n }\n\n async waitForPending(): Promise<void> {\n while (this.pending.size) {\n await Promise.all([...this.pending])\n }\n }\n\n private readonly onProcessRaw = (event: {data?: ImportResult}) => {\n const object = event.data\n if (!object?.isObject3D) return\n const loading = this.loadObjectDependencies(object as IObject3D)\n this.track(loading)\n }\n\n private isEmbeddedReference(value: IObject3D | IMaterial): boolean {\n const rootPath = value.userData?.rootPath\n return typeof rootPath === 'string'\n && !(value as ImportResultExtras).__rootPath\n && !value.userData.rootPathRefresh\n && Array.isArray(value.userData.sProperties)\n }\n\n private loadAsset(path: string, options: Record<string, unknown> | undefined) {\n let loading = this.cache.get(path)\n if (!loading) {\n loading = this.importer.importSingle(path, options || {})\n this.cache.set(path, loading)\n }\n return loading\n }\n\n private async loadReference(target: IObject3D | IMaterial): Promise<void> {\n const path = target.userData.rootPath as string\n const imported = await this.loadAsset(path, target.userData.rootPathOptions)\n if (!imported) throw new Error(`Unable to load nested asset from ${path}`)\n if (imported._loadingPromise) await imported._loadingPromise\n\n const targetObject = target as IObject3D\n const targetMaterial = target as IMaterial\n if (targetObject.isObject3D && imported.isObject3D) {\n this.updateObject(imported as IObject3D, targetObject)\n return\n }\n if (targetMaterial.isMaterial && imported.isMaterial) {\n this.updateMaterial(imported as IMaterial, targetMaterial)\n return\n }\n throw new Error(`Nested asset at ${path} does not match its reference type`)\n }\n\n private updateObject(source: IObject3D, target: IObject3D) {\n if (target._sChildren) {\n for (const child of [...target.children]) {\n if (!target._sChildren.includes(child)) child.removeFromParent()\n }\n }\n\n for (const child of source.children) {\n const clone = cloneObject(child)\n clone.userData.excludeFromExport = true\n target.add(clone)\n }\n\n const overrideProperties = target.userData.sProperties as string[]\n const name = target.name\n const visible = target.visible\n for (const property of objectProperties) {\n if (overrideProperties.includes(property)) continue\n const value = source[property]\n const current = target[property]\n if (value && current && (value as Vector3).isVector3) {\n (current as Vector3).copy(value as Vector3)\n } else if (value && current && (value as Quaternion).isQuaternion) {\n (current as Quaternion).copy(value as Quaternion)\n } else if (value !== undefined) {\n Object.assign(target, {[property]: value})\n }\n }\n\n const targetUserData = target.userData\n target.userData = {}\n copyObject3DUserData(target.userData, source.userData, ['uuid', 'sProperties'])\n Object.assign(target.userData, targetUserData)\n target.name = name\n target.visible = visible\n target.userData.uuid = target.uuid\n target.userData.sProperties = overrideProperties\n target.setDirty?.({source: 'RuntimeNestedAssetLoader'})\n }\n\n private updateMaterial(source: IMaterial, target: IMaterial) {\n const overrideProperties = target.userData.sProperties as string[]\n const overrides = getPartialProps(target, overrideProperties)\n const name = target.name\n target.setValues(source)\n target.name = name\n setPartialProps(overrides, target)\n target.userData.uuid = target.uuid\n target.userData.sProperties = overrideProperties\n }\n\n private track(promise: Promise<void>) {\n this.pending.add(promise)\n const remove = () => this.pending.delete(promise)\n promise.then(remove, remove)\n }\n}\n\nfunction cloneObject(source: IObject3D): IObject3D {\n const clone = source.clone(false) as IObject3D\n const sourceRoot = source as IObject3D & {_tpRootPath?: string, _tpRootUid?: string}\n const cloneRoot = clone as IObject3D & {_tpRootPath?: string, _tpRootUid?: string}\n cloneRoot._tpRootPath = sourceRoot._tpRootPath\n cloneRoot._tpRootUid = sourceRoot._tpRootUid || source.uuid\n delete clone.userData.cloneParent\n for (const child of source.children) clone.add(cloneObject(child))\n return clone\n}\n","import {\n Class,\n EntityComponentPlugin,\n GBufferPlugin,\n GLTFAnimationPlugin,\n GLTFMeshOptDecodePlugin,\n IObject3D,\n IViewerPlugin,\n KTX2LoadPlugin,\n KTXLoadPlugin,\n PLYLoadPlugin,\n PopmotionPlugin,\n Rhino3dmLoadPlugin,\n STLLoadPlugin,\n ThreeViewer,\n USDZLoadPlugin,\n} from 'threepipe'\nimport {MeshoptDecoder} from 'meshoptimizer'\nimport {registerScripts} from '../scripts.ts'\nimport {HtmlUiComponent} from '../plugins/HtmlUiComponent.ts'\nimport {GeneratorComponent} from '../plugins/GeneratorComponent.ts'\nimport {CannonPhysicsPlugin} from '../plugins/cannon/CannonPhysicsPlugin.ts'\nimport {\n installGameHooks,\n runtimeCleanupReport,\n type GameValidationFunction,\n type GameValidationReport,\n type RuntimeCleanupReport,\n} from '../authoringValidation.ts'\nimport {RuntimeNestedAssetLoader} from './nestedAssets.ts'\nimport {\n AssetsJSONManifest,\n createProjectAssetURLModifier,\n ExternalPlugin,\n isDependencyModuleSpecifier,\n parseAssetsJSONManifest,\n parsePackageJSON,\n parsePackageJsonSettingsConfig,\n ProjectPackageJSON,\n ProjectConfigSettings,\n} from './projectFormat.ts'\n\nexport interface CreateGameOptions {\n base: string\n canvas: HTMLCanvasElement\n onError?: (error: unknown) => void\n /** Content hashes for cache-safe project module imports in development. */\n fileRevisions?: Readonly<Record<string, string>>\n /** Identifies one module-graph load so transitive imports bypass the browser module map together. */\n moduleRevision?: string\n}\n\nexport interface RuntimeProject {\n packageJson: ProjectPackageJSON\n config: ProjectConfigSettings\n assetsManifest: AssetsJSONManifest\n mainScene: string\n}\n\nexport interface CreatedGame {\n viewer: ThreeViewer\n project: RuntimeProject\n registerGameValidation(fn: GameValidationFunction): () => void\n publishGameTelemetry(value: object): () => void\n runGameValidation(): Promise<GameValidationReport>\n dispose(): RuntimeCleanupReport\n}\n\ntype ModuleExports = Record<string, unknown>\ntype RuntimeErrorHandler = (error: unknown) => void\n\nexport function createGame(options: CreateGameOptions): Promise<CreatedGame> {\n return createProjectGame(options, true)\n}\n\n/** Load the saved project and generator previews without starting components, physics, the timeline, or main.js. */\nexport function createStoppedGame(options: CreateGameOptions): Promise<CreatedGame> {\n return createProjectGame(options, false)\n}\n\nasync function createProjectGame({\n base,\n canvas,\n onError,\n fileRevisions = {},\n moduleRevision,\n}: CreateGameOptions, start: boolean): Promise<CreatedGame> {\n const reportError = createErrorReporter(onError)\n let viewer: ThreeViewer | undefined\n let nestedAssets: RuntimeNestedAssetLoader | undefined\n let removeURLModifier: (() => void) | undefined\n let gameHooks: ReturnType<typeof installGameHooks> | undefined\n\n try {\n const baseUrl = validateBase(base)\n const [packageText, assetsText] = await Promise.all([\n fetchText(new URL('package.json', baseUrl)),\n fetchText(new URL('assets.json', baseUrl)),\n ])\n const packageJson = parsePackageJSON(packageText)\n const config = await parsePackageJsonSettingsConfig(packageJson)\n const assetsManifest = parseAssetsJSONManifest(assetsText)\n const project: RuntimeProject = {\n packageJson,\n config,\n assetsManifest,\n mainScene: packageJson.mainScene,\n }\n\n const entityComponents = new EntityComponentPlugin(false)\n const physics = new CannonPhysicsPlugin(true, false)\n EntityComponentPlugin.AddObjectUiConfig = false\n window.MeshoptDecoder = MeshoptDecoder\n\n viewer = new ThreeViewer({\n canvas,\n ...config.viewer,\n assetManager: {\n simpleCache: false,\n storage: false,\n },\n plugins: [\n entityComponents,\n new GBufferPlugin(),\n physics,\n new PopmotionPlugin(),\n new GLTFAnimationPlugin(),\n new GLTFMeshOptDecodePlugin(false),\n new KTX2LoadPlugin(),\n new KTXLoadPlugin(),\n new PLYLoadPlugin(),\n new Rhino3dmLoadPlugin(),\n new STLLoadPlugin(),\n new USDZLoadPlugin(),\n ],\n })\n viewer.timeline.endTime = 0\n gameHooks = installGameHooks()\n entityComponents.addComponentType(HtmlUiComponent)\n entityComponents.addComponentType(GeneratorComponent)\n GeneratorComponent.configureViewer(viewer, {base: baseUrl, onError: reportError})\n\n // Three's LoadingManager delegates through this importer hook. It covers\n // glTF buffers/textures and nested imports without patching global fetch.\n const urlModifier = createProjectAssetURLModifier(baseUrl, assetsManifest)\n viewer.assetManager.importer.addURLModifier(urlModifier)\n removeURLModifier = () => viewer?.assetManager.importer.removeURLModifier(urlModifier)\n\n nestedAssets = new RuntimeNestedAssetLoader(viewer, reportError)\n\n await registerProjectScripts(viewer, project, baseUrl, fileRevisions, moduleRevision)\n await registerProjectPlugins(viewer, project, baseUrl, fileRevisions, moduleRevision)\n\n const sceneUrl = new URL(project.mainScene, baseUrl).href\n const loadedScene = await viewer.load(sceneUrl, {importAsModelRoot: true})\n if (!loadedScene?.isObject3D) {\n throw new Error(`The main scene did not load as an Object3D: ${sceneUrl}`)\n }\n await nestedAssets.loadObjectDependencies(loadedScene as IObject3D)\n await nestedAssets.waitForPending()\n await GeneratorComponent.waitForViewer(viewer)\n\n if (start) {\n viewer.timeline.reset()\n viewer.timeline.start()\n entityComponents.start()\n physics.running = true\n\n const mainUrl = versionedProjectUrl('main.js', baseUrl, fileRevisions, moduleRevision)\n const mainModule = await importModule(mainUrl.href)\n if (mainModule.main !== undefined) {\n if (typeof mainModule.main !== 'function') {\n throw new Error('main.js export \"main\" must be a function')\n }\n await mainModule.main({viewer})\n }\n }\n\n const readyViewer = viewer\n let disposed = false\n let cleanupReport: RuntimeCleanupReport | undefined\n return {\n viewer: readyViewer,\n project,\n registerGameValidation: gameHooks.registerGameValidation,\n publishGameTelemetry: gameHooks.publishGameTelemetry,\n runGameValidation: gameHooks.runGameValidation,\n dispose() {\n if (disposed) return cleanupReport!\n disposed = true\n entityComponents.stop()\n physics.running = false\n readyViewer.timeline.stop()\n cleanupReport = runtimeCleanupReport(readyViewer)\n nestedAssets?.dispose()\n removeURLModifier?.()\n gameHooks?.dispose()\n readyViewer.dispose()\n return cleanupReport\n },\n }\n } catch (error) {\n nestedAssets?.dispose()\n removeURLModifier?.()\n gameHooks?.dispose()\n viewer?.dispose()\n reportError(error)\n throw error\n }\n}\n\nasync function registerProjectPlugins(\n viewer: ThreeViewer,\n project: RuntimeProject,\n base: URL,\n fileRevisions: Readonly<Record<string, string>>,\n moduleRevision?: string,\n) {\n const {config, packageJson} = project\n for (const definition of config.plugins) {\n if (definition.active === false) continue\n const specifier = resolvePluginSpecifier(definition, packageJson, base, fileRevisions, moduleRevision)\n const module = await importModule(specifier)\n const plugin = findPluginExport(module, definition)\n if (viewer.getPlugin(plugin)) continue\n await viewer.addPlugin(plugin, ...(definition.params || []))\n }\n}\n\nasync function registerProjectScripts(\n viewer: ThreeViewer,\n project: RuntimeProject,\n base: URL,\n fileRevisions: Readonly<Record<string, string>>,\n moduleRevision?: string,\n) {\n const {config, packageJson} = project\n const modules: ModuleExports[] = []\n for (const definition of config.scripts) {\n if (definition.active === false) continue\n const specifier = isDependencyModuleSpecifier(definition.import, packageJson)\n ? definition.import\n : versionedProjectUrl(definition.import, base, fileRevisions, moduleRevision).href\n modules.push(await importModule(specifier))\n }\n await registerScripts(viewer, modules)\n}\n\nfunction resolvePluginSpecifier(\n definition: ExternalPlugin,\n packageJson: ProjectPackageJSON,\n base: URL,\n fileRevisions: Readonly<Record<string, string>>,\n moduleRevision?: string,\n) {\n const isDependency = isDependencyModuleSpecifier(definition.import, packageJson)\n if (isDependency) return definition.import\n return versionedProjectUrl(definition.import, base, fileRevisions, moduleRevision).href\n}\n\nfunction versionedProjectUrl(\n path: string,\n base: URL,\n fileRevisions: Readonly<Record<string, string>>,\n moduleRevision?: string,\n): URL {\n const url = assertSameOrigin(new URL(path, base), base)\n const normalized = path.replace(/^\\.\\//, '')\n const revision = fileRevisions[normalized]\n if (revision) url.searchParams.set('v', revision)\n if (moduleRevision) url.searchParams.set('r', moduleRevision)\n return url\n}\n\nfunction findPluginExport(module: ModuleExports, definition: ExternalPlugin): Class<IViewerPlugin> {\n const requested = definition.className || 'default'\n const selected = module[requested]\n if (isPluginType(selected)) return selected\n\n if (!definition.className) {\n const candidates = Object.values(module).filter(isPluginType)\n if (candidates.length === 1) return candidates[0]\n }\n throw new Error(`Cannot find plugin export \"${requested}\" in ${definition.import}`)\n}\n\nfunction isPluginType(value: unknown): value is Class<IViewerPlugin> {\n return typeof value === 'function'\n && typeof (value as unknown as {PluginType?: unknown}).PluginType === 'string'\n}\n\nasync function importModule(specifier: string): Promise<ModuleExports> {\n return import(/* @vite-ignore */ specifier) as Promise<ModuleExports>\n}\n\nasync function fetchText(url: URL): Promise<string> {\n const response = await fetch(url)\n if (!response.ok) throw new Error(`Failed to fetch ${url.href}: ${response.status} ${response.statusText}`)\n return response.text()\n}\n\nfunction validateBase(base: string): URL {\n if (!base.endsWith('/')) throw new Error('createGame base must end in \"/\"')\n const url = new URL(base)\n if (!url.protocol.startsWith('http')) throw new Error('createGame base must be an absolute HTTP(S) URL')\n return url\n}\n\nfunction assertSameOrigin(url: URL, base: URL): URL {\n if (url.origin !== base.origin) {\n throw new Error(`Project modules must be same-origin: ${url.href}`)\n }\n return url\n}\n\nfunction createErrorReporter(onError?: RuntimeErrorHandler) {\n return (error: unknown) => {\n console.error('[kite3d] Runtime error', error)\n onError?.(error)\n }\n}\n","import type {ProjectConfigSettings} from './runtime/projectFormat.ts'\n\nexport const emptyProjectSettings = {\n plugins: [\n {\n \"import\": \"threepipe\",\n \"className\": \"SSAAPlugin\"\n },\n {\n \"import\": \"threepipe\",\n \"className\": \"AssetExporterPlugin\"\n },\n {\n \"import\": \"threepipe\",\n \"className\": \"TransformAnimationPlugin\"\n },\n {\n \"import\": \"threepipe\",\n \"className\": \"DepthBufferPlugin\"\n },\n {\n \"import\": \"threepipe\",\n \"className\": \"NormalBufferPlugin\"\n },\n {\n \"import\": \"threepipe\",\n \"className\": \"FullScreenPlugin\"\n },\n {\n \"import\": \"threepipe\",\n \"className\": \"ObjectConstraintsPlugin\"\n },\n {\n \"import\": \"threepipe\",\n \"className\": \"TransformControlsPlugin\"\n },\n {\n \"import\": \"threepipe\",\n \"className\": \"AssetExporterPlugin\"\n },\n {\n \"import\": \"threepipe\",\n \"className\": \"ClearcoatTintPlugin\"\n },\n {\n \"import\": \"threepipe\",\n \"className\": \"FragmentClippingExtensionPlugin\"\n },\n {\n \"import\": \"threepipe\",\n \"className\": \"NoiseBumpMaterialPlugin\"\n },\n {\n \"import\": \"threepipe\",\n \"className\": \"CustomBumpMapPlugin\"\n },\n {\n \"import\": \"threepipe\",\n \"className\": \"ParallaxMappingPlugin\",\n \"params\": [\n false\n ]\n },\n {\n \"import\": \"threepipe\",\n \"className\": \"GLTFKHRMaterialVariantsPlugin\"\n },\n {\n \"import\": \"threepipe\",\n \"className\": \"VirtualCamerasPlugin\"\n },\n {\n \"import\": \"threepipe\",\n \"className\": \"RenderTargetPreviewPlugin\",\n \"params\": [\n false\n ]\n },\n {\n \"import\": \"threepipe\",\n \"className\": \"HDRiGroundPlugin\",\n \"params\": [\n false,\n true\n ]\n },\n {\n \"import\": \"threepipe\",\n \"className\": \"VignettePlugin\",\n \"params\": [\n false\n ]\n },\n {\n \"import\": \"threepipe\",\n \"className\": \"ChromaticAberrationPlugin\",\n \"params\": [\n false\n ]\n },\n {\n \"import\": \"threepipe\",\n \"className\": \"FilmicGrainPlugin\",\n \"params\": [\n false\n ]\n },\n {\n \"import\": \"threepipe\",\n \"className\": \"SSAOPlugin\",\n \"params\": [\n 1009,\n 1\n ]\n },\n {\n \"import\": \"threepipe\",\n \"className\": \"ContactShadowGroundPlugin\"\n },\n {\n \"import\": \"threepipe\",\n \"className\": \"DeviceOrientationControlsPlugin\"\n },\n {\n \"import\": \"threepipe\",\n \"className\": \"PointerLockControlsPlugin\"\n },\n {\n \"import\": \"threepipe\",\n \"className\": \"ThreeFirstPersonControlsPlugin\"\n },\n {\n \"import\": \"threepipe\",\n \"className\": \"MeshOptSimplifyModifierPlugin\",\n \"params\": [\n false\n ]\n },\n {\n \"import\": \"@threepipe/webgi-plugins\",\n \"className\": \"AnisotropyPlugin\",\n },\n {\n \"import\": \"@threepipe/webgi-plugins\",\n \"className\": \"BloomPlugin\",\n },\n {\n \"import\": \"@threepipe/webgi-plugins\",\n \"className\": \"SSReflectionPlugin\",\n },\n {\n \"import\": \"@threepipe/webgi-plugins\",\n \"className\": \"TemporalAAPlugin\",\n },\n {\n \"import\": \"@threepipe/webgi-plugins\",\n \"className\": \"VelocityBufferPlugin\",\n params: [1009, false],\n },\n {\n \"import\": \"@threepipe/webgi-plugins\",\n \"className\": \"DepthOfFieldPlugin\",\n params: [false],\n },\n {\n \"import\": \"@threepipe/webgi-plugins\",\n \"className\": \"SSContactShadowsPlugin\",\n params: [false],\n },\n {\n \"import\": \"@threepipe/webgi-plugins\",\n \"className\": \"OutlinePlugin\",\n params: [false],\n },\n {\n \"import\": \"@threepipe/webgi-plugins\",\n \"className\": \"SSGIPlugin\",\n params: [undefined, 1, false],\n },\n // GLTFDracoExportPlugin, GLTFSpecGlossinessConverterPlugin\n {\n \"import\": \"@threepipe/plugin-gltf-transform\",\n \"className\": \"GLTFDracoExportPlugin\",\n },\n {\n \"import\": \"@threepipe/plugin-gltf-transform\",\n \"className\": \"GLTFSpecGlossinessConverterPlugin\",\n },\n // MaterialConfiguratorPlugin, SwitchNodePlugin\n {\n \"import\": \"@threepipe/plugin-configurator\",\n \"className\": \"MaterialConfiguratorPlugin\",\n },\n {\n \"import\": \"@threepipe/plugin-configurator\",\n \"className\": \"SwitchNodePlugin\",\n },\n ...['B3DMLoadPlugin', 'CMPTLoadPlugin', 'DeepZoomImageLoadPlugin', 'EnvironmentControlsPlugin', 'GlobeControlsPlugin', 'I3DMLoadPlugin', 'PNTSLoadPlugin', 'TilesRendererPlugin'].map(className => ({\n import: '@threepipe/plugin-3d-tiles-renderer',\n className,\n })),\n {\n import: '@threepipe/plugin-assimpjs',\n className: 'AssimpJsPlugin',\n params: [false],\n },\n {\n import: '@threepipe/plugin-path-tracing',\n className: 'ThreeGpuPathTracerPlugin',\n params: [false],\n },\n {\n import: '@threepipe/plugin-blend-importer',\n className: 'BlendLoadPlugin',\n },\n {\n import: '@threepipe/plugin-network',\n className: 'TransfrSharePlugin',\n },\n {\n import: '@threepipe/plugin-troika-text',\n className: 'TroikaTextPlugin',\n },\n ...[\n 'TDSLoadPlugin',\n 'ThreeMFLoadPlugin',\n 'ColladaLoadPlugin',\n 'AMFLoadPlugin',\n 'GCodeLoadPlugin',\n 'BVHLoadPlugin',\n 'VOXLoadPlugin',\n 'MDDLoadPlugin',\n 'PCDLoadPlugin',\n 'TiltLoadPlugin',\n 'VRMLLoadPlugin',\n 'LDrawLoadPlugin',\n 'VTKLoadPlugin',\n 'XYZLoadPlugin',\n ].map(className => ({\n import: '@threepipe/plugins-extra-importers',\n className,\n })),\n ],\n dependencies: [{\n key: '@threepipe/webgi-plugins',\n version: '0.6.1',\n }, {\n key: '@threepipe/plugin-gltf-transform',\n version: 'latest',\n }, {\n key: '@threepipe/plugin-configurator',\n version: 'latest',\n }, {\n key: '@threepipe/plugin-3d-tiles-renderer',\n version: 'latest',\n }, {\n key: '@threepipe/plugin-assimpjs',\n version: 'latest',\n }, {\n key: '@threepipe/plugin-path-tracing',\n version: 'latest',\n }, {\n key: '@threepipe/plugin-blend-importer',\n version: 'latest',\n }, {\n key: '@threepipe/plugin-network',\n version: 'latest',\n }, {\n key: '@threepipe/plugin-troika-text',\n version: 'latest',\n }, {\n key: '@threepipe/plugins-extra-importers',\n version: 'latest',\n }],\n scripts: [],\n viewer: {},\n} as ProjectConfigSettings\n"],"names":["wasm","wasmpack","instance","ready","unpack","result","data","i","ch","write","assert","cond","bytes","view","reorder","fun","indices","vertices","optf","sbrk","ip","rp","heap","indices8","unique","remap","spatialsort","positions","count","stride","sp","encode","bound","source","size","tp","res","target","maxindex","index","index32","filter","bits","insize","mode","triangles","optsize","positions_stride","table","MeshoptDecoder","wasm_base","wasm_simd","detector","decode","count4","filters","decoders","workers","requestId","createWorker","url","worker","event","initWorkers","workerProcess","blob","decodeWorker","resolve","reject","id","error","simplify","index_count","vertex_positions","vertex_count","vertex_positions_stride","target_index_count","target_error","options","te","ti","si","simplifyAttr","vertex_attributes","vertex_attributes_stride","attribute_weights","sa","sw","simplifyScale","simplifyPoints","vertex_colors","vertex_colors_stride","color_weight","target_vertex_count","sc","simplifyOptions","indices32","flags","walkScriptExports","module","plugins","components","name","value","isPluginType","isComponentType","registerScripts","viewer","modules","found","entityComponents","EntityComponentPlugin","walked","component","existing","plugin","uiPositionMode","_HtmlUiComponent","Object3DComponent","Vector3","e","changeKey","v","_b","_a","_d","_c","object","state","resized","camera","canvas","_e","projected","x","y","html","width","height","literalStrings","HtmlUiComponent","generatorParamTypes","parseGeneratorParamsSchema","exported","warn","isRecord","schema","key","parsed","parseEntry","inferGeneratorParam","isNumberVector","validateGeneratorParam","entry","option","optionValue","isJsonValue","isOptions","isFiniteNumber","type","seen","valid","item","viewerConfigs","generatorImportRevision","_GeneratorComponent","config","run","reportGeneratorError","revision","task","runGenerator","node","generated","child","bakedFrom","unmarkGenerated","metadata","getAuthoringMetadata","setAuthoringMetadata","removeGeneratedChildren","GeneratorComponent","params","base","isCurrent","onSchema","ensureGeneratorMetadata","moduleUrl","resolveGeneratorModule","loaded","importGeneratorModule","existingChildren","returned","ThreePipe","returnedObjects","normalizeGeneratedResult","markGenerated","removeGeneratedObject","sourceId","outputIndex","descendantIndex","current","savedId","generatorPathId","parts","disposed","renderable","disposeResource","materials","material","resource","resolved","values","objects","candidate","onError","_v1","_v2","_q1","Quaternion","getGeometry","meshes","getMeshes","normalizeGeometry","mesh","geometries","simplifyGeometry","mergeBufferGeometries","geometry","vertexCount","position","positionArray","positionOffset","j","BufferGeometry","BufferAttribute","getVertices","o","getComponent","tolerance","hashToIndex","nextIndex","newIndices","newPositions","decimalShift","shiftMultiplier","hash","positionAttribute","PI_2","ShapeType","getShapeParameters","getBoundingBoxParameters","getBoundingCylinderParameters","getBoundingSphereParameters","getConvexPolyhedronParameters","getTrimeshParameters","getBoxParameters","getCylinderParameters","getPlaneParameters","getSphereParameters","threeToCannon","shapeParameters","offset","orientation","shape","createBox","createCylinder","createSphere","createConvexPolyhedron","createTrimesh","z","Box","Vec3","radiusTop","radiusBottom","segments","Cylinder","Sphere","faces","verticesArray","ConvexPolyhedron","Trimesh","box","clone","Box3","localPosition","eps","convexHullToJSON","ConvexHull","Mesh","CQuaternion","MathUtils","axes","majorAxis","minorAxes","radius","eulerX","eulerY","sphere","hull","srcIndices","f","edge","vertex","uniqueSrcIndices","dstPositions","srcToDstIndexMap","dstIndices","physicsBodyType","_Cannon3DBodyComponent","CannonMaterial2","Body","cannon","CannonPhysicsPlugin","m","Cannon3DShapeComponent","sh","refresh","update","changed","s","bodyObj","bodyWorldPos","bodyWorldQuat","quat","shapeObj","worldPos","relQuat","Cannon3DBodyComponent","cannonDebugger","_tempVec0","CannonVector3","_tempVec1","_tempVec2","CannonQuaternion","_sphereGeometry","SphereGeometry","_boxGeometry","BoxGeometry","_planeGeometry","PlaneGeometry","_material","LineMaterial2","createConvexPolyhedronGeometry","Float32BufferAttribute","face","a","b","c","createTrimeshGeometry","v0","v1","v2","createHeightfieldGeometry","row","xi","yi","createMesh","SPHERE","BOX","PLANE","CYLINDER","CONVEXPOLYHEDRON","TRIMESH","HEIGHTFIELD","Shape","Wireframe","WireframeGeometry3","CylinderGeometry","scaleMesh","typeMatch","updateMesh","CannonDebugger","typeToCannon","cannonShapeTypes","cannonShapeTypeParams","_Cannon3DShapeComponent","params1","k","body","refreshBody","shapeType","Object3DWidgetsPlugin","Cannon3DShapeHelper","AHelperWidget","Group","shapes","added","removed","obj","CannonRagdollComponent","MeshStandardMaterial","Object3D","_event","syncBoneRotation","boneNames","bone","boneName","initialBodyQuat","initialBoneWorldQuat","currentBodyQuat","initialBodyQuatInverse","newBoneWorldQuat","parentWorldQuat","newLocalQuat","hipsBone","parentMatrixWorldInverse","skinnedMesh","deltaX","deltaY","deltaZ","bodyQuat","scale","angle","angleShoulders","twistAngle","shouldersDistance","upperArmLength","lowerArmLength","upperArmSize","lowerArmSize","neckLength","headRadius","upperBodyLength","pelvisLength","upperLegLength","upperLegSize","lowerLegSize","lowerLegLength","headShape","upperArmShape","lowerArmShape","upperBodyShape","pelvisShape","upperLegShape","lowerLegShape","basePos","baseQuat","transformLocalToWorld","localOffset","worldOffset","createMeshForBody","isHead","lowerLeftLeg","lowerRightLeg","upperLeftLeg","upperRightLeg","pelvisLocalY","pelvis","upperBodyLocalY","upperBody","headLocalY","head","armLocalY","upperLeftArm","upperRightArm","lowerLeftArm","lowerRightArm","neckJoint","ConeTwistConstraint","leftKneeJoint","rightKneeJoint","leftHipJoint","rightHipJoint","spineJoint","leftShoulder","rightShoulder","leftElbowJoint","rightElbowJoint","constraint","resetBody","pos","pelvisY","upperBodyY","headY","armY","impulse","worldPoint","partName","impactPoint","storeBoneQuat","worldQuat","matchBodyToBone","visible","point","closest","minDist","dx","dy","dz","dist","__decorateClass","uiFolderContainer","CannonMaterial","generateUUID","uiInput","uiMonitor","uiNumber","ThreeSerialization","ContactMaterial","TypeSystem","AViewerPluginSync","enabled","running","World","Matrix4","frameFadePlugin","FrameFadePlugin","dirty","bodyC","collisionEv","compA","compB","offUpdate","compType","wplugin","off","serialize","uiToggle","_that","uiConfig","defaultObjectOverrides","defaultMaterialOverrides","objectProperties","RuntimeNestedAssetLoader","loading","loads","load","results","path","imported","targetObject","targetMaterial","cloneObject","overrideProperties","property","targetUserData","copyObject3DUserData","overrides","getPartialProps","setPartialProps","promise","remove","sourceRoot","cloneRoot","createGame","createProjectGame","createStoppedGame","fileRevisions","moduleRevision","start","reportError","createErrorReporter","nestedAssets","removeURLModifier","gameHooks","baseUrl","validateBase","packageText","assetsText","fetchText","packageJson","parsePackageJSON","parsePackageJsonSettingsConfig","assetsManifest","parseAssetsJSONManifest","project","physics","ThreeViewer","GBufferPlugin","PopmotionPlugin","GLTFAnimationPlugin","GLTFMeshOptDecodePlugin","KTX2LoadPlugin","KTXLoadPlugin","PLYLoadPlugin","Rhino3dmLoadPlugin","STLLoadPlugin","USDZLoadPlugin","installGameHooks","urlModifier","createProjectAssetURLModifier","registerProjectScripts","registerProjectPlugins","sceneUrl","loadedScene","mainUrl","versionedProjectUrl","mainModule","importModule","readyViewer","cleanupReport","runtimeCleanupReport","definition","specifier","resolvePluginSpecifier","findPluginExport","isDependencyModuleSpecifier","assertSameOrigin","normalized","requested","selected","candidates","response","emptyProjectSettings","className"],"mappings":"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","x_google_ignoreList":[0,1,2]}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../node_modules/meshoptimizer/meshopt_encoder.module.js","../node_modules/meshoptimizer/meshopt_decoder.module.js","../node_modules/meshoptimizer/meshopt_simplifier.module.js","../src/scripts.ts","../src/plugins/HtmlUiComponent.ts","../src/plugins/cannon/utils.ts","../src/plugins/cannon/threeToCannon.ts","../src/plugins/cannon/Cannon3DBodyComponent.ts","../src/plugins/cannon/helper.ts","../src/plugins/cannon/Cannon3DShapeComponent.ts","../src/plugins/cannon/CannonRagdollComponent.ts","../src/plugins/cannon/CannonPhysicsPlugin.ts","../src/runtime/nestedAssets.ts","../src/runtime/createGame.ts","../src/defaults.ts"],"sourcesContent":["// This file is part of meshoptimizer library and is distributed under the terms of MIT License.\n// Copyright (C) 2016-2023, by Arseny Kapoulkine (arseny.kapoulkine@gmail.com)\nvar MeshoptEncoder = (function() {\n\t// Built with clang version 16.0.0\n\t// Built from meshoptimizer 0.20\n\tvar wasm = \"b9H79TebbbeJq9Geueu9Geub9Gbb9Gvuuuuueu9Gduueu9Gluuuueu9Gvuuuuub9Gouuuuuub9Gluuuub9GiuuueuiKLdilevlevlooroowwvwbDDbelve9Weiiviebeoweuec:W;kekr;RiOo9TW9T9VV95dbH9F9F939H79T9F9J9H229F9Jt9VV7bb8A9TW79O9V9Wt9FW9U9J9V9KW9wWVtW949c919M9MWVbe8F9TW79O9V9Wt9FW9U9J9V9KW9wWVtW949c919M9MWV9c9V919U9KbdE9TW79O9V9Wt9FW9U9J9V9KW9wWVtW949wWV79P9V9UbiY9TW79O9V9Wt9FW9U9J9V9KW69U9KW949c919M9MWVbl8E9TW79O9V9Wt9FW9U9J9V9KW69U9KW949c919M9MWV9c9V919U9Kbv8A9TW79O9V9Wt9FW9U9J9V9KW69U9KW949wWV79P9V9UboE9TW79O9V9Wt9FW9U9J9V9KW69U9KW949tWG91W9U9JWbra9TW79O9V9Wt9FW9U9J9V9KW69U9KW949tWG91W9U9JW9c9V919U9KbwL9TW79O9V9Wt9FW9U9J9V9KWS9P2tWV9p9JtbDK9TW79O9V9Wt9FW9U9J9V9KWS9P2tWV9r919HtbqL9TW79O9V9Wt9FW9U9J9V9KWS9P2tWVT949WbkE9TW79O9V9Wt9F9V9Wt9P9T9P96W9wWVtW94J9H9J9OWbPa9TW79O9V9Wt9F9V9Wt9P9T9P96W9wWVtW94J9H9J9OW9ttV9P9Wbsa9TW79O9V9Wt9F9V9Wt9P9T9P96W9wWVtW94SWt9J9O9sW9T9H9WbzK9TW79O9V9Wt9F79W9Ht9P9H29t9VVt9sW9T9H9WbHl79IV9RbODwebcekdQXq:g9sLdbk;3keYu8Jjjjjbcjo9Rgv8Kjjjjbcbhodnalcefae0mbabcbRb:S:kjjbc:GeV86bbavcjdfcbcjdzNjjjb8AdnaiTmbavcjdfadalz:tjjjb8Akabaefhrabcefhwavalfcbcbcjdal9RalcFe0EzNjjjb8Aavavcjdfalz:tjjjbhDcj;abal9UhodndndndndnalTmbaoc;WFbGgecjdaecjd6Ehqcbhkdninakai9pmiaDcjlfcbcjdzNjjjb8Aaqaiak9Rakaqfai6Egxcsfgecl4cifcd4hmadakal2fhPdndndndndnaec9WGgsTmbcbhzcehHaPhOawhAxekdnaxTmbcbhAcehHaPhCinaDaAfRbbhXaDcjlfheaChoaxhQinaeaoRbbgLaX9RgXcetaX;acr4786bbaoalfhoaecefheaLhXaQcufgQmbkaraw9Ram6miawcbamzNjjjbgeTmiaCcefhCaeamfhwaAcefgAal6hHaAal9hmbxvkkaraw9Ram6mvawcbamzNjjjb8AceheinawgXamfhwalaegoSmldnaraw9Ram6mbaocefheawcbamzNjjjb8AaXmekkaoal6hHxekindnaxTmbaDazfRbbhXaDcjlfheaOhoaxhQinaeaoRbbgLaX9RgXcetaX;acr4786bbaoalfhoaecefheaLhXaQcufgQmbkkaraA9Ram6mearaAcbamzNjjjbgKamfgw9RcK6mdcbhYaDcjlfhAinaDcjlfaYfh8AcwhCczhLcehQindndnaQce9hmbcuhoa8ARbbmecbhodninaogecsSmeaecefhoaAaefcefRbbTmbkkcucbaecs6EhoxekaQcetc;:FFFeGhocuaQtcu7cFeGhXcbheinaoaXaAaefRbb9nfhoaecefgecz9hmbkkaoaLaoaL6geEhLaQaCaeEhCaQcetgQcw6mbkdndndndnaCcufPdiebkaKaYco4fgeaeRbbcdciaCclSEaYci4coGtV86bbaCcw9hmeawa8A8Pbb83bbawcwfa8Acwf8Pbb83bbawczfhwxdkaKaYco4fgeaeRbbceaYci4coGtV86bbkdncwaC9TgEmbinawcb86bbawcefhwxbkkcuaCtcu7h8Acbh3aAh5ina5heaEhQcbhoinaeRbbgLa8AcFeGgXaLaX6EaoaCtVhoaecefheaQcufgQmbkawao86bba5aEfh5awcefhwa3aEfg3cz6mbkcbheindnaAaefRbbgoaX6mbawao86bbawcefhwkaecefgecz9hmbkkdnaYczfgYas9pmbaAczfhAaraw9RcL0mekkaYas6meawTmeaOcefhOazcefgzal6hHawhAazalSmixbkkcbhwaHceGTmexikcbhwaHceGmdkaDaPaxcufal2falz:tjjjb8AaxakfhkawmbkcbhoxokcbhoxvkaiTmekcbhoaraw9Ralcaalca0E6mialc8F9nmexdkcbhoaecufca6mdkawcbcaal9RgezNjjjbaefhwkawaDcjdfalz:tjjjbalfab9Rhokavcjof8Kjjjjbaok9heeuaecaaeca0Eabcj;abae9Uc;WFbGgdcjdadcjd6Egdfcufad9Uae2adcl4cifcd4adV2fcefkmbcbabBd:S:kjjbk;rse3u8Jjjjjbc;ae9Rgl8Kjjjjbcbhvdnaici9UgocHfae0mbabcbyd:C:kjjbgrc;GeV86bbalc;abfcFecjezNjjjb8AalcUfgw9cu83ibalc8WfgD9cu83ibalcyfgq9cu83ibalcafgk9cu83ibalcKfgx9cu83ibalczfgm9cu83ibal9cu83iwal9cu83ibabaefc9WfhPabcefgsaofhednaiTmbcmcsarcb9kgzEhHcbhOcbhAcbhCcbhXcbhQindnaeaP9nmbcbhvxikaQcufhvadaCcdtfgoydbhLaocwfydbhKaoclfydbhYcbh8Adndninalc;abfavcsGcitfgoydlhEdndndnaoydbgoaL9hmbaEaYSmekdnaoaY9hmbaEaK9hmba8Acefh8AxekaoaK9hmeaEaL9hmea8Acdfh8Aka8Ac870mdaXcufhvada8AciGcx2goc:y1jjbfydbaCfcdtfydbhEadaocN1jjbfydbaCfcdtfydbhKadaoc:q1jjbfydbaCfcdtfydbhLcbhodnindnalavcsGcdtfydbaE9hmbaohYxdkcuhYavcufhvaocefgocz9hmbkkaEaOSgvaYce9iaYaH9oVgoGh3dndndndndncbcsavEaYaoEgvcs9hmbarce9imbaEaEaAaEcefaASgvEgAcefSmecmcsavEhvkasava8Acdtc;WeGV86bbavcs9hmeaEaA9Rgvcetavc8F917hvinaeavcFb0crtavcFbGV86bbaecefheavcje6hoavcr4hvaoTmbkaEhAxdkcPhvasa8AcdtcPV86bbaEhAkavTmbavaH9imekalaXcdtfaEBdbaXcefcsGhXkaOa3fhOalc;abfaQcitfgvaKBdlavaEBdbalc;abfaQcefcsGgvcitfgoaEBdlaoaLBdbavcefhoxikavcufhva8Aclfg8Ac;ab9hmbkkdnadceaKaOScetaYaOSEcx2gvc:q1jjbfydbaCfcdtfydbgLTadavcN1jjbfydbaCfcdtfydbg8AceSGadavc:y1jjbfydbaCfcdtfydbgYcdSGaOcb9hGazGg5ce9hmbaw9cu83ibaD9cu83ibaq9cu83ibak9cu83ibax9cu83ibam9cu83ibal9cu83iwal9cu83ibcbhOkcbhEaXcufgvhodnindnalaocsGcdtfydba8A9hmbaEhKxdkcuhKaocufhoaEcefgEcz9hmbkkcbhodnindnalavcsGcdtfydbaY9hmbaohExdkcuhEavcufhvaocefgocz9hmbkkaOaLaOSg8Efh3dndnaKcm0mbaKcefhKxekcbcsa8Aa3SgvEhKa3avfh3kdndnaEcm0mbaEcefhExekcbcsaYa3SgvEhEa3avfh3kc9:cua8EEh8FaEaKcltVhocbhvdndndninavcj1jjbfRbbaocFeGSmeavcefgvcz9hmbxdkka5aLaO9havcm0VVmbasavc;WeV86bbxekasa8F86bbaeao86bbaecefhekdna8EmbaLaA9Rgvcetavc8F917hvinaeavcFb0gocrtavcFbGV86bbavcr4hvaecefheaombkaLhAkdnaKcs9hmba8AaA9Rgvcetavc8F917hvinaeavcFb0gocrtavcFbGV86bbavcr4hvaecefheaombka8AhAkdnaEcs9hmbaYaA9Rgvcetavc8F917hvinaeavcFb0gocrtavcFbGV86bbavcr4hvaecefheaombkaYhAkalaXcdtfaLBdbaXcefcsGhvdndnaKPzbeeeeeeeeeeeeeebekalavcdtfa8ABdbaXcdfcsGhvkdndnaEPzbeeeeeeeeeeeeeebekalavcdtfaYBdbavcefcsGhvkalc;abfaQcitfgoaLBdlaoa8ABdbalc;abfaQcefcsGcitfgoa8ABdlaoaYBdbalc;abfaQcdfcsGcitfgoaYBdlaoaLBdbaQcifhoavhXa3hOkascefhsaocsGhQaCcifgCai6mbkkcbhvaeaP0mbcbhvinaeavfavcj1jjbfRbb86bbavcefgvcz9hmbkaeab9Ravfhvkalc;aef8KjjjjbavkZeeucbhddninadcefgdc8F0meceadtae6mbkkadcrfcFeGcr9Uci2cdfabci9U2cHfkmbcbabBd:C:kjjbk:ydewu8Jjjjjbcz9Rhlcbhvdnaicvfae0mbcbhvabcbRb:C:kjjbc;qeV86bbal9cb83iwabcefhoabaefc98fhrdnaiTmbcbhwcbhDindnaoar6mbcbskadaDcdtfydbgqalcwfawaqav9Rgvavc8F91gv7av9Rc507gwcdtfgkydb9Rgvc8E91c9:Gavcdt7awVhvinaoavcFb0gecrtavcFbGV86bbavcr4hvaocefhoaembkakaqBdbaqhvaDcefgDai9hmbkkcbhvaoar0mbaocbBbbaoab9RclfhvkavkBeeucbhddninadcefgdc8F0meceadtae6mbkkadcwfcFeGcr9Uab2cvfk:dvli99dui99ludnaeTmbcuadcetcuftcu7:Yhvdndncuaicuftcu7:YgoJbbbZMgr:lJbbb9p9DTmbar:Ohwxekcjjjj94hwkcbhicbhDinalclfIdbgrJbbbbJbbjZalIdbgq:lar:lMalcwfIdbgk:lMgr:varJbbbb9BEgrNhxaqarNhralcxfIdbhqdndnakJbbbb9GTmbaxhkxekJbbjZar:l:tgkak:maxJbbbb9GEhkJbbjZax:l:tgxax:marJbbbb9GEhrkdndnaqJbbj:;aqJbbj:;9GEgxJbbjZaxJbbjZ9FEavNJbbbZJbbb:;aqJbbbb9GEMgq:lJbbb9p9DTmbaq:Ohmxekcjjjj94hmkdndnakJbbj:;akJbbj:;9GEgqJbbjZaqJbbjZ9FEaoNJbbbZJbbb:;akJbbbb9GEMgq:lJbbb9p9DTmbaq:OhPxekcjjjj94hPkdndnarJbbj:;arJbbj:;9GEgqJbbjZaqJbbjZ9FEaoNJbbbZJbbb:;arJbbbb9GEMgr:lJbbb9p9DTmbar:Ohsxekcjjjj94hskdndnadcl9hmbabaifgzas86bbazcifam86bbazcdfaw86bbazcefaP86bbxekabaDfgzas87ebazcofam87ebazclfaw87ebazcdfaP87ebkalczfhlaiclfhiaDcwfhDaecufgembkkk;klld99eud99eudnaeTmbdndncuaicuftcu7:YgvJbbbZMgo:lJbbb9p9DTmbao:Ohixekcjjjj94hikaic;8FiGhrinabcofcicdalclfIdb:lalIdb:l9EgialcwfIdb:lalaicdtfIdb:l9EEgialcxfIdb:lalaicdtfIdb:l9EEgiarV87ebdndnalaicefciGcdtfIdbJ;Zl:1ZNJbbj:;JbbjZalaicdtfIdbJbbbb9DEgoNgwJbbj:;awJbbj:;9GEgDJbbjZaDJbbjZ9FEavNJbbbZJbbb:;awJbbbb9GEMgw:lJbbb9p9DTmbaw:Ohqxekcjjjj94hqkabaq87ebdndnaoalaicdfciGcdtfIdbJ;Zl:1ZNNgwJbbj:;awJbbj:;9GEgDJbbjZaDJbbjZ9FEavNJbbbZJbbb:;awJbbbb9GEMgw:lJbbb9p9DTmbaw:Ohqxekcjjjj94hqkabcdfaq87ebdndnaoalaicufciGcdtfIdbJ;Zl:1ZNNgoJbbj:;aoJbbj:;9GEgwJbbjZawJbbjZ9FEavNJbbbZJbbb:;aoJbbbb9GEMgo:lJbbb9p9DTmbao:Ohixekcjjjj94hikabclfai87ebabcwfhbalczfhlaecufgembkkk:Hvdxue998Jjjjjbcjd9Rgo8Kjjjjbadcd4hrdndndndnavcd9hmbadcl6mearcearce0EhwaohDinaDc:CuBdbaDclfhDawcufgwmbkaeTmiadcl6mdarcearce0EhqarcdthkalhxcbhminaohDaxhwaqhPinaDaDydbgsawydbgzcL4cFeGc:cufcbazEgzasaz9kEBdbawclfhwaDclfhDaPcufgPmbkaxakfhxamcefgmae9hmbkkaeTmdxekaeTmekavcb9hadcl6gqVhHarcearce0Ehkarcdthrceai9Rhmcbhdindndndnavce9hmbaqmdc:CuhwalhDakhPinawaDydbgscL4cFeGc:cufcbasEgsawas9kEhwaDclfhDaPcufgPmbxdkkc:CuhwaHmbaohDalhPakhsinaDaPydbgzcL4cFeGgxc8Aaxc8A9kEc:cufcbazEBdbaPclfhPaDclfhDascufgsmbkkaqmbcbhDakhsinawhPdnavceSmbaoaDfydbhPkdndnalaDfIdbgOcjjj;8iamaPfgPcLt9R::NJbbbZJbbb:;aOJbbbb9GEMgO:lJbbb9p9DTmbaO:Ohzxekcjjjj94hzkabaDfazcFFFrGaPcKtVBdbaDclfhDascufgsmbkkabarfhbalarfhladcefgdae9hmbkkaocjdf8KjjjjbkFkdCui998Jjjjjbc:Gd9Rgv8Kjjjjbavc:4efcbc;KbzNjjjb8AcbhodnadTmbcbhoaiTmbdnabae9hmbavcuadcdtgoadcFFFFi0Ecbyd:K:kjjbHjjjjbbgeBd:4eavceBd:ydaeabaoz:tjjjb8Akavc:OefcwfcbBdbav9cb83i:Oeavc:Oefaeadaiavc:4efz:njjjbcuaicdtgraicFFFFi0Egwcbyd:K:kjjbHjjjjbbhoavc:4efavyd:ydgDcdtfaoBdbavaDcefgqBd:ydaoavyd:Oegkarz:tjjjbhxavc:4efaqcdtfadci9Ugmcbyd:K:kjjbHjjjjbbgoBdbavaDcdfgrBd:ydaocbamzNjjjbhPavc:4efarcdtfawcbyd:K:kjjbHjjjjbbgsBdbavaDcifgqBd:ydaxhoashrinaralIdbalaoydbgwcwawcw6Ecdtfc;ebfIdbMUdbaoclfhoarclfhraicufgimbkavc:4efaqcdtfcuamcdtadcFFFF970Ecbyd:K:kjjbHjjjjbbgqBdbavaDclfBd:yddnadci6mbamceamce0EhiaehoaqhrinarasaoydbcdtfIdbasaoclfydbcdtfIdbMasaocwfydbcdtfIdbMUdbaocxfhoarclfhraicufgimbkkavc;qbfhzavhoavyd:SehHavyd:WehOcbhwcbhrcbhAcehCinaohXcihQaearci2gLcdtfgocwfydbhdaoydbhDabaAcx2fgiclfaoclfydbgKBdbaiaDBdbaicwfadBdbaParfce86bbazadBdwazaKBdlazaDBdbaqarcdtfcbBdbdnawTmbcihQaXhiinazaQcdtfaiydbgoBdbaQaoaD9haoaK9hGaoad9hGfhQaiclfhiawcufgwmbkkaAcefhAaxaDcdtfgoaoydbcufBdbaxaKcdtfgoaoydbcufBdbaxadcdtfgoaoydbcufBdbcbhwinaOaHaeawaLfcdtfydbcdtgifydbcdtfgKhoakaifgDydbgdhidnadTmbdninaoydbarSmeaoclfhoaicufgiTmdxbkkaoadcdtaKfc98fydbBdbaDaDydbcufBdbkawcefgwci9hmbkdndndnaQTmbcuhrJbbbbhYcbhDavyd:SehKavyd:WehLindndnakazaDcdtfydbcdtgofydbgimbaDcefhDxekaDcs0hwasaofgdIdbh8AadalcbaDcefgDawEcdtfIdbalaxaofydbgwcwawcw6Ecdtfc;ebfIdbMgEUdbaEa8A:thEaicdthiaLaKaofydbcdtfhoinaqaoydbgwcdtfgdaEadIdbMg8AUdba8AaYaYa8A9DgdEhYawaradEhraoclfhoaic98fgimbkkaDaQ9hmbkarcu9hmekaCam9pmeindnaPaCfRbbmbaChrxdkamaCcefgC9hmbxdkkaQczaQcz6EhwazhoaXhzarcu9hmekkavyd:ydhokaocdtavc:4effc98fhrdninaoTmearydbcbyd:G:kjjbH:bjjjbbarc98fhraocufhoxbkkavc:Gdf8Kjjjjbk;UlevucuaicdtgvaicFFFFi0Egocbyd:K:kjjbHjjjjbbhralalyd9GgwcdtfarBdbalawcefBd9GabarBdbaocbyd:K:kjjbHjjjjbbhralalyd9GgocdtfarBdbalaocefBd9GabarBdlcuadcdtadcFFFFi0Ecbyd:K:kjjbHjjjjbbhralalyd9GgocdtfarBdbalaocefBd9GabarBdwabydbcbavzNjjjb8Aadci9UhwdnadTmbabydbhoaehladhrinaoalydbcdtfgvavydbcefBdbalclfhlarcufgrmbkkdnaiTmbabydbhlabydlhrcbhvaihoinaravBdbarclfhralydbavfhvalclfhlaocufgombkkdnadci6mbawceawce0EhDabydlhrabydwhvcbhlinaecwfydbhoaeclfydbhdaraeydbcdtfgwawydbgwcefBdbavawcdtfalBdbaradcdtfgdadydbgdcefBdbavadcdtfalBdbaraocdtfgoaoydbgocefBdbavaocdtfalBdbaecxfheaDalcefgl9hmbkkdnaiTmbabydlheabydbhlinaeaeydbalydb9RBdbalclfhlaeclfheaicufgimbkkkQbabaeadaic:01jjbz:mjjjbkQbabaeadaic:C:jjjbz:mjjjbk9DeeuabcFeaicdtzNjjjbhlcbhbdnadTmbindnalaeydbcdtfgiydbcu9hmbaiabBdbabcefhbkaeclfheadcufgdmbkkabk;:kivuo99lu8Jjjjjbcj;Hb9Rgl8Kjjjjbcbhvalc1;Gbfcbc;KbzNjjjb8AalcuadcdtadcFFFFi0Egocbyd:K:kjjbHjjjjbbgrBd19GalceBd;O9Galcwfcbyd:m:kjjbBdbalcb8Pd:e:kjjb83ibalc;W;Gbfcwfcbyd:y:kjjbBdbalcb8Pd:q:kjjb83i;W9Gaicd4hwdndnadmbJFFuFhDJFFuuhqJFFuuhkJFFuFhxJFFuuhmJFFuFhPxekawcdthsaehzincbhiinalaifgHazaifIdbgDaHIdbgxaxaD9EEUdbalc;W;GbfaifgHaDaHIdbgxaxaD9DEUdbaiclfgicx9hmbkazasfhzavcefgvad9hmbkalIdwhqalId;49GhDalIdlhkalId;09GhxalIdbhmalId;W9GhPkdndnadTmbJbbbbJbbjZaPam:tJbbbb:xgPaxak:tgxaxaP9DEgxaDaq:tgDaDax9DEgD:vaDJbbbb9BEhDawcdthsarhHadhzindndnaDaeIdbam:tNJb;au9eNJbbbZMgx:lJbbb9p9DTmbax:Ohixekcjjjj94hikaicztaicwtcj;GiGVaicsGVc:p;G:dKGcH2c;d;H:WKGcv2c;j:KM;jbGhvdndnaDaeclfIdbak:tNJb;au9eNJbbbZMgx:lJbbb9p9DTmbax:Ohixekcjjjj94hikaicztaicwtcj;GiGVaicsGVc:p;G:dKGcH2c;d;H:WKGcq2cM;j:KMeGavVhvdndnaDaecwfIdbaq:tNJb;au9eNJbbbZMgx:lJbbb9p9DTmbax:Ohixekcjjjj94hikaHavaicztaicwtcj;GiGVaicsGVc:p;G:dKGcH2c;d;H:WKGcC2c:KM;j:KdGVBdbaeasfheaHclfhHazcufgzmbkalcbcj;GbzNjjjbhiarhHadheinaiaHydbgzcFrGcx2fgvavydbcefBdbaiazcq4cFrGcx2fgvavydlcefBdlaiazcC4cFrGcx2fgzazydwcefBdwaHclfhHaecufgembxdkkalcbcj;GbzNjjjb8AkcbhHcbhzcbhecbhvinalaHfgiydbhsaiazBdbaicwfgwydbhOawavBdbaiclfgiydbhwaiaeBdbasazfhzaOavfhvawaefheaHcxfgHcj;Gb9hmbkcbhialaocbyd:K:kjjbHjjjjbbgzBd:m9GdnadTmbabhHinaHaiBdbaHclfhHadaicefgi9hmbkadTmbabhiadhHinalaraiydbgecdtfydbcFrGcx2fgvavydbgvcefBdbazavcdtfaeBdbaiclfhiaHcufgHmbkazhiadhHinalaraiydbgecdtfydbcq4cFrGcx2fgvavydlgvcefBdlabavcdtfaeBdbaiclfhiaHcufgHmbkabhiadhHinalaraiydbgecdtfydbcC4cFrGcx2fgvavydwgvcefBdwazavcdtfaeBdbaiclfhiaHcufgHmbkadTmbcbhiinabazydbcdtfaiBdbazclfhzadaicefgi9hmbkkclhidninaic98Smealc1;Gbfaifydbcbyd:G:kjjbH:bjjjbbaic98fhixbkkalcj;Hbf8Kjjjjbk9teiucbcbyd:O:kjjbgeabcifc98GfgbBd:O:kjjbdndnabZbcztgd9nmbcuhiabad9RcFFifcz4nbcuSmekaehikaik;LeeeudndnaeabVciGTmbabhixekdndnadcz9pmbabhixekabhiinaiaeydbBdbaiclfaeclfydbBdbaicwfaecwfydbBdbaicxfaecxfydbBdbaeczfheaiczfhiadc9Wfgdcs0mbkkadcl6mbinaiaeydbBdbaeclfheaiclfhiadc98fgdci0mbkkdnadTmbinaiaeRbb86bbaicefhiaecefheadcufgdmbkkabk;aeedudndnabciGTmbabhixekaecFeGc:b:c:ew2hldndnadcz9pmbabhixekabhiinaialBdbaicxfalBdbaicwfalBdbaiclfalBdbaiczfhiadc9Wfgdcs0mbkkadcl6mbinaialBdbaiclfhiadc98fgdci0mbkkdnadTmbinaiae86bbaicefhiadcufgdmbkkabk9teiucbcbyd:O:kjjbgeabcrfc94GfgbBd:O:kjjbdndnabZbcztgd9nmbcuhiabad9RcFFifcz4nbcuSmekaehikaik9:eiuZbhedndncbyd:O:kjjbgdaecztgi9nmbcuheadai9RcFFifcz4nbcuSmekadhekcbabae9Rcifc98Gcbyd:O:kjjbfgdBd:O:kjjbdnadZbcztge9nmbadae9RcFFifcz4nb8Akkk:6ddbcjwk:Cdb4:h9w9N94:P:gW:j9O:ye9Pbbbbbbebbbdbbbebbbdbbbbbbbdbbbbbbbebbbbbbb:l29hZ;69:9kZ;N;76Z;rg97Z;z;o9xZ8J;B85Z;:;u9yZ;b;k9HZ:2;Z9DZ9e:l9mZ59A8KZ:r;T3Z:A:zYZ79OHZ;j4::8::Y:D9V8:bbbb9s:49:Z8R:hBZ9M9M;M8:L;z;o8:;8:PG89q;x:J878R:hQ8::M:B;e87bbbbbbjZbbjZbbjZ:E;V;N8::Y:DsZ9i;H;68:xd;R8:;h0838:;W:NoZbbbb:WV9O8:uf888:9i;H;68:9c9G;L89;n;m9m89;D8Ko8:bbbbf:8tZ9m836ZS:2AZL;zPZZ818EZ9e:lxZ;U98F8:819E;68:FFuuFFuuFFuuFFuFFFuFFFuFbc:Cqkzebbbebbbdbbb8WWbb\";\n\n\tvar wasmpack = new Uint8Array([32,0,65,2,1,106,34,33,3,128,11,4,13,64,6,253,10,7,15,116,127,5,8,12,40,16,19,54,20,9,27,255,113,17,42,67,24,23,146,148,18,14,22,45,70,69,56,114,101,21,25,63,75,136,108,28,118,29,73,115]);\n\n\tif (typeof WebAssembly !== 'object') {\n\t\treturn {\n\t\t\tsupported: false,\n\t\t};\n\t}\n\n\tvar instance;\n\n\tvar ready =\n\t\tWebAssembly.instantiate(unpack(wasm), {})\n\t\t.then(function(result) {\n\t\t\tinstance = result.instance;\n\t\t\tinstance.exports.__wasm_call_ctors();\n\t\t\tinstance.exports.meshopt_encodeVertexVersion(0);\n\t\t\tinstance.exports.meshopt_encodeIndexVersion(1);\n\t\t});\n\n\tfunction unpack(data) {\n\t\tvar result = new Uint8Array(data.length);\n\t\tfor (var i = 0; i < data.length; ++i) {\n\t\t\tvar ch = data.charCodeAt(i);\n\t\t\tresult[i] = ch > 96 ? ch - 97 : ch > 64 ? ch - 39 : ch + 4;\n\t\t}\n\t\tvar write = 0;\n\t\tfor (var i = 0; i < data.length; ++i) {\n\t\t\tresult[write++] = (result[i] < 60) ? wasmpack[result[i]] : (result[i] - 60) * 64 + result[++i];\n\t\t}\n\t\treturn result.buffer.slice(0, write);\n\t}\n\n\tfunction assert(cond) {\n\t\tif (!cond) {\n\t\t\tthrow new Error(\"Assertion failed\");\n\t\t}\n\t}\n\n\tfunction bytes(view) {\n\t\treturn new Uint8Array(view.buffer, view.byteOffset, view.byteLength);\n\t}\n\n\tfunction reorder(fun, indices, vertices, optf) {\n\t\tvar sbrk = instance.exports.sbrk;\n\t\tvar ip = sbrk(indices.length * 4);\n\t\tvar rp = sbrk(vertices * 4);\n\t\tvar heap = new Uint8Array(instance.exports.memory.buffer);\n\t\tvar indices8 = bytes(indices);\n\t\theap.set(indices8, ip);\n\t\tif (optf) {\n\t\t\toptf(ip, ip, indices.length, vertices);\n\t\t}\n\t\tvar unique = fun(rp, ip, indices.length, vertices);\n\t\t// heap may have grown\n\t\theap = new Uint8Array(instance.exports.memory.buffer);\n\t\tvar remap = new Uint32Array(vertices);\n\t\tnew Uint8Array(remap.buffer).set(heap.subarray(rp, rp + vertices * 4));\n\t\tindices8.set(heap.subarray(ip, ip + indices.length * 4));\n\t\tsbrk(ip - sbrk(0));\n\n\t\tfor (var i = 0; i < indices.length; ++i)\n\t\t\tindices[i] = remap[indices[i]];\n\n\t\treturn [remap, unique];\n\t}\n\n\tfunction spatialsort(fun, positions, count, stride) {\n\t\tvar sbrk = instance.exports.sbrk;\n\t\tvar ip = sbrk(count * 4);\n\t\tvar sp = sbrk(count * stride);\n\t\tvar heap = new Uint8Array(instance.exports.memory.buffer);\n\t\theap.set(bytes(positions), sp);\n\t\tfun(ip, sp, count, stride);\n\t\t// heap may have grown\n\t\theap = new Uint8Array(instance.exports.memory.buffer);\n\t\tvar remap = new Uint32Array(count);\n\t\tnew Uint8Array(remap.buffer).set(heap.subarray(ip, ip + count * 4));\n\t\tsbrk(ip - sbrk(0));\n\t\treturn remap;\n\t}\n\n\tfunction encode(fun, bound, source, count, size) {\n\t\tvar sbrk = instance.exports.sbrk;\n\t\tvar tp = sbrk(bound);\n\t\tvar sp = sbrk(count * size);\n\t\tvar heap = new Uint8Array(instance.exports.memory.buffer);\n\t\theap.set(bytes(source), sp);\n\t\tvar res = fun(tp, bound, sp, count, size);\n\t\tvar target = new Uint8Array(res);\n\t\ttarget.set(heap.subarray(tp, tp + res));\n\t\tsbrk(tp - sbrk(0));\n\t\treturn target;\n\t}\n\n\tfunction maxindex(source) {\n\t\tvar result = 0;\n\t\tfor (var i = 0; i < source.length; ++i) {\n\t\t\tvar index = source[i];\n\t\t\tresult = result < index ? index : result;\n\t\t}\n\t\treturn result;\n\t}\n\n\tfunction index32(source, size) {\n\t\tassert(size == 2 || size == 4);\n\t\tif (size == 4) {\n\t\t\treturn new Uint32Array(source.buffer, source.byteOffset, source.byteLength / 4);\n\t\t} else {\n\t\t\tvar view = new Uint16Array(source.buffer, source.byteOffset, source.byteLength / 2);\n\t\t\treturn new Uint32Array(view); // copies each element\n\t\t}\n\t}\n\n\tfunction filter(fun, source, count, stride, bits, insize, mode) {\n\t\tvar sbrk = instance.exports.sbrk;\n\t\tvar tp = sbrk(count * stride);\n\t\tvar sp = sbrk(count * insize);\n\t\tvar heap = new Uint8Array(instance.exports.memory.buffer);\n\t\theap.set(bytes(source), sp);\n\t\tfun(tp, count, stride, bits, sp, mode);\n\t\tvar target = new Uint8Array(count * stride);\n\t\ttarget.set(heap.subarray(tp, tp + count * stride));\n\t\tsbrk(tp - sbrk(0));\n\t\treturn target;\n\t}\n\n\treturn {\n\t\tready: ready,\n\t\tsupported: true,\n\t\treorderMesh: function(indices, triangles, optsize) {\n\t\t\tvar optf = triangles ? (optsize ? instance.exports.meshopt_optimizeVertexCacheStrip : instance.exports.meshopt_optimizeVertexCache) : undefined;\n\t\t\treturn reorder(instance.exports.meshopt_optimizeVertexFetchRemap, indices, maxindex(indices) + 1, optf);\n\t\t},\n\t\treorderPoints: function(positions, positions_stride) {\n\t\t\tassert(positions instanceof Float32Array);\n\t\t\tassert(positions.length % positions_stride == 0);\n\t\t\tassert(positions_stride >= 3);\n\t\t\treturn spatialsort(instance.exports.meshopt_spatialSortRemap, positions, positions.length / positions_stride, positions_stride * 4);\n\t\t},\n\t\tencodeVertexBuffer: function(source, count, size) {\n\t\t\tassert(size > 0 && size <= 256);\n\t\t\tassert(size % 4 == 0);\n\t\t\tvar bound = instance.exports.meshopt_encodeVertexBufferBound(count, size);\n\t\t\treturn encode(instance.exports.meshopt_encodeVertexBuffer, bound, source, count, size);\n\t\t},\n\t\tencodeIndexBuffer: function(source, count, size) {\n\t\t\tassert(size == 2 || size == 4);\n\t\t\tassert(count % 3 == 0);\n\t\t\tvar indices = index32(source, size);\n\t\t\tvar bound = instance.exports.meshopt_encodeIndexBufferBound(count, maxindex(indices) + 1);\n\t\t\treturn encode(instance.exports.meshopt_encodeIndexBuffer, bound, indices, count, 4);\n\t\t},\n\t\tencodeIndexSequence: function(source, count, size) {\n\t\t\tassert(size == 2 || size == 4);\n\t\t\tvar indices = index32(source, size);\n\t\t\tvar bound = instance.exports.meshopt_encodeIndexSequenceBound(count, maxindex(indices) + 1);\n\t\t\treturn encode(instance.exports.meshopt_encodeIndexSequence, bound, indices, count, 4);\n\t\t},\n\t\tencodeGltfBuffer: function(source, count, size, mode) {\n\t\t\tvar table = {\n\t\t\t\tATTRIBUTES: this.encodeVertexBuffer,\n\t\t\t\tTRIANGLES: this.encodeIndexBuffer,\n\t\t\t\tINDICES: this.encodeIndexSequence,\n\t\t\t};\n\t\t\tassert(table[mode]);\n\t\t\treturn table[mode](source, count, size);\n\t\t},\n\t\tencodeFilterOct: function(source, count, stride, bits) {\n\t\t\tassert(stride == 4 || stride == 8);\n\t\t\tassert(bits >= 1 && bits <= 16);\n\t\t\treturn filter(instance.exports.meshopt_encodeFilterOct, source, count, stride, bits, 16);\n\t\t},\n\t\tencodeFilterQuat: function(source, count, stride, bits) {\n\t\t\tassert(stride == 8);\n\t\t\tassert(bits >= 4 && bits <= 16);\n\t\t\treturn filter(instance.exports.meshopt_encodeFilterQuat, source, count, stride, bits, 16);\n\t\t},\n\t\tencodeFilterExp: function(source, count, stride, bits, mode) {\n\t\t\tassert(stride > 0 && stride % 4 == 0);\n\t\t\tassert(bits >= 1 && bits <= 24);\n\t\t\tvar table = {\n\t\t\t\tSeparate: 0,\n\t\t\t\tSharedVector: 1,\n\t\t\t\tSharedComponent: 2,\n\t\t\t};\n\t\t\treturn filter(instance.exports.meshopt_encodeFilterExp, source, count, stride, bits, stride, mode ? table[mode] : 1);\n\t\t},\n\t};\n})();\n\nexport { MeshoptEncoder };\n","// This file is part of meshoptimizer library and is distributed under the terms of MIT License.\n// Copyright (C) 2016-2023, by Arseny Kapoulkine (arseny.kapoulkine@gmail.com)\nvar MeshoptDecoder = (function() {\n\t// Built with clang version 16.0.0\n\t// Built from meshoptimizer 0.20\n\tvar wasm_base = \"b9H79Tebbbe8Fv9Gbb9Gvuuuuueu9Giuuub9Geueu9Giuuueuikqbeeedddillviebeoweuec:q;iekr;leDo9TW9T9VV95dbH9F9F939H79T9F9J9H229F9Jt9VV7bb8A9TW79O9V9Wt9F9KW9J9V9KW9wWVtW949c919M9MWVbeY9TW79O9V9Wt9F9KW9J9V9KW69U9KW949c919M9MWVbdE9TW79O9V9Wt9F9KW9J9V9KW69U9KW949tWG91W9U9JWbiL9TW79O9V9Wt9F9KW9J9V9KWS9P2tWV9p9JtblK9TW79O9V9Wt9F9KW9J9V9KWS9P2tWV9r919HtbvL9TW79O9V9Wt9F9KW9J9V9KWS9P2tWVT949Wbol79IV9Rbrq;d8Yqdbk:yzeHu8Jjjjjbcj;eb9Rgv8Kjjjjbc9:hodnadcefal0mbcuhoaiRbbc:Ge9hmbavaialfgrad9Radz1jjjbhwcj;abad9UhlaicefhodnadTmbalc;WFbGglcjdalcjd6EhDcbhqinaqae9pmeaDaeaq9RaqaDfae6Egkcsfglcl4cifcd4hxdndndndnalc9WGgmTmbcbhPcehsawcjdfhzaohHinaraH9Rax6midnaraHaxfgo9RcK6mbczhlcbhOinalgic9WfgAawcj;cbffhldndndndndnaHaAco4fRbbaOcoG4ciGPlbedibkal9cb83ibalcwf9cb83ibxikalaoRblaoRbbgAco4gCaCciSgCE86bbawcj;cbfaifglcGfaoclfaCfgCRbbaAcl4ciGgXaXciSgXE86bbalcVfaCaXfgCRbbaAcd4ciGgXaXciSgXE86bbalc7faCaXfgCRbbaAciGgAaAciSgAE86bbalctfaCaAfgCRbbaoRbegAco4gXaXciSgXE86bbalc91faCaXfgCRbbaAcl4ciGgXaXciSgXE86bbalc4faCaXfgCRbbaAcd4ciGgXaXciSgXE86bbalc93faCaXfgCRbbaAciGgAaAciSgAE86bbalc94faCaAfgCRbbaoRbdgAco4gXaXciSgXE86bbalc95faCaXfgCRbbaAcl4ciGgXaXciSgXE86bbalc96faCaXfgCRbbaAcd4ciGgXaXciSgXE86bbalc97faCaXfgCRbbaAciGgAaAciSgAE86bbalc98faCaAfgARbbaoRbigoco4gCaCciSgCE86bbalc99faAaCfgARbbaocl4ciGgCaCciSgCE86bbalc9:faAaCfgARbbaocd4ciGgCaCciSgCE86bbalcufaAaCfglRbbaociGgoaociSgoE86bbalaofhoxdkalaoRbwaoRbbgAcl4gCaCcsSgCE86bbawcj;cbfaifglcGfaocwfaCfgCRbbaAcsGgAaAcsSgAE86bbalcVfaCaAfgARbbaoRbegCcl4gXaXcsSgXE86bbalc7faAaXfgARbbaCcsGgCaCcsSgCE86bbalctfaAaCfgARbbaoRbdgCcl4gXaXcsSgXE86bbalc91faAaXfgARbbaCcsGgCaCcsSgCE86bbalc4faAaCfgARbbaoRbigCcl4gXaXcsSgXE86bbalc93faAaXfgARbbaCcsGgCaCcsSgCE86bbalc94faAaCfgARbbaoRblgCcl4gXaXcsSgXE86bbalc95faAaXfgARbbaCcsGgCaCcsSgCE86bbalc96faAaCfgARbbaoRbvgCcl4gXaXcsSgXE86bbalc97faAaXfgARbbaCcsGgCaCcsSgCE86bbalc98faAaCfgARbbaoRbogCcl4gXaXcsSgXE86bbalc99faAaXfgARbbaCcsGgCaCcsSgCE86bbalc9:faAaCfgARbbaoRbrgocl4gCaCcsSgCE86bbalcufaAaCfglRbbaocsGgoaocsSgoE86bbalaofhoxekalao8Pbb83bbalcwfaocwf8Pbb83bbaoczfhokdnaiam9pmbaOcdfhOaiczfhlarao9RcL0mekkaiam6miaoTmidnakTmbawaPfRbbhOawcj;cbfhlazhiakhAinaialRbbgHce4cbaHceG9R7aOfgO86bbaiadfhialcefhlaAcufgAmbkkazcefhzaPcefgPad6hsaohHaPad9hmexvkkcbhoasceGmdxikaoaxad2fhXdnakTmbcbhmcehsawcjdfhCinarao9Rax6miaoTmdaoaxfhoawamfRbbhOawcj;cbfhlaChiakhAinaialRbbgHce4cbaHceG9R7aOfgO86bbaiadfhialcefhlaAcufgAmbkaCcefhCamcefgmad6hsamad9hmbkaXhoxikcbhlcehsinarao9Rax6mdaoTmeaoaxfhoalcefglad6hsadal9hmbkaXhoxdkcbhoasceGTmekc9:hoxikabaqad2fawcjdfakad2z1jjjb8Aawawcjdfakcufad2fadz1jjjb8Aakaqfhqaombkc9:hoxekcbc99arao9Radcaadca0ESEhokavcj;ebf8Kjjjjbaok;xzeHu8Jjjjjbc;ae9Rgv8Kjjjjbc9:hodnaeci9UgrcHfal0mbcuhoaiRbbgwc;WeGc;Ge9hmbawcsGgDce0mbavc;abfcFecjez:jjjjb8AavcUf9cu83ibavc8Wf9cu83ibavcyf9cu83ibavcaf9cu83ibavcKf9cu83ibavczf9cu83ibav9cu83iwav9cu83ibaialfc9WfhqaicefgwarfhodnaeTmbcmcsaDceSEhkcbhxcbhmcbhrcbhicbhlindnaoaq9nmbc9:hoxikdndnawRbbgDc;Ve0mbavc;abfalaDcu7gPcl4fcsGcitfgsydlhzasydbhHdnaDcsGgDak9pmbavaiaPfcsGcdtfydbaxaDEhsaDThDdndnadcd9hmbabarcetfgPaH87ebaPcdfaz87ebaPclfas87ebxekabarcdtfgPaHBdbaPclfazBdbaPcwfasBdbkaxaDfhxavc;abfalcitfgPasBdbaPazBdlavaicdtfasBdbavc;abfalcefcsGglcitfgPaHBdbaPasBdlaiaDfhialcefhlxdkdndnaDcsSmbamaDfaDc987fcefhmxekaocefhDao8SbbgscFeGhPdndnascu9mmbaDhoxekaocvfhoaPcFbGhPcrhsdninaD8SbbgOcFbGastaPVhPaOcu9kmeaDcefhDascrfgsc8J9hmbxdkkaDcefhokaPce4cbaPceG9R7amfhmkdndnadcd9hmbabarcetfgDaH87ebaDcdfaz87ebaDclfam87ebxekabarcdtfgDaHBdbaDclfazBdbaDcwfamBdbkavc;abfalcitfgDamBdbaDazBdlavaicdtfamBdbavc;abfalcefcsGglcitfgDaHBdbaDamBdlaicefhialcefhlxekdnaDcpe0mbaxcefgOavaiaqaDcsGfRbbgscl49RcsGcdtfydbascz6gPEhDavaias9RcsGcdtfydbaOaPfgzascsGgOEhsaOThOdndnadcd9hmbabarcetfgHax87ebaHcdfaD87ebaHclfas87ebxekabarcdtfgHaxBdbaHclfaDBdbaHcwfasBdbkavaicdtfaxBdbavc;abfalcitfgHaDBdbaHaxBdlavaicefgicsGcdtfaDBdbavc;abfalcefcsGcitfgHasBdbaHaDBdlavaiaPfcsGgicdtfasBdbavc;abfalcdfcsGglcitfgDaxBdbaDasBdlalcefhlaiaOfhiazaOfhxxekaxcbaoRbbgHEgAaDc;:eSgDfhzaHcsGhCaHcl4hXdndnaHcs0mbazcefhOxekazhOavaiaX9RcsGcdtfydbhzkdndnaCmbaOcefhxxekaOhxavaiaH9RcsGcdtfydbhOkdndnaDTmbaocefhDxekaocdfhDao8SbegPcFeGhsdnaPcu9kmbaocofhAascFbGhscrhodninaD8SbbgPcFbGaotasVhsaPcu9kmeaDcefhDaocrfgoc8J9hmbkaAhDxekaDcefhDkasce4cbasceG9R7amfgmhAkdndnaXcsSmbaDhsxekaDcefhsaD8SbbgocFeGhPdnaocu9kmbaDcvfhzaPcFbGhPcrhodninas8SbbgDcFbGaotaPVhPaDcu9kmeascefhsaocrfgoc8J9hmbkazhsxekascefhskaPce4cbaPceG9R7amfgmhzkdndnaCcsSmbashoxekascefhoas8SbbgDcFeGhPdnaDcu9kmbascvfhOaPcFbGhPcrhDdninao8SbbgscFbGaDtaPVhPascu9kmeaocefhoaDcrfgDc8J9hmbkaOhoxekaocefhokaPce4cbaPceG9R7amfgmhOkdndnadcd9hmbabarcetfgDaA87ebaDcdfaz87ebaDclfaO87ebxekabarcdtfgDaABdbaDclfazBdbaDcwfaOBdbkavc;abfalcitfgDazBdbaDaABdlavaicdtfaABdbavc;abfalcefcsGcitfgDaOBdbaDazBdlavaicefgicsGcdtfazBdbavc;abfalcdfcsGcitfgDaABdbaDaOBdlavaiaHcz6aXcsSVfgicsGcdtfaOBdbaiaCTaCcsSVfhialcifhlkawcefhwalcsGhlaicsGhiarcifgrae6mbkkcbc99aoaqSEhokavc;aef8Kjjjjbaok:flevu8Jjjjjbcz9Rhvc9:hodnaecvfal0mbcuhoaiRbbc;:eGc;qe9hmbav9cb83iwaicefhraialfc98fhwdnaeTmbdnadcdSmbcbhDindnaraw6mbc9:skarcefhoar8SbbglcFeGhidndnalcu9mmbaohrxekarcvfhraicFbGhicrhldninao8SbbgdcFbGaltaiVhiadcu9kmeaocefhoalcrfglc8J9hmbxdkkaocefhrkabaDcdtfaic8Etc8F91aicd47avcwfaiceGcdtVgoydbfglBdbaoalBdbaDcefgDae9hmbxdkkcbhDindnaraw6mbc9:skarcefhoar8SbbglcFeGhidndnalcu9mmbaohrxekarcvfhraicFbGhicrhldninao8SbbgdcFbGaltaiVhiadcu9kmeaocefhoalcrfglc8J9hmbxdkkaocefhrkabaDcetfaic8Etc8F91aicd47avcwfaiceGcdtVgoydbfgl87ebaoalBdbaDcefgDae9hmbkkcbc99arawSEhokaok:Lvoeue99dud99eud99dndnadcl9hmbaeTmeindndnabcdfgd8Sbb:Yab8Sbbgi:Ygl:l:tabcefgv8Sbbgo:Ygr:l:tgwJbb;:9cawawNJbbbbawawJbbbb9GgDEgq:mgkaqaicb9iEalMgwawNakaqaocb9iEarMgqaqNMM:r:vglNJbbbZJbbb:;aDEMgr:lJbbb9p9DTmbar:Ohixekcjjjj94hikadai86bbdndnaqalNJbbbZJbbb:;aqJbbbb9GEMgq:lJbbb9p9DTmbaq:Ohdxekcjjjj94hdkavad86bbdndnawalNJbbbZJbbb:;awJbbbb9GEMgw:lJbbb9p9DTmbaw:Ohdxekcjjjj94hdkabad86bbabclfhbaecufgembxdkkaeTmbindndnabclfgd8Ueb:Yab8Uebgi:Ygl:l:tabcdfgv8Uebgo:Ygr:l:tgwJb;:FSawawNJbbbbawawJbbbb9GgDEgq:mgkaqaicb9iEalMgwawNakaqaocb9iEarMgqaqNMM:r:vglNJbbbZJbbb:;aDEMgr:lJbbb9p9DTmbar:Ohixekcjjjj94hikadai87ebdndnaqalNJbbbZJbbb:;aqJbbbb9GEMgq:lJbbb9p9DTmbaq:Ohdxekcjjjj94hdkavad87ebdndnawalNJbbbZJbbb:;awJbbbb9GEMgw:lJbbb9p9DTmbaw:Ohdxekcjjjj94hdkabad87ebabcwfhbaecufgembkkk;siliui99iue99dnaeTmbcbhiabhlindndnJ;Zl81Zalcof8UebgvciV:Y:vgoal8Ueb:YNgrJb;:FSNJbbbZJbbb:;arJbbbb9GEMgw:lJbbb9p9DTmbaw:OhDxekcjjjj94hDkalclf8Uebhqalcdf8UebhkabaiavcefciGfcetfaD87ebdndnaoak:YNgwJb;:FSNJbbbZJbbb:;awJbbbb9GEMgx:lJbbb9p9DTmbax:Ohkxekcjjjj94hkkabaiavcdfciGfcetfak87ebdndnaoaq:YNgoJb;:FSNJbbbZJbbb:;aoJbbbb9GEMgx:lJbbb9p9DTmbax:Ohqxekcjjjj94hqkabaiavcufciGfcetfaq87ebdndnJbbjZararN:tawawN:taoaoN:tgrJbbbbarJbbbb9GE:rJb;:FSNJbbbZMgr:lJbbb9p9DTmbar:Ohqxekcjjjj94hqkabaiavciGfcetfaq87ebalcwfhlaiclfhiaecufgembkkk9mbdnadcd4ae2gdTmbinababydbgecwtcw91:Yaece91cjjj98Gcjjj;8if::NUdbabclfhbadcufgdmbkkk9teiucbcbydj1jjbgeabcifc98GfgbBdj1jjbdndnabZbcztgd9nmbcuhiabad9RcFFifcz4nbcuSmekaehikaik;LeeeudndnaeabVciGTmbabhixekdndnadcz9pmbabhixekabhiinaiaeydbBdbaiclfaeclfydbBdbaicwfaecwfydbBdbaicxfaecxfydbBdbaeczfheaiczfhiadc9Wfgdcs0mbkkadcl6mbinaiaeydbBdbaeclfheaiclfhiadc98fgdci0mbkkdnadTmbinaiaeRbb86bbaicefhiaecefheadcufgdmbkkabk;aeedudndnabciGTmbabhixekaecFeGc:b:c:ew2hldndnadcz9pmbabhixekabhiinaialBdbaicxfalBdbaicwfalBdbaiclfalBdbaiczfhiadc9Wfgdcs0mbkkadcl6mbinaialBdbaiclfhiadc98fgdci0mbkkdnadTmbinaiae86bbaicefhiadcufgdmbkkabkkkebcjwklz9Kbb\";\n\tvar wasm_simd = \"b9H79TebbbeKl9Gbb9Gvuuuuueu9Giuuub9Geueuikqbbebeedddilve9Weeeviebeoweuec:q;Aekr;leDo9TW9T9VV95dbH9F9F939H79T9F9J9H229F9Jt9VV7bb8A9TW79O9V9Wt9F9KW9J9V9KW9wWVtW949c919M9MWVbdY9TW79O9V9Wt9F9KW9J9V9KW69U9KW949c919M9MWVblE9TW79O9V9Wt9F9KW9J9V9KW69U9KW949tWG91W9U9JWbvL9TW79O9V9Wt9F9KW9J9V9KWS9P2tWV9p9JtboK9TW79O9V9Wt9F9KW9J9V9KWS9P2tWV9r919HtbrL9TW79O9V9Wt9F9KW9J9V9KWS9P2tWVT949Wbwl79IV9RbDq;b9tqlbzik9:evu8Jjjjjbcz9Rhbcbheincbhdcbhiinabcwfadfaicjuaead4ceGglE86bbaialfhiadcefgdcw9hmbkaec:q:yjjbfai86bbaecitc:q1jjbfab8Piw83ibaecefgecjd9hmbkk;e8JlHud97euo978Jjjjjbcj;kb9Rgv8Kjjjjbc9:hodnadcefal0mbcuhoaiRbbc:Ge9hmbavaialfgrad9Rad;8qbbcj;abad9UhoaicefhldnadTmbaoc;WFbGgocjdaocjd6EhwcbhDinaDae9pmeawaeaD9RaDawfae6Egqcsfgoc9WGgkci2hxakcethmaocl4cifcd4hPabaDad2fhscbhzdnincbhHalhOcbhAdninaraO9RaP6miavcj;cbfaAak2fhCaOaPfhlcbhidnakc;ab6mbaral9Rc;Gb6mbcbhoinaCaofhidndndndndnaOaoco4fRbbgXciGPlbedibkaipxbbbbbbbbbbbbbbbbpklbxikaialpbblalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLgQcdp:meaQpmbzeHdOiAlCvXoQrLpxiiiiiiiiiiiiiiiip9ogLpxiiiiiiiiiiiiiiiip8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklbalclfaYpQbfaKc:q:yjjbfRbbfhlxdkaialpbbwalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLpxssssssssssssssssp9ogLpxssssssssssssssssp8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklbalcwfaYpQbfaKc:q:yjjbfRbbfhlxekaialpbbbpklbalczfhlkdndndndndnaXcd4ciGPlbedibkaipxbbbbbbbbbbbbbbbbpklzxikaialpbblalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLgQcdp:meaQpmbzeHdOiAlCvXoQrLpxiiiiiiiiiiiiiiiip9ogLpxiiiiiiiiiiiiiiiip8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklzalclfaYpQbfaKc:q:yjjbfRbbfhlxdkaialpbbwalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLpxssssssssssssssssp9ogLpxssssssssssssssssp8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklzalcwfaYpQbfaKc:q:yjjbfRbbfhlxekaialpbbbpklzalczfhlkdndndndndnaXcl4ciGPlbedibkaipxbbbbbbbbbbbbbbbbpklaxikaialpbblalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLgQcdp:meaQpmbzeHdOiAlCvXoQrLpxiiiiiiiiiiiiiiiip9ogLpxiiiiiiiiiiiiiiiip8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklaalclfaYpQbfaKc:q:yjjbfRbbfhlxdkaialpbbwalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLpxssssssssssssssssp9ogLpxssssssssssssssssp8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklaalcwfaYpQbfaKc:q:yjjbfRbbfhlxekaialpbbbpklaalczfhlkdndndndndnaXco4Plbedibkaipxbbbbbbbbbbbbbbbbpkl8WxikaialpbblalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLgQcdp:meaQpmbzeHdOiAlCvXoQrLpxiiiiiiiiiiiiiiiip9ogLpxiiiiiiiiiiiiiiiip8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgXcitc:q1jjbfpbibaXc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgXcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spkl8WalclfaYpQbfaXc:q:yjjbfRbbfhlxdkaialpbbwalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLpxssssssssssssssssp9ogLpxssssssssssssssssp8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgXcitc:q1jjbfpbibaXc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgXcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spkl8WalcwfaYpQbfaXc:q:yjjbfRbbfhlxekaialpbbbpkl8Walczfhlkaoc;abfhiaocjefak0meaihoaral9Rc;Fb0mbkkdndnaiak9pmbaici4hoinaral9RcK6mdaCaifhXdndndndndnaOaico4fRbbaocoG4ciGPlbedibkaXpxbbbbbbbbbbbbbbbbpklbxikaXalpbblalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLgQcdp:meaQpmbzeHdOiAlCvXoQrLpxiiiiiiiiiiiiiiiip9ogLpxiiiiiiiiiiiiiiiip8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklbalclfaYpQbfaKc:q:yjjbfRbbfhlxdkaXalpbbwalpbbbgQclp:meaQpmbzeHdOiAlCvXoQrLpxssssssssssssssssp9ogLpxssssssssssssssssp8JgQp5b9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibaKc:q:yjjbfpbbbgYaYpmbbbbbbbbbbbbbbbbaQp5e9cjF;8;4;W;G;ab9:9cU1:NgKcitc:q1jjbfpbibp9UpmbedilvorzHOACXQLpPaLaQp9spklbalcwfaYpQbfaKc:q:yjjbfRbbfhlxekaXalpbbbpklbalczfhlkaocdfhoaiczfgiak6mbkkalTmbaAcd0hHalhOaAcefgAclSmdxekkcbhlaHceGTmdkdnakTmbavcjdfazfhiavazfpbdbhYcbhXinaiavcj;cbfaXfgopblbgLcep9TaLpxeeeeeeeeeeeeeeeegQp9op9Hp9rgLaoakfpblbg8Acep9Ta8AaQp9op9Hp9rg8ApmbzeHdOiAlCvXoQrLgEaoamfpblbg3cep9Ta3aQp9op9Hp9rg3aoaxfpblbg5cep9Ta5aQp9op9Hp9rg5pmbzeHdOiAlCvXoQrLg8EpmbezHdiOAlvCXorQLgQaQpmbedibedibedibediaYp9UgYp9AdbbaiadfgoaYaQaQpmlvorlvorlvorlvorp9UgYp9AdbbaoadfgoaYaQaQpmwDqkwDqkwDqkwDqkp9UgYp9AdbbaoadfgoaYaQaQpmxmPsxmPsxmPsxmPsp9UgYp9AdbbaoadfgoaYaEa8EpmwDKYqk8AExm35Ps8E8FgQaQpmbedibedibedibedip9UgYp9AdbbaoadfgoaYaQaQpmlvorlvorlvorlvorp9UgYp9AdbbaoadfgoaYaQaQpmwDqkwDqkwDqkwDqkp9UgYp9AdbbaoadfgoaYaQaQpmxmPsxmPsxmPsxmPsp9UgYp9AdbbaoadfgoaYaLa8ApmwKDYq8AkEx3m5P8Es8FgLa3a5pmwKDYq8AkEx3m5P8Es8Fg8ApmbezHdiOAlvCXorQLgQaQpmbedibedibedibedip9UgYp9AdbbaoadfgoaYaQaQpmlvorlvorlvorlvorp9UgYp9AdbbaoadfgoaYaQaQpmwDqkwDqkwDqkwDqkp9UgYp9AdbbaoadfgoaYaQaQpmxmPsxmPsxmPsxmPsp9UgYp9AdbbaoadfgoaYaLa8ApmwDKYqk8AExm35Ps8E8FgQaQpmbedibedibedibedip9UgYp9AdbbaoadfgoaYaQaQpmlvorlvorlvorlvorp9UgYp9AdbbaoadfgoaYaQaQpmwDqkwDqkwDqkwDqkp9UgYp9AdbbaoadfgoaYaQaQpmxmPsxmPsxmPsxmPsp9UgYp9AdbbaoadfhiaXczfgXak6mbkkazclfgzad6mbkasavcjdfaqad2;8qbbavavcjdfaqcufad2fad;8qbbaqaDfhDc9:hoalmexikkc9:hoxekcbc99aral9Radcaadca0ESEhokavcj;kbf8Kjjjjbaokwbz:bjjjbk;tzeHu8Jjjjjbc;ae9Rgv8Kjjjjbc9:hodnaeci9UgrcHfal0mbcuhoaiRbbgwc;WeGc;Ge9hmbawcsGgDce0mbavc;abfcFecje;8kbavcUf9cu83ibavc8Wf9cu83ibavcyf9cu83ibavcaf9cu83ibavcKf9cu83ibavczf9cu83ibav9cu83iwav9cu83ibaialfc9WfhqaicefgwarfhodnaeTmbcmcsaDceSEhkcbhxcbhmcbhrcbhicbhlindnaoaq9nmbc9:hoxikdndnawRbbgDc;Ve0mbavc;abfalaDcu7gPcl4fcsGcitfgsydlhzasydbhHdnaDcsGgDak9pmbavaiaPfcsGcdtfydbaxaDEhsaDThDdndnadcd9hmbabarcetfgPaH87ebaPcdfaz87ebaPclfas87ebxekabarcdtfgPaHBdbaPclfazBdbaPcwfasBdbkaxaDfhxavc;abfalcitfgPasBdbaPazBdlavaicdtfasBdbavc;abfalcefcsGglcitfgPaHBdbaPasBdlaiaDfhialcefhlxdkdndnaDcsSmbamaDfaDc987fcefhmxekaocefhDao8SbbgscFeGhPdndnascu9mmbaDhoxekaocvfhoaPcFbGhPcrhsdninaD8SbbgOcFbGastaPVhPaOcu9kmeaDcefhDascrfgsc8J9hmbxdkkaDcefhokaPce4cbaPceG9R7amfhmkdndnadcd9hmbabarcetfgDaH87ebaDcdfaz87ebaDclfam87ebxekabarcdtfgDaHBdbaDclfazBdbaDcwfamBdbkavc;abfalcitfgDamBdbaDazBdlavaicdtfamBdbavc;abfalcefcsGglcitfgDaHBdbaDamBdlaicefhialcefhlxekdnaDcpe0mbaxcefgOavaiaqaDcsGfRbbgscl49RcsGcdtfydbascz6gPEhDavaias9RcsGcdtfydbaOaPfgzascsGgOEhsaOThOdndnadcd9hmbabarcetfgHax87ebaHcdfaD87ebaHclfas87ebxekabarcdtfgHaxBdbaHclfaDBdbaHcwfasBdbkavaicdtfaxBdbavc;abfalcitfgHaDBdbaHaxBdlavaicefgicsGcdtfaDBdbavc;abfalcefcsGcitfgHasBdbaHaDBdlavaiaPfcsGgicdtfasBdbavc;abfalcdfcsGglcitfgDaxBdbaDasBdlalcefhlaiaOfhiazaOfhxxekaxcbaoRbbgHEgAaDc;:eSgDfhzaHcsGhCaHcl4hXdndnaHcs0mbazcefhOxekazhOavaiaX9RcsGcdtfydbhzkdndnaCmbaOcefhxxekaOhxavaiaH9RcsGcdtfydbhOkdndnaDTmbaocefhDxekaocdfhDao8SbegPcFeGhsdnaPcu9kmbaocofhAascFbGhscrhodninaD8SbbgPcFbGaotasVhsaPcu9kmeaDcefhDaocrfgoc8J9hmbkaAhDxekaDcefhDkasce4cbasceG9R7amfgmhAkdndnaXcsSmbaDhsxekaDcefhsaD8SbbgocFeGhPdnaocu9kmbaDcvfhzaPcFbGhPcrhodninas8SbbgDcFbGaotaPVhPaDcu9kmeascefhsaocrfgoc8J9hmbkazhsxekascefhskaPce4cbaPceG9R7amfgmhzkdndnaCcsSmbashoxekascefhoas8SbbgDcFeGhPdnaDcu9kmbascvfhOaPcFbGhPcrhDdninao8SbbgscFbGaDtaPVhPascu9kmeaocefhoaDcrfgDc8J9hmbkaOhoxekaocefhokaPce4cbaPceG9R7amfgmhOkdndnadcd9hmbabarcetfgDaA87ebaDcdfaz87ebaDclfaO87ebxekabarcdtfgDaABdbaDclfazBdbaDcwfaOBdbkavc;abfalcitfgDazBdbaDaABdlavaicdtfaABdbavc;abfalcefcsGcitfgDaOBdbaDazBdlavaicefgicsGcdtfazBdbavc;abfalcdfcsGcitfgDaABdbaDaOBdlavaiaHcz6aXcsSVfgicsGcdtfaOBdbaiaCTaCcsSVfhialcifhlkawcefhwalcsGhlaicsGhiarcifgrae6mbkkcbc99aoaqSEhokavc;aef8Kjjjjbaok:flevu8Jjjjjbcz9Rhvc9:hodnaecvfal0mbcuhoaiRbbc;:eGc;qe9hmbav9cb83iwaicefhraialfc98fhwdnaeTmbdnadcdSmbcbhDindnaraw6mbc9:skarcefhoar8SbbglcFeGhidndnalcu9mmbaohrxekarcvfhraicFbGhicrhldninao8SbbgdcFbGaltaiVhiadcu9kmeaocefhoalcrfglc8J9hmbxdkkaocefhrkabaDcdtfaic8Etc8F91aicd47avcwfaiceGcdtVgoydbfglBdbaoalBdbaDcefgDae9hmbxdkkcbhDindnaraw6mbc9:skarcefhoar8SbbglcFeGhidndnalcu9mmbaohrxekarcvfhraicFbGhicrhldninao8SbbgdcFbGaltaiVhiadcu9kmeaocefhoalcrfglc8J9hmbxdkkaocefhrkabaDcetfaic8Etc8F91aicd47avcwfaiceGcdtVgoydbfgl87ebaoalBdbaDcefgDae9hmbkkcbc99arawSEhokaok:wPliuo97eue978Jjjjjbca9Rhiaec98Ghldndnadcl9hmbdnalTmbcbhvabhdinadadpbbbgocKp:RecKp:Sep;6egraocwp:RecKp:Sep;6earp;Geaoczp:RecKp:Sep;6egwp;Gep;Kep;LegDpxbbbbbbbbbbbbbbbbp:2egqarpxbbbjbbbjbbbjbbbjgkp9op9rp;Kegrpxbb;:9cbb;:9cbb;:9cbb;:9cararp;MeaDaDp;Meawaqawakp9op9rp;Kegrarp;Mep;Kep;Kep;Jep;Negwp;Mepxbbn0bbn0bbn0bbn0gqp;KepxFbbbFbbbFbbbFbbbp9oaopxbbbFbbbFbbbFbbbFp9op9qarawp;Meaqp;Kecwp:RepxbFbbbFbbbFbbbFbbp9op9qaDawp;Meaqp;Keczp:RepxbbFbbbFbbbFbbbFbp9op9qpkbbadczfhdavclfgval6mbkkalae9pmeaipxbbbbbbbbbbbbbbbbgqpklbaiabalcdtfgdaeciGglcdtgv;8qbbdnalTmbaiaipblbgocKp:RecKp:Sep;6egraocwp:RecKp:Sep;6earp;Geaoczp:RecKp:Sep;6egwp;Gep;Kep;LegDaqp:2egqarpxbbbjbbbjbbbjbbbjgkp9op9rp;Kegrpxbb;:9cbb;:9cbb;:9cbb;:9cararp;MeaDaDp;Meawaqawakp9op9rp;Kegrarp;Mep;Kep;Kep;Jep;Negwp;Mepxbbn0bbn0bbn0bbn0gqp;KepxFbbbFbbbFbbbFbbbp9oaopxbbbFbbbFbbbFbbbFp9op9qarawp;Meaqp;Kecwp:RepxbFbbbFbbbFbbbFbbp9op9qaDawp;Meaqp;Keczp:RepxbbFbbbFbbbFbbbFbp9op9qpklbkadaiav;8qbbskdnalTmbcbhvabhdinadczfgxaxpbbbgopxbbbbbbFFbbbbbbFFgkp9oadpbbbgDaopmlvorxmPsCXQL358E8FpxFubbFubbFubbFubbp9op;6eaDaopmbediwDqkzHOAKY8AEgoczp:Sep;6egrp;Geaoczp:Reczp:Sep;6egwp;Gep;Kep;Legopxb;:FSb;:FSb;:FSb;:FSawaopxbbbbbbbbbbbbbbbbp:2egqawpxbbbjbbbjbbbjbbbjgmp9op9rp;Kegwawp;Meaoaop;Mearaqaramp9op9rp;Kegoaop;Mep;Kep;Kep;Jep;Negrp;Mepxbbn0bbn0bbn0bbn0gqp;Keczp:Reawarp;Meaqp;KepxFFbbFFbbFFbbFFbbp9op9qgwaoarp;Meaqp;KepxFFbbFFbbFFbbFFbbp9ogopmwDKYqk8AExm35Ps8E8Fp9qpkbbadaDakp9oawaopmbezHdiOAlvCXorQLp9qpkbbadcafhdavclfgval6mbkkalae9pmbaiaeciGgvcitgdfcbcaad9R;8kbaiabalcitfglad;8qbbdnavTmbaiaipblzgopxbbbbbbFFbbbbbbFFgkp9oaipblbgDaopmlvorxmPsCXQL358E8FpxFubbFubbFubbFubbp9op;6eaDaopmbediwDqkzHOAKY8AEgoczp:Sep;6egrp;Geaoczp:Reczp:Sep;6egwp;Gep;Kep;Legopxb;:FSb;:FSb;:FSb;:FSawaopxbbbbbbbbbbbbbbbbp:2egqawpxbbbjbbbjbbbjbbbjgmp9op9rp;Kegwawp;Meaoaop;Mearaqaramp9op9rp;Kegoaop;Mep;Kep;Kep;Jep;Negrp;Mepxbbn0bbn0bbn0bbn0gqp;Keczp:Reawarp;Meaqp;KepxFFbbFFbbFFbbFFbbp9op9qgwaoarp;Meaqp;KepxFFbbFFbbFFbbFFbbp9ogopmwDKYqk8AExm35Ps8E8Fp9qpklzaiaDakp9oawaopmbezHdiOAlvCXorQLp9qpklbkalaiad;8qbbkk;4wllue97euv978Jjjjjbc8W9Rhidnaec98GglTmbcbhvabhoinaiaopbbbgraoczfgwpbbbgDpmlvorxmPsCXQL358E8Fgqczp:Segkclp:RepklbaopxbbjZbbjZbbjZbbjZpx;Zl81Z;Zl81Z;Zl81Z;Zl81Zakpxibbbibbbibbbibbbp9qp;6ep;NegkaraDpmbediwDqkzHOAKY8AEgrczp:Reczp:Sep;6ep;MegDaDp;Meakarczp:Sep;6ep;Megxaxp;Meakaqczp:Reczp:Sep;6ep;Megqaqp;Mep;Kep;Kep;Lepxbbbbbbbbbbbbbbbbp:4ep;Jepxb;:FSb;:FSb;:FSb;:FSgkp;Mepxbbn0bbn0bbn0bbn0grp;KepxFFbbFFbbFFbbFFbbgmp9oaxakp;Mearp;Keczp:Rep9qgxaqakp;Mearp;Keczp:ReaDakp;Mearp;Keamp9op9qgkpmbezHdiOAlvCXorQLgrp5baipblbpEb:T:j83ibaocwfarp5eaipblbpEe:T:j83ibawaxakpmwDKYqk8AExm35Ps8E8Fgkp5baipblbpEd:T:j83ibaocKfakp5eaipblbpEi:T:j83ibaocafhoavclfgval6mbkkdnalae9pmbaiaeciGgvcitgofcbcaao9R;8kbaiabalcitfgwao;8qbbdnavTmbaiaipblbgraipblzgDpmlvorxmPsCXQL358E8Fgqczp:Segkclp:RepklaaipxbbjZbbjZbbjZbbjZpx;Zl81Z;Zl81Z;Zl81Z;Zl81Zakpxibbbibbbibbbibbbp9qp;6ep;NegkaraDpmbediwDqkzHOAKY8AEgrczp:Reczp:Sep;6ep;MegDaDp;Meakarczp:Sep;6ep;Megxaxp;Meakaqczp:Reczp:Sep;6ep;Megqaqp;Mep;Kep;Kep;Lepxbbbbbbbbbbbbbbbbp:4ep;Jepxb;:FSb;:FSb;:FSb;:FSgkp;Mepxbbn0bbn0bbn0bbn0grp;KepxFFbbFFbbFFbbFFbbgmp9oaxakp;Mearp;Keczp:Rep9qgxaqakp;Mearp;Keczp:ReaDakp;Mearp;Keamp9op9qgkpmbezHdiOAlvCXorQLgrp5baipblapEb:T:j83ibaiarp5eaipblapEe:T:j83iwaiaxakpmwDKYqk8AExm35Ps8E8Fgkp5baipblapEd:T:j83izaiakp5eaipblapEi:T:j83iKkawaiao;8qbbkk:Pddiue978Jjjjjbc;ab9Rhidnadcd4ae2glc98GgvTmbcbheabhdinadadpbbbgocwp:Recwp:Sep;6eaocep:SepxbbjFbbjFbbjFbbjFp9opxbbjZbbjZbbjZbbjZp:Uep;Mepkbbadczfhdaeclfgeav6mbkkdnaval9pmbaialciGgecdtgdVcbc;abad9R;8kbaiabavcdtfgvad;8qbbdnaeTmbaiaipblbgocwp:Recwp:Sep;6eaocep:SepxbbjFbbjFbbjFbbjFp9opxbbjZbbjZbbjZbbjZp:Uep;Mepklbkavaiad;8qbbkk9teiucbcbydj1jjbgeabcifc98GfgbBdj1jjbdndnabZbcztgd9nmbcuhiabad9RcFFifcz4nbcuSmekaehikaikkkebcjwklz9Tbb\";\n\n\tvar detector = new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,3,2,0,0,5,3,1,0,1,12,1,0,10,22,2,12,0,65,0,65,0,65,0,252,10,0,0,11,7,0,65,0,253,15,26,11]);\n\tvar wasmpack = new Uint8Array([32,0,65,2,1,106,34,33,3,128,11,4,13,64,6,253,10,7,15,116,127,5,8,12,40,16,19,54,20,9,27,255,113,17,42,67,24,23,146,148,18,14,22,45,70,69,56,114,101,21,25,63,75,136,108,28,118,29,73,115]);\n\n\tif (typeof WebAssembly !== 'object') {\n\t\treturn {\n\t\t\tsupported: false,\n\t\t};\n\t}\n\n\tvar wasm = WebAssembly.validate(detector) ? wasm_simd : wasm_base;\n\n\tvar instance;\n\n\tvar ready =\n\t\tWebAssembly.instantiate(unpack(wasm), {})\n\t\t.then(function(result) {\n\t\t\tinstance = result.instance;\n\t\t\tinstance.exports.__wasm_call_ctors();\n\t\t});\n\n\tfunction unpack(data) {\n\t\tvar result = new Uint8Array(data.length);\n\t\tfor (var i = 0; i < data.length; ++i) {\n\t\t\tvar ch = data.charCodeAt(i);\n\t\t\tresult[i] = ch > 96 ? ch - 97 : ch > 64 ? ch - 39 : ch + 4;\n\t\t}\n\t\tvar write = 0;\n\t\tfor (var i = 0; i < data.length; ++i) {\n\t\t\tresult[write++] = (result[i] < 60) ? wasmpack[result[i]] : (result[i] - 60) * 64 + result[++i];\n\t\t}\n\t\treturn result.buffer.slice(0, write);\n\t}\n\n\tfunction decode(instance, fun, target, count, size, source, filter) {\n\t\tvar sbrk = instance.exports.sbrk;\n\t\tvar count4 = (count + 3) & ~3;\n\t\tvar tp = sbrk(count4 * size);\n\t\tvar sp = sbrk(source.length);\n\t\tvar heap = new Uint8Array(instance.exports.memory.buffer);\n\t\theap.set(source, sp);\n\t\tvar res = fun(tp, count, size, sp, source.length);\n\t\tif (res == 0 && filter) {\n\t\t\tfilter(tp, count4, size);\n\t\t}\n\t\ttarget.set(heap.subarray(tp, tp + count * size));\n\t\tsbrk(tp - sbrk(0));\n\t\tif (res != 0) {\n\t\t\tthrow new Error(\"Malformed buffer data: \" + res);\n\t\t}\n\t}\n\n\tvar filters = {\n\t\tNONE: \"\",\n\t\tOCTAHEDRAL: \"meshopt_decodeFilterOct\",\n\t\tQUATERNION: \"meshopt_decodeFilterQuat\",\n\t\tEXPONENTIAL: \"meshopt_decodeFilterExp\",\n\t};\n\n\tvar decoders = {\n\t\tATTRIBUTES: \"meshopt_decodeVertexBuffer\",\n\t\tTRIANGLES: \"meshopt_decodeIndexBuffer\",\n\t\tINDICES: \"meshopt_decodeIndexSequence\",\n\t};\n\n\tvar workers = [];\n\tvar requestId = 0;\n\n\tfunction createWorker(url) {\n\t\tvar worker = {\n\t\t\tobject: new Worker(url),\n\t\t\tpending: 0,\n\t\t\trequests: {}\n\t\t};\n\n\t\tworker.object.onmessage = function(event) {\n\t\t\tvar data = event.data;\n\n\t\t\tworker.pending -= data.count;\n\t\t\tworker.requests[data.id][data.action](data.value);\n\t\t\tdelete worker.requests[data.id];\n\t\t};\n\n\t\treturn worker;\n\t}\n\n\tfunction initWorkers(count) {\n\t\tvar source =\n\t\t\t\"self.ready = WebAssembly.instantiate(new Uint8Array([\" + new Uint8Array(unpack(wasm)) + \"]), {})\" +\n\t\t\t\".then(function(result) { result.instance.exports.__wasm_call_ctors(); return result.instance; });\" +\n\t\t\t\"self.onmessage = \" + workerProcess.name + \";\" + decode.toString() + workerProcess.toString();\n\n\t\tvar blob = new Blob([source], {type: 'text/javascript'});\n\t\tvar url = URL.createObjectURL(blob);\n\n\t\tfor (var i = workers.length; i < count; ++i) {\n\t\t\tworkers[i] = createWorker(url);\n\t\t}\n\n\t\tfor (var i = count; i < workers.length; ++i) {\n\t\t\tworkers[i].object.postMessage({});\n\t\t}\n\n\t\tworkers.length = count;\n\n\t\tURL.revokeObjectURL(url);\n\t}\n\n\tfunction decodeWorker(count, size, source, mode, filter) {\n\t\tvar worker = workers[0];\n\n\t\tfor (var i = 1; i < workers.length; ++i) {\n\t\t\tif (workers[i].pending < worker.pending) {\n\t\t\t\tworker = workers[i];\n\t\t\t}\n\t\t}\n\n\t\treturn new Promise(function (resolve, reject) {\n\t\t\tvar data = new Uint8Array(source);\n\t\t\tvar id = ++requestId;\n\n\t\t\tworker.pending += count;\n\t\t\tworker.requests[id] = { resolve: resolve, reject: reject };\n\t\t\tworker.object.postMessage({ id: id, count: count, size: size, source: data, mode: mode, filter: filter }, [ data.buffer ]);\n\t\t});\n\t}\n\n\tfunction workerProcess(event) {\n\t\tvar data = event.data;\n\t\tif (!data.id) {\n\t\t\treturn self.close();\n\t\t}\n\t\tself.ready.then(function(instance) {\n\t\t\ttry {\n\t\t\t\tvar target = new Uint8Array(data.count * data.size);\n\t\t\t\tdecode(instance, instance.exports[data.mode], target, data.count, data.size, data.source, instance.exports[data.filter]);\n\t\t\t\tself.postMessage({ id: data.id, count: data.count, action: \"resolve\", value: target }, [ target.buffer ]);\n\t\t\t} catch (error) {\n\t\t\t\tself.postMessage({ id: data.id, count: data.count, action: \"reject\", value: error });\n\t\t\t}\n\t\t});\n\t}\n\n\treturn {\n\t\tready: ready,\n\t\tsupported: true,\n\t\tuseWorkers: function(count) {\n\t\t\tinitWorkers(count);\n\t\t},\n\t\tdecodeVertexBuffer: function(target, count, size, source, filter) {\n\t\t\tdecode(instance, instance.exports.meshopt_decodeVertexBuffer, target, count, size, source, instance.exports[filters[filter]]);\n\t\t},\n\t\tdecodeIndexBuffer: function(target, count, size, source) {\n\t\t\tdecode(instance, instance.exports.meshopt_decodeIndexBuffer, target, count, size, source);\n\t\t},\n\t\tdecodeIndexSequence: function(target, count, size, source) {\n\t\t\tdecode(instance, instance.exports.meshopt_decodeIndexSequence, target, count, size, source);\n\t\t},\n\t\tdecodeGltfBuffer: function(target, count, size, source, mode, filter) {\n\t\t\tdecode(instance, instance.exports[decoders[mode]], target, count, size, source, instance.exports[filters[filter]]);\n\t\t},\n\t\tdecodeGltfBufferAsync: function(count, size, source, mode, filter) {\n\t\t\tif (workers.length > 0) {\n\t\t\t\treturn decodeWorker(count, size, source, decoders[mode], filters[filter]);\n\t\t\t}\n\n\t\t\treturn ready.then(function() {\n\t\t\t\tvar target = new Uint8Array(count * size);\n\t\t\t\tdecode(instance, instance.exports[decoders[mode]], target, count, size, source, instance.exports[filters[filter]]);\n\t\t\t\treturn target;\n\t\t\t});\n\t\t}\n\t};\n})();\n\nexport { MeshoptDecoder };\n","// This file is part of meshoptimizer library and is distributed under the terms of MIT License.\n// Copyright (C) 2016-2023, by Arseny Kapoulkine (arseny.kapoulkine@gmail.com)\nvar MeshoptSimplifier = (function() {\n\t// Built with clang version 16.0.0\n\t// Built from meshoptimizer 0.20\n\tvar wasm = \"b9H79Tebbbe9Ek9Geueu9Geub9Gbb9GPuuuuuuuuuuu99uueu9Gvuuuuub9Gluuuub9Gquuuuuuu99uueu9Gwuuuuuu99ueu9Giuuue999Gluuuueu9GiuuueuizsdilvoirwDbqqbeqlve9Weiiviebeoweuec:G;jekr:Tewo9TW9T9VV95dbH9F9F939H79T9F9J9H229F9Jt9VV7bbz9TW79O9V9Wt9F79P9T9W29P9M95bl8E9TW79O9V9Wt9F79P9T9W29P9M959x9Pt9OcttV9P9I91tW7bvQ9TW79O9V9Wt9F79P9T9W29P9M959q9V9P9Ut7boX9TW79O9V9Wt9F79P9T9W29P9M959t9J9H2Wbra9TW79O9V9Wt9F9V9Wt9P9T9P96W9wWVtW94SWt9J9O9sW9T9H9Wbwl79IV9RbDDwebcekdxmq::9Usdbk;i6iKuY99Ou8Jjjjjbc;W;ab9RgP8KjjjjbaPcwfcbc;Kbz:ljjjb8AaPcualcefgscdtascFFFFi0Ecbyd1:jjjbHjjjjbbgzBdwaPceBd9OaPazBdbaPcuadcitadcFFFFe0Ecbyd1:jjjbHjjjjbbgHBdxaPcdBd9OaPaHBdlaPaeadalcbz:cjjjbaPcualcdtgOalcFFFFi0EgAcbyd1:jjjbHjjjjbbgCBdzaPciBd9OaPaAcbyd1:jjjbHjjjjbbgXBdCaPclBd9Oalcd4alfhQcehLinaLgscethLasaQ6mbkcbhKaPcuascdtgLascFFFFi0Ecbyd1:jjjbHjjjjbbgQBdKaPcvBd9OaQcFeaLz:ljjjbhYdnalTmbavcd4h8AascufhEinaiaKa8A2cdtfg3ydlgscH4as7c:F:b:DD2a3ydbgscH4as7c;D;O:B8J27a3ydwgscH4as7c:3F;N8N27hQcbhsdndninaYaQaEGgQcdtfg5ydbgLcuSmeaiaLa8A2cdtfa3cxz:ojjjbTmdascefgsaQfhQasaE9nmbxdkka5aKBdbaKhLkaCaKcdtfaLBdbaKcefgKal9hmbkcbhsaXhLinaLasBdbaLclfhLalascefgs9hmbkcbhsaChLaXhQindnasaLydbgESmbaQaXaEcdtfgEydbBdbaEasBdbkaLclfhLaQclfhQalascefgs9hmbkkcbh8EaYcbyd:m:jjjbH:bjjjbbaPclBd9OaPalcbyd1:jjjbHjjjjbbgEBdKaPcvBd9OaPaAcbyd1:jjjbHjjjjbbgsBd3aPcoBd9OaPaAcbyd1:jjjbHjjjjbbgLBdaaPcrBd9OascFeaOz:ljjjbh8FaLcFeaOz:ljjjbhadnalTmbaHcwfhhindnaza8EgQcefg8Ecdtfydbg3azaQcdtgsfydbgLSmba3aL9RhOaHaLcitfhgaaasfh8Ja8FasfhKcbh8Aindndnaga8Acitfydbg5aQ9hmbaKaQBdba8JaQBdbxekdnaza5cdtg8KfgsclfydbgLasydbgsSmbaHascitg3fydbaQSmeaLas9Rh8Lascu7aLfhYaha3fhLcbhsinaYasSmeascefhsaLydbh3aLcwfhLa3aQ9hmbkasa8L6mekaaa8KfgsaQa5asydbcuSEBdbaKa5aQaKydbcuSEBdbka8Acefg8AaO9hmbkka8Eal9hmbkaChLaXhQaah3a8Fh8AcbhsindndnasaLydbg59hmbdnasaQydbg59hmba8Aydbh5dna3ydbgYcu9hmba5cu9hmbaEasfcb86bbxikaEasfhKdnasaYSmbasa5SmbaKce86bbxikaKcl86bbxdkdnasaXa5cdtgYfydb9hmbdna3ydbgKcuSmbasaKSmba8AydbgOcuSmbasaOSmbaaaYfydbggcuSmbaga5Smba8FaYfydbgYcuSmbaYa5SmbdnaCaKcdtfydbaCaYcdtfydb9hmbaCaOcdtfydbaCagcdtfydb9hmbaEasfcd86bbxlkaEasfcl86bbxikaEasfcl86bbxdkaEasfcl86bbxekaEasfaEa5fRbb86bbkaLclfhLaQclfhQa3clfh3a8Aclfh8Aalascefgs9hmbkaxceGTmbaEhsalhLindnasRbbce9hmbascl86bbkascefhsaLcufgLmbkkcualcx2alc;v:Q;v:Qe0Ecbyd1:jjjbHjjjjbbh8JaPcwfaPyd9Ogscdtfa8JBdbaPascefgOBd9Oa8Jaialavz:djjjbdndnaDmbcbhvxekcbh5aPcwfaOcdtfcuaDal2gLcdtaLcFFFFi0Ecbyd1:jjjbHjjjjbbgvBdbaPascdfgOBd9OalTmbarcd4cdthYaDcdthKavh8AinaohsawhLa8AhQaDh3inaQasIdbaLIdbNUdbasclfhsaLclfhLaQclfhQa3cufg3mbkaoaYfhoa8AaKfh8Aa5cefg5al9hmbkkaPcwfaOcdtfcualc8S2gsalc;D;O;f8U0EgQcbyd1:jjjbHjjjjbbgLBdbaPaOcefg3Bd9OaLcbasz:ljjjbh8EdndndnaDTmbaPcwfa3cdtfaQcbyd1:jjjbHjjjjbbgoBdbaPaOcdfgLBd9Oaocbasz:ljjjb8AaPcwfaLcdtfcuaDal2gscltgLascFFFFb0Ecbyd1:jjjbHjjjjbbgwBdbaPaOcifBd9OawcbaLz:ljjjb8AadmexdkcbhocbhwadTmekcbh8AaehLindna8JaLclfydbg5cx2fgsIdba8JaLydbgYcx2fgQIdbg8M:tg8Na8JaLcwfydbgKcx2fg3IdlaQIdlgy:tg8PNa3Idba8M:tgIasIdlay:tg8RN:tg8Sa8SNa8Ra3IdwaQIdwgR:tg8UNa8PasIdwaR:tg8RN:tg8Pa8PNa8RaINa8Ua8NN:tg8Na8NNMM:rgIJbbbb9ETmba8SaI:vh8Sa8NaI:vh8Na8PaI:vh8Pka8EaCaYcdtfydbc8S2fgsa8PaI:rgIa8PNNg8RasIdbMUdbasa8NaIa8NNg8VNg8UasIdlMUdlasa8SaIa8SNg8WNg8XasIdwMUdwasa8Va8PNg8VasIdxMUdxasa8Wa8PNg8YasIdzMUdzasa8Wa8NNg8WasIdCMUdCasa8PaIa8SaRNa8Pa8MNaya8NNMM:mgyNg8MNg8PasIdKMUdKasa8Na8MNg8NasId3MUd3asa8Sa8MNg8SasIdaMUdaasa8MayNg8MasId8KMUd8KasaIasIdyMUdya8EaCa5cdtfydbc8S2fgsa8RasIdbMUdbasa8UasIdlMUdlasa8XasIdwMUdwasa8VasIdxMUdxasa8YasIdzMUdzasa8WasIdCMUdCasa8PasIdKMUdKasa8NasId3MUd3asa8SasIdaMUdaasa8MasId8KMUd8KasaIasIdyMUdya8EaCaKcdtfydbc8S2fgsa8RasIdbMUdbasa8UasIdlMUdlasa8XasIdwMUdwasa8VasIdxMUdxasa8YasIdzMUdzasa8WasIdCMUdCasa8PasIdKMUdKasa8NasId3MUd3asa8SasIdaMUdaasa8MasId8KMUd8KasaIasIdyMUdyaLcxfhLa8Acifg8Aad6mbkcbh5aehYincbhLinaEaeaLc:G1jjbfydba5fcdtfydbgQfRbbhsdndnaEaYaLfydbg3fRbbg8Ac99fcFeGcpe0mbasceSmbascd9hmekdna8AcufcFeGce0mba8Fa3cdtfydbaQ9hmekdnascufcFeGce0mbaaaQcdtfydba39hmekdna8Acv2asfc:W1jjbfRbbTmbaCaQcdtfydbaCa3cdtfydb0mekJbbacJbbjZasceSEhIa8AceShOa8JaeaLc:K1jjbfydba5fcdtfydbcx2fhsdna8JaQcx2fg8AIdwa8Ja3cx2fgKIdwgy:tg8Pa8PNa8AIdbaKIdbgR:tg8Na8NNa8AIdlaKIdlg8R:tg8Sa8SNMM:rg8MJbbbb9ETmba8Pa8M:vh8Pa8Sa8M:vh8Sa8Na8M:vh8NkJbbacaIaOEh8WdnasIdway:tgIa8PaIa8PNasIdbaR:tg8Xa8NNa8SasIdla8R:tg8VNMMg8UN:tgIaINa8Xa8Na8UN:tg8Pa8PNa8Va8Sa8UN:tg8Na8NNMM:rg8SJbbbb9ETmbaIa8S:vhIa8Na8S:vh8Na8Pa8S:vh8Pka8EaCa3cdtfydbc8S2fgsa8Pa8Wa8MNg8Sa8PNNg8UasIdbMUdbasa8Na8Sa8NNg8WNg8XasIdlMUdlasaIa8SaINg8MNg8VasIdwMUdwasa8Wa8PNg8WasIdxMUdxasa8Ma8PNg8YasIdzMUdzasa8Ma8NNg8ZasIdCMUdCasa8Pa8SaIayNa8PaRNa8Ra8NNMM:mgyNg8MNg8PasIdKMUdKasa8Na8MNg8NasId3MUd3asaIa8MNgIasIdaMUdaasa8MayNg8MasId8KMUd8Kasa8SasIdyMUdya8EaCaQcdtfydbc8S2fgsa8UasIdbMUdbasa8XasIdlMUdlasa8VasIdwMUdwasa8WasIdxMUdxasa8YasIdzMUdzasa8ZasIdCMUdCasa8PasIdKMUdKasa8NasId3MUd3asaIasIdaMUdaasa8MasId8KMUd8Kasa8SasIdyMUdykaLclfgLcx9hmbkaYcxfhYa5cifg5ad6mbkaDTmbcbhYinJbbbbhRa8JaeaYcdtfgsclfydbgKcx2fgLIdwa8JasydbgOcx2fgQIdwg8V:tg8Na8NNaLIdbaQIdbg8Y:tgIaINaLIdlaQIdlg8Z:tg8Sa8SNMMg8Wa8Jascwfydbggcx2fgsIdwa8V:tg8MNa8Na8Na8MNaIasIdba8Y:tgyNa8SasIdla8Z:tg8RNMMg8PN:tJbbbbJbbjZa8Wa8Ma8MNayayNa8Ra8RNMMg8XNa8Pa8PN:tg8U:va8UJbbbb9BEg8UNh80a8Xa8NNa8Ma8PN:ta8UNh81a8Wa8RNa8Sa8PN:ta8UNhBa8Xa8SNa8Ra8PN:ta8UNh83a8WayNaIa8PN:ta8UNhUa8XaINaya8PN:ta8UNh85aIa8RNaya8SN:tg8Pa8PNa8Sa8MNa8Ra8NN:tg8Pa8PNa8NayNa8MaIN:tg8Pa8PNMM:r:rh8PavaOaD2cdtfhLavagaD2cdtfhQavaKaD2cdtfh3a8V:mh86a8Z:mh87a8Y:mh88cbh8AaDh5Jbbbbh8RJbbbbh8UJbbbbh8WJbbbbh8XJbbbbh8VJbbbbh8YJbbbbh8ZJbbbbh89Jbbbbh8:inaPc;Wbfa8Afgscwfa8Pa81a3IdbaLIdbg8M:tg8SNa80aQIdba8M:tgyNMg8NNUdbasclfa8Pa83a8SNaBayNMgINUdbasa8Pa85a8SNaUayNMg8SNUdbascxfa8Pa86a8NNa87aINa8Ma88a8SNMMMg8MNUdba8Pa8NaINNa8XMh8Xa8Pa8Na8SNNa8VMh8Va8PaIa8SNNa8YMh8Ya8Pa8Ma8MNNaRMhRa8Pa8Na8MNNa8RMh8Ra8PaIa8MNNa8UMh8Ua8Pa8Sa8MNNa8WMh8Wa8Pa8Na8NNNa8ZMh8Za8PaIaINNa89Mh89a8Pa8Sa8SNNa8:Mh8:aLclfhLa3clfh3aQclfhQa8Aczfh8Aa5cufg5mbkaoaCaOcdtfydbgLc8S2fgsa8:asIdbMUdbasa89asIdlMUdlasa8ZasIdwMUdwasa8YasIdxMUdxasa8VasIdzMUdzasa8XasIdCMUdCasa8WasIdKMUdKasa8UasId3MUd3asa8RasIdaMUdaasaRasId8KMUd8Kasa8PasIdyMUdyaoaCaKcdtfydbgKc8S2fgsa8:asIdbMUdbasa89asIdlMUdlasa8ZasIdwMUdwasa8YasIdxMUdxasa8VasIdzMUdzasa8XasIdCMUdCasa8WasIdKMUdKasa8UasId3MUd3asa8RasIdaMUdaasaRasId8KMUd8Kasa8PasIdyMUdyaoaCagcdtfydbgOc8S2fgsa8:asIdbMUdbasa89asIdlMUdlasa8ZasIdwMUdwasa8YasIdxMUdxasa8VasIdzMUdzasa8XasIdCMUdCasa8WasIdKMUdKasa8UasId3MUd3asa8RasIdaMUdaasaRasId8KMUd8Kasa8PasIdyMUdyawaLaD2cltfh5cbhLaDh3ina5aLfgsaPc;WbfaLfgQIdbasIdbMUdbasclfg8AaQclfIdba8AIdbMUdbascwfg8AaQcwfIdba8AIdbMUdbascxfgsaQcxfIdbasIdbMUdbaLczfhLa3cufg3mbkawaKaD2cltfh5cbhLaDh3ina5aLfgsaPc;WbfaLfgQIdbasIdbMUdbasclfg8AaQclfIdba8AIdbMUdbascwfg8AaQcwfIdba8AIdbMUdbascxfgsaQcxfIdbasIdbMUdbaLczfhLa3cufg3mbkawaOaD2cltfh5cbhLaDh3ina5aLfgsaPc;WbfaLfgQIdbasIdbMUdbasclfg8AaQclfIdba8AIdbMUdbascwfg8AaQcwfIdba8AIdbMUdbascxfgsaQcxfIdbasIdbMUdbaLczfhLa3cufg3mbkaYcifgYad6mbkkdnabaeSmbabaeadcdtz:kjjjb8AkaPydbhZcbhsdnalTmbaZclfhsaZydbh3aEhLalh8AcbhQincbasydbg5a39RaLRbbcpeGEaQfhQaLcefhLasclfhsa5h3a8Acufg8AmbkaQce4hskcuadas9Rcifgrcx2arc;v:Q;v:Qe0Ecbyd1:jjjbHjjjjbbh8LaPcwfaPyd9Ogscdtfa8LBdbaPascefgLBd9OaPcwfaLcdtfcuarcdtarcFFFFi0Ecbyd1:jjjbHjjjjbbgxBdbaPascdfgLBd9OaPcwfaLcdtfaAcbyd1:jjjbHjjjjbbgHBdbaPascifgLBd9OaPcwfaLcdtfalcbyd1:jjjbHjjjjbbgnBdbaPasclfBd9OJbbbbh8Ydnadaq9nmbdnarci6mbakakNh8VaDclthca8Lcwfh9cJbbbbh8YinaPabadghalaCz:cjjjbabhOcbhzcbhKincbhsindnaCaOasfydbgQcdtgYfydbg8AaCabasc;m1jjbfydbaKfcdtfydbgLcdtfydbg5SmbaEaLfRbbgecv2aEaQfRbbg3fc;G1jjbfRbbg8Ka3cv2aefggc;G1jjbfRbbgiVcFeGTmbdnagc:W1jjbfRbbTmba5a8A0mekdna3ae9hmba3cufcFeGce0mba8FaYfydbaL9hmeka8Lazcx2fg3aLaQaicFeGg8AEBdla3aQaLa8AEBdba3a8Aa8KGcb9hBdwazcefhzkasclfgscx9hmbkdnaKcifgKah9pmbaOcxfhOazcifar9nmekkdnazmbahhdxikcbheinJbbbbJbbjZa8EaCa8Laecx2fg3ydlg8Aa3ydbg5a3ydwgLEgKcdtfydbg8Kc8S2gifgsIdyg8P:va8PJbbbb9BEasIdwa8Ja5a8AaLEgYcx2fgLIdwg8SNasIdzaLIdbg8MNasIdaMg8Pa8PMMa8SNasIdlaLIdlgyNasIdCa8SNasId3Mg8Pa8PMMayNasIdba8MNasIdxayNasIdKMg8Pa8PMMa8MNasId8KMMM:lNh8WJbbbbJbbjZa8EaCa5cdtfydbgdc8S2gQfgsIdyg8P:va8PJbbbb9BEasIdwa8Ja8Acx2fgLIdwgINasIdzaLIdbgRNasIdaMg8Pa8PMMaINasIdlaLIdlg8RNasIdCaINasId3Mg8Pa8PMMa8RNasIdbaRNasIdxa8RNasIdKMg8Pa8PMMaRNasId8KMMM:lNh8Xa3cwfhOa3clfhgdnaDTmbaoaQfgQIdwaINaQIdzaRNaQIdaMg8Pa8PMMaINaQIdla8RNaQIdCaINaQId3Mg8Pa8PMMa8RNaQIdbaRNaQIdxa8RNaQIdKMg8Pa8PMMaRNaQId8KMMMh8Nava8AaD2cdtfhLawadaD2cltfhsaQIdyh8UaDhQinaLIdbg8PJbbb;aNascxfIdbaIascwfIdbNaRasIdbNa8RasclfIdbNMMMNa8Pa8PNa8UNa8NMMh8NaLclfhLasczfhsaQcufgQmbkaoaifgQIdwa8SNaQIdza8MNaQIdaMg8Pa8PMMa8SNaQIdlayNaQIdCa8SNaQId3Mg8Pa8PMMayNaQIdba8MNaQIdxayNaQIdKMg8Pa8PMMa8MNaQId8KMMMhIavaYaD2cdtfhLawa8KaD2cltfhsaQIdyhRaDhQinaLIdbg8PJbbb;aNascxfIdba8SascwfIdbNa8MasIdbNayasclfIdbNMMMNa8Pa8PNaRNaIMMhIaLclfhLasczfhsaQcufgQmbka8WaI:lMh8Wa8Xa8N:lMh8Xkaga8AaYa8Xa8W9FgsEBdba3a5aKasEBdbaOa8Xa8WasEUdbaecefgeaz9hmbkaPc;Wbfcbcj;abz:ljjjb8Aa9chsazhLinaPc;WbfasydbcO4c;8ZGfgQaQydbcefBdbascxfhsaLcufgLmbkcbhscbhLinaPc;WbfasfgQydbh3aQaLBdba3aLfhLasclfgscj;ab9hmbkcbhsa9chLinaPc;WbfaLydbcO4c;8ZGfgQaQydbgQcefBdbaxaQcdtfasBdbaLcxfhLazascefgs9hmbkahaq9RgQci9UhJdnalTmbcbhsaHhLinaLasBdbaLclfhLalascefgs9hmbkkcbh9eancbalz:ljjjbhTaQcO9UhSaJce4h9haPydlh9icbhicbhgdnina8Laxagcdtfydbcx2fgOIdwg8Na8V9EmeaiaJ9pmeJFFuuh8Pdna9haz9pmba8Laxa9hcdtfydbcx2fIdwJbb;aZNh8Pkdna8Na8P9ETmbaiaS0mdkdnaTaCaOydlg6cdtg9kfydbg3fg0RbbaTaCaOydbgKcdtg9mfydbg9nfg9oRbbVmbdnaZa9ncdtfgsclfydbgLasydbgsSmbaLas9Rh5a9iascitfhsa8Ja3cx2fgYcwfhdaYclfhAa8Ja9ncx2fg8Kcwfh9pa8Kclfh9qcbhLcehednindnaHasydbcdtfydbgQa3SmbaHasclfydbcdtfydbg8Aa3SmbaQa8ASmba8Ja8Acx2fg8AIdba8JaQcx2fgQIdbgI:tg8Pa9qIdbaQIdlg8S:tg8MNa8KIdbaI:tgya8AIdla8S:tg8NN:ta8PaAIdba8S:tgRNaYIdbaI:tg8Ra8NN:tNa8Na9pIdbaQIdwg8S:tg8UNa8Ma8AIdwa8S:tgIN:ta8NadIdba8S:tg8SNaRaIN:tNaIayNa8Ua8PN:taIa8RNa8Sa8PN:tNMMJbbbb9FmdkascwfhsaLcefgLa56hea5aL9hmbkkaeceGTmba9hcefh9hxeka8Ea3c8S2gQfgsa8Ea9nc8S2g8AfgLIdbasIdbMUdbasaLIdlasIdlMUdlasaLIdwasIdwMUdwasaLIdxasIdxMUdxasaLIdzasIdzMUdzasaLIdCasIdCMUdCasaLIdKasIdKMUdKasaLId3asId3MUd3asaLIdaasIdaMUdaasaLId8KasId8KMUd8KasaLIdyasIdyMUdydnaDTmbaoaQfgsaoa8AfgLIdbasIdbMUdbasaLIdlasIdlMUdlasaLIdwasIdwMUdwasaLIdxasIdxMUdxasaLIdzasIdzMUdzasaLIdCasIdCMUdCasaLIdKasIdKMUdKasaLId3asId3MUd3asaLIdaasIdaMUdaasaLId8KasId8KMUd8KasaLIdyasIdyMUdyaca9n2heaca32hYawhLaDh8AinaLaYfgsaLaefgQIdbasIdbMUdbasclfg5aQclfIdba5IdbMUdbascwfg5aQcwfIdba5IdbMUdbascxfgsaQcxfIdbasIdbMUdbaLczfhLa8Acufg8AmbkkaOcwfhLdndndndnaEaKfgQRbbc9:fPdebdkaKhsinaHascdtgsfa3BdbaXasfydbgsaK9hmbxikkaXa9kfydbhsaXa9mfydbhKaHa9mfa6Bdbash6kaHaKcdtfa6Bdbka9oce86bba0ce86bbaLIdbg8Pa8Ya8Ya8P9DEh8Ya9ecefh9ececdaQRbbceSEaifhikagcefggaz9hmbkkdna9embahhdxikdnalTmbcbhLa8FhsindnasydbgQcuSmbdnaLaHaQcdtg3fydbgQ9hmba8Fa3fydbhQkasaQBdbkasclfhsalaLcefgL9hmbkcbhLaahsindnasydbgQcuSmbdnaLaHaQcdtg3fydbgQ9hmbaaa3fydbhQkasaQBdbkasclfhsalaLcefgL9hmbkkcbhdabhscbh8AindnaHasydbcdtfydbgLaHasclfydbcdtfydbgQSmbaLaHascwfydbcdtfydbg3SmbaQa3Smbabadcdtfg5aLBdba5clfaQBdba5cwfa3Bdbadcifhdkascxfhsa8Acifg8Aah6mbkadaq9nmdxbkkaPabadalaCz:cjjjbkdnamTmbama8Y:rUdbkaPyd9OgscdtaPcwffc98fhCdninasTmeaCydbcbyd:m:jjjbH:bjjjbbaCc98fhCascufhsxbkkaPc;W;abf8Kjjjjbadk;:ieouabydlhvabydbclfcbaicdtz:ljjjbhoadci9UhrdnadTmbdnalTmbaehwadhDinaoalawydbcdtfydbcdtfgqaqydbcefBdbawclfhwaDcufgDmbxdkkaehwadhDinaoawydbcdtfgqaqydbcefBdbawclfhwaDcufgDmbkkdnaiTmbcbhDaohwinawydbhqawaDBdbawclfhwaqaDfhDaicufgimbkkdnadci6mbarcearce0EhdinaecwfydbhwaeclfydbhDaeydbhidnalTmbalawcdtfydbhwalaDcdtfydbhDalaicdtfydbhikavaoaicdtfgqydbcitfaDBdbavaqydbcitfawBdlaqaqydbcefBdbavaoaDcdtfgqydbcitfawBdbavaqydbcitfaiBdlaqaqydbcefBdbavaoawcdtfgwydbcitfaiBdbavawydbcitfaDBdlawawydbcefBdbaecxfheadcufgdmbkkabydbcbBdbk:Zldouv998Jjjjjbca9Rglczfcwfcbyd11jjbBdbalcb8Pdj1jjb83izalcwfcbydN1jjbBdbalcb8Pd:m1jjb83ibdnadTmbaicd4hvdnabTmbavcdthocbhraehwinabarcx2fgiaearav2cdtfgDIdbUdbaiaDIdlUdlaiaDIdwUdwcbhiinalczfaifgDawaifIdbgqaDIdbgkakaq9EEUdbalaifgDaqaDIdbgkakaq9DEUdbaiclfgicx9hmbkawaofhwarcefgrad9hmbxdkkavcdthrcbhwincbhiinalczfaifgDaeaifIdbgqaDIdbgkakaq9EEUdbalaifgDaqaDIdbgkakaq9DEUdbaiclfgicx9hmbkaearfheawcefgwad9hmbkkdnabTmbadTmbJbbbbJbbjZalIdbalIdzgk:tJbbbb:xgqalIdlalIdCgx:tgmamaq9DEgqalIdwalIdKgm:tgPaPaq9DEgq:vaqJbbbb9BEhqinabaqabIdbak:tNUdbabclfgiaqaiIdbax:tNUdbabcwfgiaqaiIdbam:tNUdbabcxfhbadcufgdmbkkk8KbabaeadaialavcbcbcbcbaoarawaDz:bjjjbk8KbabaeadaialavaoarawaDaqakaxamz:bjjjbk;lOowud99wue99iul998Jjjjjbc;Wb9Rgw8KjjjjbdndnarmbcbhDxekawcwfcbc;Kbz:ljjjb8Aawcuadcx2adc;v:Q;v:Qe0Ecbyd1:jjjbHjjjjbbgqBdwawceBd9Oaqaeadaiz:djjjbawcuadcdtadcFFFFi0Egkcbyd1:jjjbHjjjjbbgxBdxawcdBd9Oadcd4adfhmceheinaegicetheaiam6mbkcbhmawcuaicdtgPaicFFFFi0Ecbyd1:jjjbHjjjjbbgsBdzawciBd9Odndnar:Zgz:rJbbbZMgH:lJbbb9p9DTmbaH:Ohexekcjjjj94hekaicufhOc:bwhAcbhCcbhXadhQinaChLaeaAgKcufaeaK9iEamgDcefaeaD9kEhYdndnadTmbaYcuf:YhHaqhiaxheadhmindndnaiIdbaHNJbbbZMg8A:lJbbb9p9DTmba8A:OhAxekcjjjj94hAkaAcCthAdndnaiclfIdbaHNJbbbZMg8A:lJbbb9p9DTmba8A:OhCxekcjjjj94hCkaCcqtaAVhAdndnaicwfIdbaHNJbbbZMg8A:lJbbb9p9DTmba8A:OhCxekcjjjj94hCkaeaAaCVBdbaicxfhiaeclfheamcufgmmbkascFeaPz:ljjjbhEcbh3cbh5indnaEaxa5cdtfydbgAcm4aA7c:v;t;h;Ev2gics4ai7aOGgmcdtfgCydbgecuSmbaeaASmbcehiinaEamaifaOGgmcdtfgCydbgecuSmeaicefhiaeaA9hmbkkaCaABdba3aecuSfh3a5cefg5ad9hmbxdkkascFeaPz:ljjjb8Acbh3kaDaYa3ar0giEhmaLa3aiEhCdna3arSmbaYaKaiEgAam9Rcd9imbdndnaXcl0mbdnaQ:ZgHaL:Zg8A:taY:Yg8EaD:Y:tg8Fa8EaK:Y:tgaa3:Zghaz:tNNNaHaz:taaNa8Aah:tNa8Aaz:ta8FNahaH:tNM:va8EMJbbbZMgH:lJbbb9p9DTmbaH:Ohexdkcjjjj94hexekamaAfcd9Theka3aQaiEhQaXcefgXcs9hmekkdndnaCmbcihicbhDxekcbhiawakcbyd1:jjjbHjjjjbbg5BdCawclBd9OdndnadTmbamcuf:YhHaqhiaxheadhmindndnaiIdbaHNJbbbZMg8A:lJbbb9p9DTmba8A:OhAxekcjjjj94hAkaAcCthAdndnaiclfIdbaHNJbbbZMg8A:lJbbb9p9DTmba8A:OhCxekcjjjj94hCkaCcqtaAVhAdndnaicwfIdbaHNJbbbZMg8A:lJbbb9p9DTmba8A:OhCxekcjjjj94hCkaeaAaCVBdbaicxfhiaeclfheamcufgmmbkascFeaPz:ljjjbhEcbhDcbh3inaxa3cdtgYfydbgAcm4aA7c:v;t;h;Ev2gics4ai7hecbhidndninaEaeaOGgmcdtfgCydbgecuSmednaxaecdtgCfydbaASmbaicefgiamfheaiaO9nmekka5aCfydbhixekaCa3BdbaDhiaDcefhDka5aYfaiBdba3cefg3ad9hmbkcuaDc32giaDc;j:KM;jb0EhexekascFeaPz:ljjjb8AcbhDcbhekawaecbyd1:jjjbHjjjjbbgeBdKawcvBd9Oaecbaiz:ljjjbhOavcd4hxdnadTmbaxcdth3a5hmalhAaqheadhEinaOamydbc32fgiaeIdbaiIdbMUdbaiaeclfIdbaiIdlMUdlaiaecwfIdbaiIdwMUdwaiaAc;81jjbalEgCIdbaiIdxMUdxaiaCIdlaiIdzMUdzaiaCIdwaiIdCMUdCaiaiIdKJbbjZMUdKamclfhmaAa3fhAaecxfheaEcufgEmbkkdnaDTmbaOcxfhiaDheinaictfgmamIdbJbbbbJbbjZaicxfIdbgH:vaHJbbbb9BEgHNUdbaic94fgmaHamIdbNUdbaic98fgmaHamIdbNUdbaiaHaiIdbNUdbaiclfgmaHamIdbNUdbaicwfgmaHamIdbNUdbaic3fhiaecufgembkkcbhAawcuaDcdtgYaDcFFFFi0Egicbyd1:jjjbHjjjjbbgeBd3awcoBd9Oawaicbyd1:jjjbHjjjjbbgEBdaaecFeaYz:ljjjbh3dnadTmbaoaoNh8Aaxcdthxalheina8Aaec;81jjbalEgmIdwaOa5ydbgCc32fgiIdC:tgHaHNamIdbaiIdx:tgHaHNamIdlaiIdz:tgHaHNMMNaqcwfIdbaiIdw:tgHaHNaqIdbaiIdb:tgHaHNaqclfIdbaiIdl:tgHaHNMMMhHdndna3aCcdtgifgmydbcuSmbaEaifIdbaH9ETmekamaABdbaEaifaHUdbka5clfh5aeaxfheaqcxfhqadaAcefgA9hmbkkaba3aYz:kjjjb8AcrhikaicdthiinaiTmeaic98fgiawcwffydbcbyd:m:jjjbH:bjjjbbxbkkawc;Wbf8KjjjjbaDk:Qdidui99ducbhi8Jjjjjbca9Rglczfcwfcbyd11jjbBdbalcb8Pdj1jjb83izalcwfcbydN1jjbBdbalcb8Pd:m1jjb83ibdndnaembJbbjFhvJbbjFhoJbbjFhrxekadcd4cdthwincbhdinalczfadfgDabadfIdbgoaDIdbgrarao9EEUdbaladfgDaoaDIdbgrarao9DEUdbadclfgdcx9hmbkabawfhbaicefgiae9hmbkalIdwalIdK:thralIdlalIdC:thoalIdbalIdz:thvkavJbbbb:xgvaoaoav9DEgoararao9DEk9DeeuabcFeaicdtz:ljjjbhlcbhbdnadTmbindnalaeydbcdtfgiydbcu9hmbaiabBdbabcefhbkaeclfheadcufgdmbkkabk9teiucbcbyd:q:jjjbgeabcifc98GfgbBd:q:jjjbdndnabZbcztgd9nmbcuhiabad9RcFFifcz4nbcuSmekaehikaik;LeeeudndnaeabVciGTmbabhixekdndnadcz9pmbabhixekabhiinaiaeydbBdbaiclfaeclfydbBdbaicwfaecwfydbBdbaicxfaecxfydbBdbaeczfheaiczfhiadc9Wfgdcs0mbkkadcl6mbinaiaeydbBdbaeclfheaiclfhiadc98fgdci0mbkkdnadTmbinaiaeRbb86bbaicefhiaecefheadcufgdmbkkabk;aeedudndnabciGTmbabhixekaecFeGc:b:c:ew2hldndnadcz9pmbabhixekabhiinaialBdbaicxfalBdbaicwfalBdbaiclfalBdbaiczfhiadc9Wfgdcs0mbkkadcl6mbinaialBdbaiclfhiadc98fgdci0mbkkdnadTmbinaiae86bbaicefhiadcufgdmbkkabk9teiucbcbyd:q:jjjbgeabcrfc94GfgbBd:q:jjjbdndnabZbcztgd9nmbcuhiabad9RcFFifcz4nbcuSmekaehikaik9:eiuZbhedndncbyd:q:jjjbgdaecztgi9nmbcuheadai9RcFFifcz4nbcuSmekadhekcbabae9Rcifc98Gcbyd:q:jjjbfgdBd:q:jjjbdnadZbcztge9nmbadae9RcFFifcz4nb8Akk6eiucbhidnadTmbdninabRbbglaeRbbgv9hmeaecefheabcefhbadcufgdmbxdkkalav9Rhikaikk:Iedbcjwk1eFFuuFFuuFFuuFFuFFFuFFFuFbbbbbbbbebbbdbbbbbbbebbbeeebeebebbeeebebbbbbebebbbbbebbbdbbbbbbbbbbbbbbbeeeeebebbbbbebbbbbeebbbbbbbbbbbbbbbbbbbbbc1Dkxebbbdbbb:G9Kbb\";\n\n\tvar wasmpack = new Uint8Array([32,0,65,2,1,106,34,33,3,128,11,4,13,64,6,253,10,7,15,116,127,5,8,12,40,16,19,54,20,9,27,255,113,17,42,67,24,23,146,148,18,14,22,45,70,69,56,114,101,21,25,63,75,136,108,28,118,29,73,115]);\n\n\tif (typeof WebAssembly !== 'object') {\n\t\treturn {\n\t\t\tsupported: false,\n\t\t};\n\t}\n\n\tvar instance;\n\n\tvar ready =\n\t\tWebAssembly.instantiate(unpack(wasm), {})\n\t\t.then(function(result) {\n\t\t\tinstance = result.instance;\n\t\t\tinstance.exports.__wasm_call_ctors();\n\t\t});\n\n\tfunction unpack(data) {\n\t\tvar result = new Uint8Array(data.length);\n\t\tfor (var i = 0; i < data.length; ++i) {\n\t\t\tvar ch = data.charCodeAt(i);\n\t\t\tresult[i] = ch > 96 ? ch - 97 : ch > 64 ? ch - 39 : ch + 4;\n\t\t}\n\t\tvar write = 0;\n\t\tfor (var i = 0; i < data.length; ++i) {\n\t\t\tresult[write++] = (result[i] < 60) ? wasmpack[result[i]] : (result[i] - 60) * 64 + result[++i];\n\t\t}\n\t\treturn result.buffer.slice(0, write);\n\t}\n\n\tfunction assert(cond) {\n\t\tif (!cond) {\n\t\t\tthrow new Error(\"Assertion failed\");\n\t\t}\n\t}\n\n\tfunction bytes(view) {\n\t\treturn new Uint8Array(view.buffer, view.byteOffset, view.byteLength);\n\t}\n\n\tfunction reorder(fun, indices, vertices) {\n\t\tvar sbrk = instance.exports.sbrk;\n\t\tvar ip = sbrk(indices.length * 4);\n\t\tvar rp = sbrk(vertices * 4);\n\t\tvar heap = new Uint8Array(instance.exports.memory.buffer);\n\t\tvar indices8 = bytes(indices);\n\t\theap.set(indices8, ip);\n\t\tvar unique = fun(rp, ip, indices.length, vertices);\n\t\t// heap may have grown\n\t\theap = new Uint8Array(instance.exports.memory.buffer);\n\t\tvar remap = new Uint32Array(vertices);\n\t\tnew Uint8Array(remap.buffer).set(heap.subarray(rp, rp + vertices * 4));\n\t\tindices8.set(heap.subarray(ip, ip + indices.length * 4));\n\t\tsbrk(ip - sbrk(0));\n\n\t\tfor (var i = 0; i < indices.length; ++i)\n\t\t\tindices[i] = remap[indices[i]];\n\n\t\treturn [remap, unique];\n\t}\n\n\tfunction maxindex(source) {\n\t\tvar result = 0;\n\t\tfor (var i = 0; i < source.length; ++i) {\n\t\t\tvar index = source[i];\n\t\t\tresult = result < index ? index : result;\n\t\t}\n\t\treturn result;\n\t}\n\n\tfunction simplify(fun, indices, index_count, vertex_positions, vertex_count, vertex_positions_stride, target_index_count, target_error, options) {\n\t\tvar sbrk = instance.exports.sbrk;\n\t\tvar te = sbrk(4);\n\t\tvar ti = sbrk(index_count * 4);\n\t\tvar sp = sbrk(vertex_count * vertex_positions_stride);\n\t\tvar si = sbrk(index_count * 4);\n\t\tvar heap = new Uint8Array(instance.exports.memory.buffer);\n\t\theap.set(bytes(vertex_positions), sp);\n\t\theap.set(bytes(indices), si);\n\t\tvar result = fun(ti, si, index_count, sp, vertex_count, vertex_positions_stride, target_index_count, target_error, options, te);\n\t\t// heap may have grown\n\t\theap = new Uint8Array(instance.exports.memory.buffer);\n\t\tvar target = new Uint32Array(result);\n\t\tbytes(target).set(heap.subarray(ti, ti + result * 4));\n\t\tvar error = new Float32Array(1);\n\t\tbytes(error).set(heap.subarray(te, te + 4));\n\t\tsbrk(te - sbrk(0));\n\t\treturn [target, error[0]];\n\t}\n\n\tfunction simplifyAttr(fun, indices, index_count, vertex_positions, vertex_count, vertex_positions_stride, vertex_attributes, vertex_attributes_stride, attribute_weights, target_index_count, target_error, options) {\n\t\tvar sbrk = instance.exports.sbrk;\n\t\tvar te = sbrk(4);\n\t\tvar ti = sbrk(index_count * 4);\n\t\tvar sp = sbrk(vertex_count * vertex_positions_stride);\n\t\tvar sa = sbrk(vertex_count * vertex_attributes_stride);\n\t\tvar sw = sbrk(attribute_weights.length * 4);\n\t\tvar si = sbrk(index_count * 4);\n\t\tvar heap = new Uint8Array(instance.exports.memory.buffer);\n\t\theap.set(bytes(vertex_positions), sp);\n\t\theap.set(bytes(vertex_attributes), sa);\n\t\theap.set(bytes(attribute_weights), sw);\n\t\theap.set(bytes(indices), si);\n\t\tvar result = fun(ti, si, index_count, sp, vertex_count, vertex_positions_stride, sa, vertex_attributes_stride, sw, attribute_weights.length, target_index_count, target_error, options, te);\n\t\t// heap may have grown\n\t\theap = new Uint8Array(instance.exports.memory.buffer);\n\t\tvar target = new Uint32Array(result);\n\t\tbytes(target).set(heap.subarray(ti, ti + result * 4));\n\t\tvar error = new Float32Array(1);\n\t\tbytes(error).set(heap.subarray(te, te + 4));\n\t\tsbrk(te - sbrk(0));\n\t\treturn [target, error[0]];\n\t}\n\n\tfunction simplifyScale(fun, vertex_positions, vertex_count, vertex_positions_stride) {\n\t\tvar sbrk = instance.exports.sbrk;\n\t\tvar sp = sbrk(vertex_count * vertex_positions_stride);\n\t\tvar heap = new Uint8Array(instance.exports.memory.buffer);\n\t\theap.set(bytes(vertex_positions), sp);\n\t\tvar result = fun(sp, vertex_count, vertex_positions_stride);\n\t\tsbrk(sp - sbrk(0));\n\t\treturn result;\n\t}\n\n\tfunction simplifyPoints(fun, vertex_positions, vertex_count, vertex_positions_stride, vertex_colors, vertex_colors_stride, color_weight, target_vertex_count) {\n\t\tvar sbrk = instance.exports.sbrk;\n\t\tvar ti = sbrk(target_vertex_count * 4);\n\t\tvar sp = sbrk(vertex_count * vertex_positions_stride);\n\t\tvar sc = sbrk(vertex_count * vertex_colors_stride);\n\t\tvar heap = new Uint8Array(instance.exports.memory.buffer);\n\t\theap.set(bytes(vertex_positions), sp);\n\t\tif (vertex_colors) {\n\t\t\theap.set(bytes(vertex_colors), sc);\n\t\t}\n\t\tvar result = fun(ti, sp, vertex_count, vertex_positions_stride, sc, vertex_colors_stride, color_weight, target_vertex_count);\n\t\t// heap may have grown\n\t\theap = new Uint8Array(instance.exports.memory.buffer);\n\t\tvar target = new Uint32Array(result);\n\t\tbytes(target).set(heap.subarray(ti, ti + result * 4));\n\t\tsbrk(ti - sbrk(0));\n\t\treturn target;\n\t}\n\n\tvar simplifyOptions = {\n\t\tLockBorder: 1,\n\t};\n\n\treturn {\n\t\tready: ready,\n\t\tsupported: true,\n\n\t\t// set this to true to be able to use simplifyPoints and simplifyWithAttributes\n\t\t// note that these functions are experimental and may change interface/behavior in a way that will require revising calling code\n\t\tuseExperimentalFeatures: false,\n\n\t\tcompactMesh: function(indices) {\n\t\t\tassert(indices instanceof Uint32Array || indices instanceof Int32Array || indices instanceof Uint16Array || indices instanceof Int16Array);\n\t\t\tassert(indices.length % 3 == 0);\n\n\t\t\tvar indices32 = indices.BYTES_PER_ELEMENT == 4 ? indices : new Uint32Array(indices);\n\t\t\treturn reorder(instance.exports.meshopt_optimizeVertexFetchRemap, indices32, maxindex(indices) + 1);\n\t\t},\n\n\t\tsimplify: function(indices, vertex_positions, vertex_positions_stride, target_index_count, target_error, flags) {\n\t\t\tassert(indices instanceof Uint32Array || indices instanceof Int32Array || indices instanceof Uint16Array || indices instanceof Int16Array);\n\t\t\tassert(indices.length % 3 == 0);\n\t\t\tassert(vertex_positions instanceof Float32Array);\n\t\t\tassert(vertex_positions.length % vertex_positions_stride == 0);\n\t\t\tassert(vertex_positions_stride >= 3);\n\t\t\tassert(target_index_count >= 0 && target_index_count <= indices.length);\n\t\t\tassert(target_index_count % 3 == 0);\n\t\t\tassert(target_error >= 0 && target_error <= 1);\n\n\t\t\tvar options = 0;\n\t\t\tfor (var i = 0; i < (flags ? flags.length : 0); ++i) {\n\t\t\t\toptions |= simplifyOptions[flags[i]];\n\t\t\t}\n\n\t\t\tvar indices32 = indices.BYTES_PER_ELEMENT == 4 ? indices : new Uint32Array(indices);\n\t\t\tvar result = simplify(instance.exports.meshopt_simplify, indices32, indices.length, vertex_positions, vertex_positions.length / vertex_positions_stride, vertex_positions_stride * 4, target_index_count, target_error, options);\n\t\t\tresult[0] = (indices instanceof Uint32Array) ? result[0] : new indices.constructor(result[0]);\n\n\t\t\treturn result;\n\t\t},\n\n\t\tsimplifyWithAttributes: function(indices, vertex_positions, vertex_positions_stride, vertex_attributes, vertex_attributes_stride, attribute_weights, target_index_count, target_error, flags) {\n\t\t\tassert(this.useExperimentalFeatures); // set useExperimentalFeatures to use this; note that this function is experimental and may change interface in a way that will require revising calling code\n\t\t\tassert(indices instanceof Uint32Array || indices instanceof Int32Array || indices instanceof Uint16Array || indices instanceof Int16Array);\n\t\t\tassert(indices.length % 3 == 0);\n\t\t\tassert(vertex_positions instanceof Float32Array);\n\t\t\tassert(vertex_positions.length % vertex_positions_stride == 0);\n\t\t\tassert(vertex_positions_stride >= 3);\n\t\t\tassert(vertex_attributes instanceof Float32Array);\n\t\t\tassert(vertex_attributes.length % vertex_attributes_stride == 0);\n\t\t\tassert(vertex_attributes_stride >= 0);\n\t\t\tassert(target_index_count >= 0 && target_index_count <= indices.length);\n\t\t\tassert(target_index_count % 3 == 0);\n\t\t\tassert(target_error >= 0 && target_error <= 1);\n\t\t\tassert(Array.isArray(attribute_weights));\n\t\t\tassert(vertex_attributes_stride >= attribute_weights.length);\n\t\t\tassert(attribute_weights.length <= 16);\n\n\t\t\tvar options = 0;\n\t\t\tfor (var i = 0; i < (flags ? flags.length : 0); ++i) {\n\t\t\t\toptions |= simplifyOptions[flags[i]];\n\t\t\t}\n\n\t\t\tvar indices32 = indices.BYTES_PER_ELEMENT == 4 ? indices : new Uint32Array(indices);\n\t\t\tvar result = simplifyAttr(instance.exports.meshopt_simplifyWithAttributes, indices32, indices.length, vertex_positions, vertex_positions.length / vertex_positions_stride, vertex_positions_stride * 4, vertex_attributes, vertex_attributes_stride * 4, new Float32Array(attribute_weights), target_index_count, target_error, options);\n\t\t\tresult[0] = (indices instanceof Uint32Array) ? result[0] : new indices.constructor(result[0]);\n\n\t\t\treturn result;\n\t\t},\n\n\t\tgetScale: function(vertex_positions, vertex_positions_stride) {\n\t\t\tassert(vertex_positions instanceof Float32Array);\n\t\t\tassert(vertex_positions.length % vertex_positions_stride == 0);\n\t\t\tassert(vertex_positions_stride >= 3);\n\t\t\treturn simplifyScale(instance.exports.meshopt_simplifyScale, vertex_positions, vertex_positions.length / vertex_positions_stride, vertex_positions_stride * 4);\n\t\t},\n\n\t\tsimplifyPoints: function(vertex_positions, vertex_positions_stride, target_vertex_count, vertex_colors, vertex_colors_stride, color_weight) {\n\t\t\tassert(this.useExperimentalFeatures); // set useExperimentalFeatures to use this; note that this function is experimental and may change interface in a way that will require revising calling code\n\t\t\tassert(vertex_positions instanceof Float32Array);\n\t\t\tassert(vertex_positions.length % vertex_positions_stride == 0);\n\t\t\tassert(vertex_positions_stride >= 3);\n\t\t\tassert(target_vertex_count >= 0 && target_vertex_count <= vertex_positions.length / vertex_positions_stride);\n\t\t\tif (vertex_colors) {\n\t\t\t\tassert(vertex_colors instanceof Float32Array);\n\t\t\t\tassert(vertex_colors.length % vertex_colors_stride == 0);\n\t\t\t\tassert(vertex_colors_stride >= 3);\n\t\t\t\tassert(vertex_positions.length / vertex_positions_stride == vertex_colors.length / vertex_colors_stride);\n\t\t\t\treturn simplifyPoints(instance.exports.meshopt_simplifyPoints, vertex_positions, vertex_positions.length / vertex_positions_stride, vertex_positions_stride * 4, vertex_colors, vertex_colors_stride * 4, color_weight, target_vertex_count);\n\t\t\t} else {\n\t\t\t\treturn simplifyPoints(instance.exports.meshopt_simplifyPoints, vertex_positions, vertex_positions.length / vertex_positions_stride, vertex_positions_stride * 4, undefined, 0, 0, target_vertex_count);\n\t\t\t}\n\t\t},\n\t};\n})();\n\nexport { MeshoptSimplifier };\n","import {Class, EntityComponentPlugin, IViewerPlugin, ThreeViewer, TObject3DComponent} from 'threepipe'\n\nexport type ScriptModule = Record<string, unknown>\n\nexport interface WalkedScriptExports {\n plugins: Array<{name: string, value: Class<IViewerPlugin>}>\n components: Array<{name: string, value: TObject3DComponent}>\n}\n\nexport function walkScriptExports(module: ScriptModule): WalkedScriptExports {\n const plugins: WalkedScriptExports['plugins'] = []\n const components: WalkedScriptExports['components'] = []\n for (const [name, value] of Object.entries(module)) {\n if (isPluginType(value)) plugins.push({name, value})\n if (isComponentType(value)) components.push({name, value})\n }\n return {plugins, components}\n}\n\n/** Register every plugin and Object3D component exported by project modules. */\nexport async function registerScripts(viewer: ThreeViewer, modules: Iterable<ScriptModule>): Promise<WalkedScriptExports> {\n const found: WalkedScriptExports = {plugins: [], components: []}\n const entityComponents = viewer.getPlugin(EntityComponentPlugin)\n if (!entityComponents) throw new Error('EntityComponentPlugin must be added before project scripts')\n\n for (const module of modules) {\n const walked = walkScriptExports(module)\n found.plugins.push(...walked.plugins)\n found.components.push(...walked.components)\n }\n for (const component of found.components) {\n const existing = entityComponents.componentTypes.get(component.value.ComponentType)\n if (existing !== component.value) {\n if (existing) entityComponents.removeComponentType(existing)\n await entityComponents.addComponentType(component.value)\n }\n }\n for (const plugin of found.plugins) {\n if (!viewer.getPlugin(plugin.value)) await viewer.addPlugin(plugin.value)\n }\n return found\n}\n\nexport function isPluginType(value: unknown): value is Class<IViewerPlugin> {\n return typeof value === 'function'\n && typeof (value as unknown as {PluginType?: unknown}).PluginType === 'string'\n}\n\nexport function isComponentType(value: unknown): value is TObject3DComponent {\n return typeof value === 'function'\n && typeof (value as unknown as {ComponentType?: unknown}).ComponentType === 'string'\n}\n","import {\n ComponentDefn,\n ComponentJSON,\n IObject3D,\n IObject3DEventMap,\n ISceneEventMap,\n literalStrings,\n Object3DComponent,\n Vector3,\n ViewerEventMap\n} from \"threepipe\"\n\nexport const uiPositionMode = ['world', 'screen', 'viewport'] as const\nexport type UiPositionMode = typeof uiPositionMode[number]\n\nexport class HtmlUiComponent extends Object3DComponent {\n static ComponentType = 'HtmlUiComponent'\n static StateProperties: ComponentDefn['StateProperties'] = [\n 'enabled',\n {\n key: 'htmlData',\n type: 'string',\n uiConfig: {\n multiline: true,\n rows: 5,\n autoResize: true,\n }\n },\n 'width',\n 'height',\n 'scrollable',\n 'interactable',\n {\n key: 'positionMode',\n type: literalStrings(uiPositionMode),\n },\n 'offsetX',\n 'offsetY',\n 'zIndex',\n 'visible',\n 'appendToBody'\n ]\n\n declare element: HTMLDivElement\n\n enabled = true\n\n // HTML content\n htmlData = '<div>Hello World</div>'\n\n // Size properties\n width = -1 // in pixels\n height = -1 // in pixels\n\n // Behavior properties\n scrollable = false\n interactable = true\n visible = true\n appendToBody = false // false = append to viewer.container (default), true = append to document.body\n\n // Position properties\n positionMode: UiPositionMode = 'world' // world follows 3D object, screen is fixed, viewport is relative to viewport\n offsetX = 0 // pixel offset from calculated position\n offsetY = 0 // pixel offset from calculated position\n zIndex = 1000 // CSS z-index\n\n private _worldPosition = new Vector3()\n private _animationFrameId?: number\n\n constructor() {\n super()\n\n this.onStateChange('htmlData', (v) => {\n if (!this.element) return\n this.element.innerHTML = v\n // this.object.setDirty?.({source: 'HtmlUiComponent'})\n })\n\n this.onStateChange('width', (v) => {\n if (!this.element) return\n this.element.style.width = v < 0 ? 'auto' : `${v}px`\n this.object.setDirty?.({source: 'HtmlUiComponent'})\n })\n\n this.onStateChange('height', (v) => {\n if (!this.element) return\n this.element.style.height = v < 0 ? 'auto' : `${v}px`\n this.object.setDirty?.({source: 'HtmlUiComponent'})\n })\n\n this.onStateChange('scrollable', (v) => {\n if (!this.element) return\n this.element.style.overflow = v ? 'auto' : 'hidden'\n this.object.setDirty?.({source: 'HtmlUiComponent'})\n })\n\n this.onStateChange('interactable', (v) => {\n if (!this.element) return\n this.element.style.pointerEvents = v ? 'auto' : 'none'\n this.object.setDirty?.({source: 'HtmlUiComponent'})\n })\n\n this.onStateChange('visible', (v) => {\n if (!this.element) return\n this.element.style.display = v ? 'block' : 'none'\n this.object.setDirty?.({source: 'HtmlUiComponent'})\n })\n\n this.onStateChange('positionMode', () => {\n if (!this.element) return\n this._updateElementPosition()\n this.object.setDirty?.({source: 'HtmlUiComponent'})\n })\n\n this.onStateChange('offsetX', () => {\n if (!this.element) return\n this._updateElementPosition()\n this.object.setDirty?.({source: 'HtmlUiComponent'})\n })\n\n this.onStateChange('offsetY', () => {\n if (!this.element) return\n this._updateElementPosition()\n this.object.setDirty?.({source: 'HtmlUiComponent'})\n })\n\n this.onStateChange('zIndex', (v) => {\n if (!this.element) return\n this.element.style.zIndex = `${v}`\n this.object.setDirty?.({source: 'HtmlUiComponent'})\n })\n\n this.onStateChange('appendToBody', (v) => {\n if (!this.element) return\n // Remove from current parent\n if (this.element.parentNode) {\n this.element.parentNode.removeChild(this.element)\n }\n // Append to new container\n const container = v ? document.body : (this.ctx?.viewer?.container || document.body)\n container.appendChild(this.element)\n this.object.setDirty?.({source: 'HtmlUiComponent'})\n })\n }\n\n private _objectUpdate = (e: IObject3DEventMap['objectUpdate'] | ISceneEventMap['mainCameraUpdate']) => {\n if (e.source === 'HtmlUiComponent') return\n const changeKey = e?.change ?? e?.key\n const update = !changeKey || changeKey === 'position' || changeKey === 'transform' || changeKey === 'quaternion' || changeKey === 'visible' || changeKey === 'controls'\n if (update && this.positionMode === 'world') {\n this._updateElementPosition()\n }\n }\n\n init(object: IObject3D, state: ComponentJSON['state']) {\n super.init(object, state)\n\n // Create the HTML element\n this.element = document.createElement('div')\n this.element.className = 'threepipe-html-ui'\n\n // Apply initial styles\n this.element.style.position = 'absolute'\n this.element.style.width = this.width < 0 ? 'auto' : `${this.width}px`\n this.element.style.height = this.height < 0 ? 'auto' : `${this.height}px`\n this.element.style.overflow = this.scrollable ? 'auto' : 'hidden'\n this.element.style.pointerEvents = this.interactable ? 'auto' : 'none'\n this.element.style.zIndex = `${this.zIndex}`\n this.element.style.display = this.visible ? 'block' : 'none'\n this.element.style.boxSizing = 'border-box'\n\n // Set HTML content\n this.element.innerHTML = this.htmlData\n\n // Add to document or viewer container\n const container = this.appendToBody ? document.body : (this.ctx?.viewer?.container || document.body)\n container.appendChild(this.element)\n\n // Listen for object updates\n object.addEventListener('objectUpdate', this._objectUpdate)\n this.ctx.viewer.scene.addEventListener('mainCameraUpdate', this._objectUpdate)\n\n // Start position tracking for world-positioned elements\n this._updateElementPosition()\n }\n\n destroy(): Record<string, any> {\n // Stop position tracking\n this._stopPositionTracking()\n\n // Remove event listener\n this.object.removeEventListener('objectUpdate', this._objectUpdate)\n this.ctx.viewer.scene.removeEventListener('mainCameraUpdate', this._objectUpdate)\n\n // Remove element from DOM\n if (this.element && this.element.parentNode) {\n this.element.parentNode.removeChild(this.element)\n }\n this.element = null as any\n\n return super.destroy()\n }\n\n private _stopPositionTracking() {\n if (this._animationFrameId !== undefined) {\n cancelAnimationFrame(this._animationFrameId)\n this._animationFrameId = undefined\n }\n }\n\n preFrame({resized}: ViewerEventMap[\"preFrame\"]): boolean | void {\n if(!this.element || !this.enabled) return\n // world - on camera change, canvas size change, object transform change\n // screen - no change\n // viewport - on canvas size change\n if(this.positionMode === 'screen') return\n if(!resized && this.positionMode === 'viewport') return\n if(!resized && this.positionMode === 'world') return // todo: tracked separately\n this._updateElementPosition()\n }\n\n private _updateElementPosition() {\n if (!this.element) return\n\n switch (this.positionMode) {\n case 'world':\n this._updateWorldPosition()\n break\n case 'screen':\n this._updateScreenPosition()\n break\n case 'viewport':\n this._updateViewportPosition()\n break\n }\n }\n\n private _updateWorldPosition() {\n // Get the world position of the object\n this.object.getWorldPosition(this._worldPosition)\n\n // Project to screen space\n const camera = this.ctx?.viewer?.scene?.mainCamera\n if (!camera) return\n\n const canvas = this.ctx?.viewer?.canvas\n if (!canvas) return\n\n // Clone position and project it\n const projected = this._worldPosition.clone()\n projected.project(camera)\n\n // Convert to screen coordinates\n const x = (projected.x * 0.5 + 0.5) * canvas.clientWidth\n const y = (projected.y * -0.5 + 0.5) * canvas.clientHeight\n\n // Apply position with offset\n this.element.style.left = `${x + this.offsetX}px`\n this.element.style.top = `${y + this.offsetY}px`\n this.element.style.transform = 'translate(-50%, -50%)' // Center on point\n }\n\n private _updateScreenPosition() {\n // Fixed screen position\n this.element.style.left = `${this.offsetX}px`\n this.element.style.top = `${this.offsetY}px`\n this.element.style.transform = 'none'\n }\n\n private _updateViewportPosition() {\n // Viewport-relative position (percentage-based)\n const canvas = this.ctx?.viewer?.canvas\n if (!canvas) return\n\n const x = (this.offsetX / 100) * canvas.clientWidth\n const y = (this.offsetY / 100) * canvas.clientHeight\n\n this.element.style.left = `${x}px`\n this.element.style.top = `${y}px`\n this.element.style.transform = 'none'\n }\n\n /**\n * Update the HTML content programmatically\n */\n setHtml(html: string) {\n this.htmlData = html\n }\n\n /**\n * Set the position\n */\n setPosition(x: number, y: number) {\n this.offsetX = x\n this.offsetY = y\n }\n\n /**\n * Set the size\n */\n setSize(width: number, height: number) {\n this.width = width\n this.height = height\n }\n\n /**\n * Show the element\n */\n show() {\n this.visible = true\n }\n\n /**\n * Hide the element\n */\n hide() {\n this.visible = false\n }\n}\n\n","// https://github.com/donmccurdy/three-to-cannon/blob/main/src/utils.ts\n\nimport { BufferAttribute, BufferGeometry, Mesh, Object3D, Quaternion, Vector3 } from 'threepipe';\n\nconst _v1 = new Vector3();\nconst _v2 = new Vector3();\nconst _q1 = new Quaternion();\n\n/**\n * Returns a single geometry for the given object. If the object is compound,\n * its geometries are automatically merged. Bake world scale into each\n * geometry, because we can't easily apply that to the cannonjs shapes later.\n */\nexport function getGeometry (object: Object3D): BufferGeometry | null {\n const meshes = getMeshes(object);\n if (meshes.length === 0) return null;\n\n // Single mesh. Return, preserving original type.\n if (meshes.length === 1) {\n return normalizeGeometry(meshes[0]);\n }\n\n // Multiple meshes. Merge and return.\n let mesh: Mesh | undefined;\n const geometries: BufferGeometry[] = [];\n while ((mesh = meshes.pop())) {\n geometries.push(simplifyGeometry(normalizeGeometry(mesh)));\n }\n\n return mergeBufferGeometries(geometries);\n}\n\nfunction normalizeGeometry (mesh: Mesh): BufferGeometry {\n // Preserve original type, e.g. CylinderBufferGeometry.\n const geometry: BufferGeometry = mesh.geometry.clone();\n\n mesh.updateMatrixWorld();\n mesh.matrixWorld.decompose(_v1, _q1, _v2);\n geometry.scale(_v2.x, _v2.y, _v2.z);\n return geometry;\n}\n\n/**\n * Greatly simplified version of BufferGeometryUtils.mergeBufferGeometries.\n * Because we only care about the vertex positions, and not the indices or\n * other attributes, we throw everything else away.\n */\nfunction mergeBufferGeometries (geometries: BufferGeometry[]): BufferGeometry {\n let vertexCount = 0;\n for (let i = 0; i < geometries.length; i++) {\n const position = geometries[i].attributes.position;\n if (position && position.itemSize === 3) {\n vertexCount += position.count;\n }\n }\n\n const positionArray = new Float32Array(vertexCount * 3);\n\n let positionOffset = 0;\n for (let i = 0; i < geometries.length; i++) {\n const position = geometries[i].attributes.position;\n if (position && position.itemSize === 3) {\n for (let j = 0; j < position.count; j++) {\n positionArray[positionOffset++] = position.getX(j);\n positionArray[positionOffset++] = position.getY(j);\n positionArray[positionOffset++] = position.getZ(j);\n }\n }\n }\n\n return new BufferGeometry().setAttribute('position', new BufferAttribute(positionArray, 3));\n}\n\nexport function getVertices (geometry: BufferGeometry): Float32Array {\n const position = geometry.attributes.position;\n const vertices = new Float32Array(position.count * 3);\n for (let i = 0; i < position.count; i++) {\n vertices[i * 3] = position.getX(i);\n vertices[i * 3 + 1] = position.getY(i);\n vertices[i * 3 + 2] = position.getZ(i);\n }\n return vertices;\n}\n\n/**\n * Returns a flat array of THREE.Mesh instances from the given object. If\n * nested transformations are found, they are applied to child meshes\n * as mesh.userData.matrix, so that each mesh has its position/rotation/scale\n * independently of all of its parents except the top-level object.\n */\nfunction getMeshes (object: Object3D): Mesh[] {\n const meshes: Mesh[] = [];\n object.traverse(function (o) {\n if ((o as Mesh).isMesh) {\n meshes.push(o as Mesh);\n }\n });\n return meshes;\n}\n\nexport function getComponent(v: Vector3, component: string): number {\n switch(component) {\n case 'x': return v.x;\n case 'y': return v.y;\n case 'z': return v.z;\n }\n throw new Error(`Unexpected component ${component}`);\n}\n\n/**\n * Modified version of BufferGeometryUtils.mergeVertices, ignoring vertex\n * attributes other than position.\n *\n * @param {THREE.BufferGeometry} geometry\n * @param {number} tolerance\n * @return {THREE.BufferGeometry>}\n */\nfunction simplifyGeometry (geometry: BufferGeometry, tolerance = 1e-4): BufferGeometry {\n\n tolerance = Math.max( tolerance, Number.EPSILON );\n\n // Generate an index buffer if the geometry doesn't have one, or optimize it\n // if it's already available.\n const hashToIndex: {[key: string]: number} = {};\n const indices = geometry.getIndex();\n const positions = geometry.getAttribute( 'position' );\n const vertexCount = indices ? indices.count : positions.count;\n\n // Next value for triangle indices.\n let nextIndex = 0;\n\n const newIndices = [];\n const newPositions = [];\n\n // Convert the error tolerance to an amount of decimal places to truncate to.\n const decimalShift = Math.log10( 1 / tolerance );\n const shiftMultiplier = Math.pow( 10, decimalShift );\n\n for ( let i = 0; i < vertexCount; i ++ ) {\n\n const index = indices ? indices.getX( i ) : i;\n\n // Generate a hash for the vertex attributes at the current index 'i'.\n let hash = '';\n\n // Double tilde truncates the decimal value.\n hash += `${ ~ ~ ( positions.getX( index ) * shiftMultiplier ) },`;\n hash += `${ ~ ~ ( positions.getY( index ) * shiftMultiplier ) },`;\n hash += `${ ~ ~ ( positions.getZ( index ) * shiftMultiplier ) },`;\n\n // Add another reference to the vertex if it's already\n // used by another index.\n if ( hash in hashToIndex ) {\n\n newIndices.push( hashToIndex[ hash ] );\n\n } else {\n\n newPositions.push( positions.getX( index ) );\n newPositions.push( positions.getY( index ) );\n newPositions.push( positions.getZ( index ) );\n\n hashToIndex[ hash ] = nextIndex;\n newIndices.push( nextIndex );\n nextIndex ++;\n\n }\n\n }\n\n // Construct merged BufferGeometry.\n\n const positionAttribute = new BufferAttribute(\n new Float32Array( newPositions ),\n positions.itemSize,\n positions.normalized\n );\n\n const result = new BufferGeometry();\n result.setAttribute( 'position', positionAttribute );\n result.setIndex( newIndices );\n\n return result;\n\n}\n","// https://github.com/donmccurdy/three-to-cannon/blob/main/src/index.ts\nimport {Box, ConvexPolyhedron, Cylinder, Quaternion as CQuaternion, Shape, Sphere, Trimesh, Vec3} from 'cannon-es';\nimport {ConvexHull, Box3, BufferGeometry, CylinderGeometry, MathUtils, Mesh, Object3D, SphereGeometry, Vector3} from 'threepipe';\nimport {getComponent, getGeometry, getVertices} from './utils';\n\nconst PI_2 = Math.PI / 2;\n\nexport type BoxParameters = { x: number, y: number, z: number };\n\nexport type CylinderParameters = { radiusTop: number, radiusBottom: number, height: number, segments: number };\n\nexport type SphereParameters = { radius: number };\n\nexport type ConvexPolyhedronParameters = { vertices: Float32Array, faces: number[][] };\n\nexport type TrimeshParameters = { vertices: Float32Array, indices: Uint32Array };\n\ntype ShapeTypeToShapeParameters = {\n Box: BoxParameters,\n Cylinder: CylinderParameters,\n Sphere: SphereParameters,\n ConvexPolyhedron: ConvexPolyhedronParameters,\n Trimesh: TrimeshParameters,\n};\n\nexport enum ShapeType {\n BOX = 'Box',\n CYLINDER = 'Cylinder',\n SPHERE = 'Sphere',\n HULL = 'ConvexPolyhedron',\n MESH = 'Trimesh',\n}\n\nexport interface ShapeOptions {\n type?: ShapeType,\n cylinderAxis?: 'x' | 'y' | 'z',\n sphereRadius?: number,\n}\n\nexport interface ShapeParameters<T extends ShapeType = ShapeType> {\n type: T,\n params: ShapeTypeToShapeParameters[T],\n offset?: Vec3,\n orientation?: CQuaternion,\n}\n\nexport interface ShapeResult<T extends Shape = Shape> {\n shape: T,\n offset?: Vec3,\n orientation?: CQuaternion,\n}\n\n/**\n * Given a THREE.Object3D instance, creates parameters for a CANNON shape.\n */\nexport const getShapeParameters = function (object: Object3D, options: ShapeOptions = {}): ShapeParameters | null {\n let geometry: BufferGeometry | null;\n\n if (options.type === ShapeType.BOX) {\n return getBoundingBoxParameters(object);\n } else if (options.type === ShapeType.CYLINDER) {\n return getBoundingCylinderParameters(object, options);\n } else if (options.type === ShapeType.SPHERE) {\n return getBoundingSphereParameters(object, options);\n } else if (options.type === ShapeType.HULL) {\n return getConvexPolyhedronParameters(object);\n } else if (options.type === ShapeType.MESH) {\n geometry = getGeometry(object);\n return geometry ? getTrimeshParameters(geometry) : null;\n } else if (options.type) {\n throw new Error(`[CANNON.getShapeParameters] Invalid type \"${options.type}\".`);\n }\n\n geometry = getGeometry(object);\n if (!geometry) return null;\n\n switch (geometry.type) {\n case 'BoxGeometry':\n case 'BoxBufferGeometry':\n return getBoxParameters(geometry);\n case 'CylinderGeometry':\n case 'CylinderBufferGeometry':\n return getCylinderParameters(geometry as CylinderGeometry);\n case 'PlaneGeometry':\n case 'PlaneBufferGeometry':\n return getPlaneParameters(geometry);\n case 'SphereGeometry':\n case 'SphereBufferGeometry':\n return getSphereParameters(geometry as SphereGeometry);\n case 'TubeGeometry':\n case 'BufferGeometry':\n return getBoundingBoxParameters(object);\n default:\n console.warn(\n 'Unrecognized geometry: \"%s\". Using bounding box as shape.', geometry.type\n );\n return getBoxParameters(geometry);\n }\n};\n\n/**\n * Given a THREE.Object3D instance, creates a corresponding CANNON shape.\n */\nexport const threeToCannon = function (object: Object3D, options: ShapeOptions = {}, shapeParameters?: ShapeParameters|null): ShapeResult | null {\n shapeParameters = shapeParameters || getShapeParameters(object, options);\n if (!shapeParameters) {\n return null;\n }\n\n const { type, params, offset, orientation } = shapeParameters;\n\n let shape: Shape;\n if (type === ShapeType.BOX) {\n shape = createBox(params as BoxParameters);\n } else if (type === ShapeType.CYLINDER) {\n shape = createCylinder(params as CylinderParameters);\n } else if (type === ShapeType.SPHERE) {\n shape = createSphere(params as SphereParameters);\n } else if (type === ShapeType.HULL) {\n shape = createConvexPolyhedron(params as ConvexPolyhedronParameters);\n } else {\n shape = createTrimesh(params as TrimeshParameters);\n }\n\n return {\n shape,\n offset,\n orientation,\n };\n};\n\n/******************************************************************************\n * Shape construction\n */\n\nfunction createBox (params: BoxParameters): Box {\n const { x, y, z } = params;\n const shape = new Box(new Vec3(x || 0.025, y || 0.025, z || 0.025));\n return shape;\n}\n\nfunction createCylinder (params: CylinderParameters): Cylinder {\n const { radiusTop, radiusBottom, height, segments } = params;\n\n const shape = new Cylinder(radiusTop, radiusBottom, height, segments);\n\n // Include metadata for serialization.\n // TODO(cleanup): Is this still necessary?\n shape.radiusTop = radiusBottom;\n shape.radiusBottom = radiusBottom;\n shape.height = height;\n shape.numSegments = segments;\n\n return shape;\n}\n\nfunction createSphere (params: SphereParameters): Sphere {\n const shape = new Sphere(params.radius);\n\n return shape;\n}\n\nfunction createConvexPolyhedron (params: ConvexPolyhedronParameters): ConvexPolyhedron {\n const { faces, vertices: verticesArray } = params;\n\n const vertices: Vec3[] = [];\n for (let i = 0; i < verticesArray.length; i += 3) {\n vertices.push(new Vec3(\n verticesArray[i],\n verticesArray[i + 1],\n verticesArray[i + 2]\n ));\n }\n\n const shape = new ConvexPolyhedron({\n faces,\n vertices\n });\n\n return shape;\n}\n\nfunction createTrimesh (params: TrimeshParameters): Trimesh {\n const { vertices, indices } = params\n const shape = new Trimesh(\n vertices as unknown as number[],\n indices as unknown as number[],\n );\n\n return shape;\n}\n\n/******************************************************************************\n * Shape parameters\n */\n\nfunction getBoxParameters (geometry: BufferGeometry): ShapeParameters<ShapeType.BOX> | null {\n const vertices = getVertices(geometry);\n\n if (!vertices.length) return null;\n\n geometry.computeBoundingBox();\n const box = geometry.boundingBox!;\n\n return {\n type: ShapeType.BOX,\n params: {\n x: (box.max.x - box.min.x) / 2,\n y: (box.max.y - box.min.y) / 2,\n z: (box.max.z - box.min.z) / 2,\n },\n };\n}\n\n/** Bounding box needs to be computed with the entire subtree, not just geometry. */\nfunction getBoundingBoxParameters (object: Object3D): ShapeParameters<ShapeType.BOX> | null {\n const clone = object.clone();\n clone.quaternion.set(0, 0, 0, 1);\n clone.updateMatrixWorld();\n\n const box = new Box3().setFromObject(clone);\n\n if (!isFinite(box.min.lengthSq())) return null;\n\n const localPosition = box.translate(clone.position.negate()).getCenter(new Vector3());\n\n return {\n type: ShapeType.BOX,\n params: {\n x: (box.max.x - box.min.x) / 2,\n y: (box.max.y - box.min.y) / 2,\n z: (box.max.z - box.min.z) / 2,\n },\n offset: localPosition.lengthSq()\n ? new Vec3(localPosition.x, localPosition.y, localPosition.z)\n : undefined,\n };\n}\n\n/** Computes 3D convex hull as a CANNON.ConvexPolyhedron. */\nfunction getConvexPolyhedronParameters (object: Object3D): ShapeParameters<ShapeType.HULL> | null {\n const geometry = getGeometry(object);\n\n if (!geometry) return null;\n\n // Perturb.\n const eps = 1e-4;\n for (let i = 0; i < geometry.attributes.position.count; i++) {\n geometry.attributes.position.setXYZ(\n i,\n geometry.attributes.position.getX(i) + (Math.random() - 0.5) * eps,\n geometry.attributes.position.getY(i) + (Math.random() - 0.5) * eps,\n geometry.attributes.position.getZ(i) + (Math.random() - 0.5) * eps,\n );\n }\n\n // Compute the 3D convex hull and collect convex hull vertices and faces.\n const [ positions, indices ] = convexHullToJSON(new ConvexHull().setFromObject(new Mesh(geometry)));\n\n return {\n type: ShapeType.HULL,\n params: {\n vertices: new Float32Array(positions),\n faces: indices,\n },\n };\n}\n\nfunction getCylinderParameters (\n geometry: CylinderGeometry\n): ShapeParameters<ShapeType.CYLINDER> | null {\n const params = geometry.parameters;\n\n return {\n type: ShapeType.CYLINDER,\n params: {\n radiusTop: params.radiusTop,\n radiusBottom: params.radiusBottom,\n height: params.height,\n segments: params.radialSegments,\n },\n orientation: new CQuaternion()\n .setFromEuler(MathUtils.degToRad(-90), 0, 0, 'XYZ')\n .normalize(),\n }\n}\n\nfunction getBoundingCylinderParameters (\n object: Object3D,\n options: ShapeOptions\n): ShapeParameters<ShapeType.CYLINDER> | null {\n const axes = ['x', 'y', 'z'];\n const majorAxis = options.cylinderAxis || 'y';\n const minorAxes = axes.splice(axes.indexOf(majorAxis), 1) && axes;\n const box = new Box3().setFromObject(object);\n\n if (!isFinite(box.min.lengthSq())) return null;\n\n // Compute cylinder dimensions.\n const height = box.max[majorAxis] - box.min[majorAxis];\n const radius = 0.5 * Math.max(\n getComponent(box.max, minorAxes[0]) - getComponent(box.min, minorAxes[0]),\n getComponent(box.max, minorAxes[1]) - getComponent(box.min, minorAxes[1]),\n );\n\n const eulerX = majorAxis === 'y' ? PI_2 : 0;\n const eulerY = majorAxis === 'z' ? PI_2 : 0;\n\n return {\n type: ShapeType.CYLINDER,\n params: {\n radiusTop: radius,\n radiusBottom: radius,\n height,\n segments: 12,\n },\n orientation: new CQuaternion()\n .setFromEuler(eulerX, eulerY, 0, 'XYZ')\n .normalize(),\n offset: new Vec3(\n (box.max.x + box.min.x) / 2,\n (box.max.y + box.min.y) / 2,\n (box.max.z + box.min.z) / 2,\n ),\n };\n}\n\nfunction getPlaneParameters (geometry: BufferGeometry): ShapeParameters<ShapeType.BOX> | null {\n geometry.computeBoundingBox();\n const box = geometry.boundingBox!;\n\n return {\n type: ShapeType.BOX,\n params: {\n x: (box.max.x - box.min.x) / 2 || 0.1,\n y: (box.max.y - box.min.y) / 2 || 0.1,\n z: (box.max.z - box.min.z) / 2 || 0.1,\n },\n };\n}\n\nfunction getSphereParameters (geometry: SphereGeometry): ShapeParameters<ShapeType.SPHERE> | null {\n return {\n type: ShapeType.SPHERE,\n params: { radius: geometry.parameters.radius },\n };\n}\n\nfunction getBoundingSphereParameters (\n object: Object3D,\n options: ShapeOptions\n): ShapeParameters<ShapeType.SPHERE> | null {\n if (options.sphereRadius) {\n return {\n type: ShapeType.SPHERE,\n params: { radius: options.sphereRadius },\n };\n }\n const geometry = getGeometry(object);\n if (!geometry) return null;\n geometry.computeBoundingSphere();\n const sphere = geometry.boundingSphere;\n if(!sphere) return null;\n if(!isFinite(sphere.radius)) return null;\n\n // const localPosition = sphere.center.clone().sub(object.position);\n\n return {\n type: ShapeType.SPHERE,\n params: { radius: geometry.boundingSphere!.radius },\n // offset: localPosition.lengthSq()\n // ? new Vec3(localPosition.x, localPosition.y, localPosition.z)\n // : undefined,\n };\n}\n\nfunction getTrimeshParameters (geometry: BufferGeometry): ShapeParameters<ShapeType.MESH> | null {\n const vertices = getVertices(geometry);\n\n if (!vertices.length) return null;\n\n const indices = new Uint32Array(vertices.length);\n for (let i = 0; i < vertices.length; i++) {\n indices[i] = i;\n }\n\n return {\n type: ShapeType.MESH,\n params: {\n vertices,\n indices,\n },\n };\n}\n\nfunction convexHullToJSON(hull: ConvexHull) {\n // Original ('src') indices do not include interior vertices,\n // but 'hull.vertices' (the list they index) does. Output ('dst')\n // arrays have interior vertices omitted.\n\n const srcIndices = hull.faces.map((f) => {\n const indices = [];\n let edge = f.edge;\n do {\n const vertex = edge.head()\n const index = hull.vertices.indexOf(vertex)\n if(index >=0) indices.push(index);\n edge = edge.next;\n } while (edge !== f.edge);\n return indices;\n });\n const uniqueSrcIndices = Array.from(new Set(srcIndices.flat())).sort();\n\n // Output vertex positions, omitting interior vertices.\n const dstPositions = [];\n for (let i = 0; i < uniqueSrcIndices.length; i++) {\n dstPositions.push(\n hull.vertices[uniqueSrcIndices[i]].point.x,\n hull.vertices[uniqueSrcIndices[i]].point.y,\n hull.vertices[uniqueSrcIndices[i]].point.z,\n );\n }\n\n // Mapping from 'src' (hull.vertices) to 'dst' (dstPositions) indices.\n const srcToDstIndexMap = new Map();\n for (let i = 0; i < uniqueSrcIndices.length; i++) {\n srcToDstIndexMap.set(uniqueSrcIndices[i], i);\n }\n\n // Output triangles, as indices on dstPositions.\n const dstIndices = [];\n for (let i = 0; i < srcIndices.length; i++) {\n dstIndices.push([\n srcToDstIndexMap.get(srcIndices[i][0]),\n srcToDstIndexMap.get(srcIndices[i][1]),\n srcToDstIndexMap.get(srcIndices[i][2]),\n ]);\n }\n\n return [dstPositions, dstIndices] as const;\n}\n","import { Body, Vec3, Quaternion as CQuaternion } from \"cannon-es\"\nimport {\n ComponentDefn,\n ComponentJSON, EntityComponentPlugin,\n IObject3D,\n IObject3DEventMap,\n literalStrings,\n Object3DComponent, Quaternion, Vector3\n} from \"threepipe\"\nimport {Cannon3DShapeComponent} from \"./Cannon3DShapeComponent.ts\";\nimport {CannonMaterial2, CannonPhysicsPlugin} from \"./CannonPhysicsPlugin.ts\";\n\nexport const physicsBodyType = ['static', 'dynamic', 'kinematic'] as const\nexport type PhysicsBodyType = typeof physicsBodyType[number]\n\nexport class Cannon3DBodyComponent extends Object3DComponent {\n static ComponentType = 'Cannon3DBodyComponent'\n static StateProperties: ComponentDefn['StateProperties'] = ['mass', {\n key: 'type',\n type: literalStrings(physicsBodyType),\n }, 'isTrigger', 'material']\n\n declare body: Body\n\n mass = 1\n type: PhysicsBodyType = 'dynamic'\n isTrigger = false\n material: CannonMaterial2 = new CannonMaterial2()\n\n private _typeToCannon(type: PhysicsBodyType) {\n if (type === 'static') return Body.STATIC\n else if (type === 'dynamic') return Body.DYNAMIC\n else if (type === 'kinematic') return Body.KINEMATIC\n return Body.STATIC\n }\n\n updateMassProperties(){\n if (!this.body) return\n try {\n this.body.updateMassProperties()\n }catch (e) {\n console.error('[Cannon3DBodyComponent] updateMassProperties error', e)\n }\n }\n updateBoundingRadius(){\n if (!this.body) return\n try {\n this.body.updateBoundingRadius()\n }catch (e) {\n console.error('[Cannon3DBodyComponent] updateBoundingRadius error', e)\n }\n }\n\n\n constructor() {\n super()\n this.onStateChange('mass', (v)=>{\n if (!this.body) return\n this.body.mass = v\n this.updateMassProperties()\n this.object.setDirty?.({source: 'Cannon3DBodyComponent'})\n })\n this.onStateChange('type', (v)=>{\n if (!this.body) return\n this.body.type = this._typeToCannon(v)\n this.updateMassProperties()\n this.object.setDirty?.({source: 'Cannon3DBodyComponent'})\n })\n this.onStateChange('isTrigger', (v)=>{\n if (!this.body) return\n this.body.isTrigger = v\n this.object.setDirty?.({source: 'Cannon3DBodyComponent'})\n })\n this.onStateChange('material', (v)=>{\n if (!this.body) return\n this.body.material = v\n this.uiConfig?.uiRefresh?.()\n this.object.setDirty?.({source: 'Cannon3DBodyComponent'})\n })\n }\n\n private _objectUpdate = (e: IObject3DEventMap['objectUpdate'])=>{\n if (e.source === 'Cannon3DBodyComponent' || e.source === 'CannonPhysicsPlugin') return\n const changeKey = e?.change ?? e?.key\n const update = !changeKey || changeKey === 'position' || changeKey === 'transform' || changeKey === 'quaternion'\n if (update) this.resetTransform(changeKey)\n }\n\n init(object: IObject3D, state: ComponentJSON['state']) {\n super.init(object, state)\n const cannon = this.ctx.plugin(CannonPhysicsPlugin)\n this.body = new Body()\n this.body.material = this.material\n this.body.mass = this.mass\n this.body.type = this._typeToCannon(this.type)\n this.body.isTrigger = this.isTrigger\n this.updateMassProperties()\n this.resetTransform()\n object.addEventListener('objectUpdate', this._objectUpdate)\n cannon.addBody(this)\n\n object.traverseModels && object.traverseModels(m=>{\n EntityComponentPlugin.GetComponents(m, Cannon3DShapeComponent).forEach(sh=>{\n this.addShape(sh, false)\n })\n }, {widgets: false, visible: false})\n if (this.shapeRefs.length) {\n this.refreshShapes()\n }\n\n }\n\n destroy(): Record<string, any> {\n this.shapeRefs.forEach(shape=>{\n this.removeShape(shape, false)\n })\n this.refreshShapes(false)\n\n this.object.removeEventListener('objectUpdate', this._objectUpdate)\n const cannon = this.ctx.plugin(CannonPhysicsPlugin)\n cannon.removeBody(this)\n this.body = null as any\n return super.destroy()\n }\n\n // update({time}: IAnimationLoopEvent) {\n //\n // }\n\n resetTransform(changeKey?: string) {\n // const changeKey = e?.change ?? e?.key\n if (!changeKey || changeKey === 'position' || changeKey === 'transform')\n this.body.position.set(...this.object.getWorldPosition(new Vector3()).toArray())\n if (!changeKey || changeKey === 'quaternion' || changeKey === 'transform')\n this.body.quaternion.set(...(this.object.getWorldQuaternion(new Quaternion()).toArray() as [number, number, number, number]))\n this.body.angularVelocity.set(0, 0, 0)\n this.body.velocity.set(0, 0, 0)\n }\n\n // static IsCompatible(_object: IObject3D) { return true }\n\n shapeRefs: Cannon3DShapeComponent[] = []\n addShape(shape: Cannon3DShapeComponent, refresh = true) {\n if (!this.shapeRefs.includes(shape)) {\n if (shape.bodyRef && shape.bodyRef !== this) {\n // ignore\n return\n }\n this.shapeRefs.push(shape)\n shape.bodyRef = this\n if (refresh) this.refreshShapes()\n }\n }\n removeShape(shape: Cannon3DShapeComponent, refresh = true) {\n const index = this.shapeRefs.indexOf(shape)\n if (index !== -1) {\n if (shape.bodyRef === this) shape.bodyRef = undefined\n this.shapeRefs.splice(index, 1)\n if (refresh) this.refreshShapes()\n }\n }\n refreshShapes(update = true) {\n let changed = false\n for (const s of this.body.shapes) {\n if (!this.shapeRefs.find(sh=>sh.result.shape === s)) {\n const index = this.body.shapes.indexOf(s)\n if (index !== -1) {\n this.body.shapes.splice(index, 1)\n this.body.shapeOffsets.splice(index, 1)\n this.body.shapeOrientations.splice(index, 1)\n s.body = null\n changed = true\n }\n }\n }\n const bodyObj = this.object\n bodyObj.updateMatrixWorld(true)\n const bodyWorldPos = bodyObj.getWorldPosition(new Vector3())\n const bodyWorldQuat = bodyObj.getWorldQuaternion(new Quaternion())\n for (const s of this.shapeRefs) {\n // s.bodyRef = this\n if (!this.body.shapes.includes(s.result.shape)) {\n const shape = s.result.shape\n this.body.shapes.push(shape)\n const offset = new Vec3()\n const quat = new CQuaternion()\n if(s.result.offset){\n offset.x += s.result.offset.x\n offset.y += s.result.offset.y\n offset.z += s.result.offset.z\n }\n if(s.result.orientation){\n quat.x = s.result.orientation.x\n quat.y = s.result.orientation.y\n quat.z = s.result.orientation.z\n quat.w = s.result.orientation.w\n }\n const shapeObj = s.object\n if(bodyObj !== shapeObj){\n shapeObj.updateMatrixWorld(true)\n const worldPos = shapeObj.getWorldPosition(new Vector3())\n offset.x += worldPos.x - bodyWorldPos.x\n offset.y += worldPos.y - bodyWorldPos.y\n offset.z += worldPos.z - bodyWorldPos.z\n const worldQuat = shapeObj.getWorldQuaternion(new Quaternion())\n const relQuat = worldQuat.multiply(bodyWorldQuat.invert())\n // todo we need to multiply here\n quat.x = relQuat.x\n quat.y = relQuat.y\n quat.z = relQuat.z\n quat.w = relQuat.w\n }\n this.body.shapeOffsets.push(offset)\n this.body.shapeOrientations.push(quat)\n shape.body = this.body\n changed = true\n }\n }\n if (update && changed) {\n this.updateMassProperties()\n this.updateBoundingRadius()\n\n this.body.aabbNeedsUpdate = true\n this.object.setDirty?.({source: 'Cannon3DBodyComponent'})\n }\n }\n}\n","// https://github.com/pmndrs/cannon-es-debugger/blob/master/src/cannon-es-debugger.ts\n\nimport {\n Box,\n ConvexPolyhedron,\n Cylinder,\n Heightfield,\n Quaternion as CannonQuaternion,\n Shape,\n Sphere,\n Trimesh,\n Vec3 as CannonVector3,\n} from 'cannon-es'\nimport {\n BoxGeometry,\n BufferGeometry,\n CylinderGeometry,\n Float32BufferAttribute,\n LineMaterial2,\n Mesh,\n PlaneGeometry,\n SphereGeometry,\n Vector3 as ThreeVector3,\n Wireframe,\n WireframeGeometry3\n} from \"threepipe\";\n\ntype ComplexShape = Shape & {geometryId?: number}\n\nexport function cannonDebugger() {\n const scale = 1\n\n const _tempVec0 = new CannonVector3()\n const _tempVec1 = new CannonVector3()\n const _tempVec2 = new CannonVector3()\n const _tempQuat0 = new CannonQuaternion()\n const _sphereGeometry = new SphereGeometry(1)\n const _boxGeometry = new BoxGeometry(1, 1, 1)\n const _planeGeometry = new PlaneGeometry(10, 10, 10, 10)\n // const _material = new MeshBasicMaterial({color: color ?? 0x00ff00, wireframe: true})\n const _material = new LineMaterial2({\n color: 0x00ff00,\n linewidth: 3, // in world units with size attenuation, pixels otherwise\n vertexColors: false,\n worldUnits: false,\n\n dashed: false,\n alphaToCoverage: true,\n\n toneMapped: false,\n transparent: true,\n depthTest: true,\n depthWrite: false,\n\n allowOverride: false,\n })\n _material.userData.renderToGBuffer = false\n _material.userData.renderToDepth = false\n\n// Move the planeGeometry forward a little bit to prevent z-fighting\n _planeGeometry.translate(0, 0, 0.0001)\n\n function createConvexPolyhedronGeometry(shape: ConvexPolyhedron): BufferGeometry {\n const geometry = new BufferGeometry()\n\n // Add vertices\n const positions = []\n for (let i = 0; i < shape.vertices.length; i++) {\n const vertex = shape.vertices[i]\n positions.push(vertex.x, vertex.y, vertex.z)\n }\n geometry.setAttribute('position', new Float32BufferAttribute(positions, 3))\n\n // Add faces\n const indices = []\n for (let i = 0; i < shape.faces.length; i++) {\n const face = shape.faces[i]\n const a = face[0]\n for (let j = 1; j < face.length - 1; j++) {\n const b = face[j]\n const c = face[j + 1]\n indices.push(a, b, c)\n }\n }\n\n geometry.setIndex(indices)\n geometry.computeBoundingSphere()\n geometry.computeVertexNormals()\n return geometry\n }\n\n function createTrimeshGeometry(shape: Trimesh): BufferGeometry {\n const geometry = new BufferGeometry()\n const positions = []\n const v0 = _tempVec0\n const v1 = _tempVec1\n const v2 = _tempVec2\n\n for (let i = 0; i < shape.indices.length / 3; i++) {\n shape.getTriangleVertices(i, v0, v1, v2)\n positions.push(v0.x, v0.y, v0.z)\n positions.push(v1.x, v1.y, v1.z)\n positions.push(v2.x, v2.y, v2.z)\n }\n\n geometry.setAttribute('position', new Float32BufferAttribute(positions, 3))\n geometry.computeBoundingSphere()\n geometry.computeVertexNormals()\n return geometry\n }\n\n function createHeightfieldGeometry(shape: Heightfield): BufferGeometry {\n const geometry = new BufferGeometry()\n const s = shape.elementSize || 1 // assumes square heightfield, else i*x, j*y\n const positions = shape.data.flatMap((row, i) => row.flatMap((z, j) => [i * s, j * s, z]))\n const indices = []\n\n for (let xi = 0; xi < shape.data.length - 1; xi++) {\n for (let yi = 0; yi < shape.data[xi].length - 1; yi++) {\n const stride = shape.data[xi].length\n const index = xi * stride + yi\n indices.push(index + 1, index + stride, index + stride + 1)\n indices.push(index + stride, index + 1, index)\n }\n }\n\n geometry.setIndex(indices)\n geometry.setAttribute('position', new Float32BufferAttribute(positions, 3))\n geometry.computeBoundingSphere()\n geometry.computeVertexNormals()\n return geometry\n }\n\n function createMesh(shape: Shape): Mesh {\n let mesh = new Mesh()\n const {SPHERE, BOX, PLANE, CYLINDER, CONVEXPOLYHEDRON, TRIMESH, HEIGHTFIELD} = Shape.types\n\n switch (shape.type) {\n case SPHERE: {\n mesh = new Wireframe(new WireframeGeometry3(_sphereGeometry), _material)\n break\n }\n case BOX: {\n mesh = new Wireframe(new WireframeGeometry3(_boxGeometry), _material)\n break\n }\n case PLANE: {\n mesh = new Wireframe(new WireframeGeometry3(_planeGeometry), _material)\n break\n }\n case CYLINDER: {\n const geometry = new CylinderGeometry(\n (shape as Cylinder).radiusTop,\n (shape as Cylinder).radiusBottom,\n (shape as Cylinder).height,\n (shape as Cylinder).numSegments\n )\n mesh = new Wireframe(new WireframeGeometry3(geometry), _material)\n ;(shape as ComplexShape).geometryId = geometry.id\n break\n }\n case CONVEXPOLYHEDRON: {\n const geometry = createConvexPolyhedronGeometry(shape as ConvexPolyhedron)\n mesh = new Wireframe(new WireframeGeometry3(geometry), _material)\n ;(shape as ComplexShape).geometryId = geometry.id\n break\n }\n case TRIMESH: {\n const geometry = createTrimeshGeometry(shape as Trimesh)\n mesh = new Wireframe(new WireframeGeometry3(geometry), _material)\n ;(shape as ComplexShape).geometryId = geometry.id\n break\n }\n case HEIGHTFIELD: {\n const geometry = createHeightfieldGeometry(shape as Heightfield)\n mesh = new Wireframe(new WireframeGeometry3(geometry), _material)\n ;(shape as ComplexShape).geometryId = geometry.id\n break\n }\n }\n return mesh\n }\n\n function scaleMesh(mesh: Mesh, shape: Shape | ComplexShape): void {\n const {SPHERE, BOX, PLANE, CYLINDER, CONVEXPOLYHEDRON, TRIMESH, HEIGHTFIELD} = Shape.types\n switch (shape.type) {\n case SPHERE: {\n const {radius} = shape as Sphere\n mesh.scale.set(radius * scale, radius * scale, radius * scale)\n break\n }\n case BOX: {\n mesh.scale.copy((shape as Box).halfExtents as unknown as ThreeVector3)\n mesh.scale.multiplyScalar(2 * scale)\n break\n }\n case PLANE: {\n break\n }\n case CYLINDER: {\n mesh.scale.set(1 * scale, 1 * scale, 1 * scale)\n break\n }\n case CONVEXPOLYHEDRON: {\n mesh.scale.set(1 * scale, 1 * scale, 1 * scale)\n break\n }\n case TRIMESH: {\n mesh.scale.copy((shape as Trimesh).scale as unknown as ThreeVector3).multiplyScalar(scale)\n break\n }\n case HEIGHTFIELD: {\n mesh.scale.set(1 * scale, 1 * scale, 1 * scale)\n break\n }\n }\n }\n\n function typeMatch(mesh: Mesh|undefined, shape: Shape | ComplexShape): boolean {\n if (!mesh) return false\n const {geometry} = mesh\n return (\n geometry instanceof SphereGeometry && shape.type === Shape.types.SPHERE ||\n geometry instanceof BoxGeometry && shape.type === Shape.types.BOX ||\n geometry instanceof PlaneGeometry && shape.type === Shape.types.PLANE ||\n // geometry.id === (shape as ComplexShape).geometryId && shape.type === Shape.types.BOX ||\n // geometry.id === (shape as ComplexShape).geometryId && shape.type === Shape.types.SPHERE ||\n // geometry.id === (shape as ComplexShape).geometryId && shape.type === Shape.types.PLANE ||\n geometry.id === (shape as ComplexShape).geometryId && shape.type === Shape.types.CONVEXPOLYHEDRON ||\n geometry.id === (shape as ComplexShape).geometryId && shape.type === Shape.types.TRIMESH ||\n geometry.id === (shape as ComplexShape).geometryId && shape.type === Shape.types.HEIGHTFIELD\n )\n }\n\n function updateMesh(mesh: Mesh|undefined, shape: Shape | ComplexShape) {\n if (!typeMatch(mesh, shape)) {\n mesh = createMesh(shape)\n }\n mesh && scaleMesh(mesh, shape)\n return mesh\n }\n\n\n return {\n createConvexPolyhedronGeometry,\n createTrimeshGeometry,\n createHeightfieldGeometry,\n createMesh,\n scaleMesh,\n typeMatch,\n updateMesh,\n }\n}\n\nexport const CannonDebugger = cannonDebugger();\n","import {\n AHelperWidget,\n ComponentDefn,\n ComponentJSON,\n EntityComponentPlugin, Group,\n IMaterial,\n IObject3D,\n literalStrings,\n Mesh,\n Object3DComponent, Object3DWidgetsPlugin,\n PartialRecord\n} from \"threepipe\"\nimport {getShapeParameters, ShapeParameters, ShapeResult, ShapeType, threeToCannon} from \"./threeToCannon\"\nimport {Box, Quaternion as CQuaternion, Shape, Vec3} from \"cannon-es\"\nimport {Cannon3DBodyComponent} from \"./Cannon3DBodyComponent.ts\";\nimport {CannonDebugger} from \"./helper.ts\";\n\nexport const typeToCannon = {\n autoBox: ShapeType.BOX,\n autoCylinder: ShapeType.CYLINDER,\n autoSphere: ShapeType.SPHERE,\n autoConvex: ShapeType.HULL,\n autoTrimesh: ShapeType.MESH,\n box: ShapeType.BOX,\n sphere: ShapeType.SPHERE,\n cylinder: ShapeType.CYLINDER,\n convex: ShapeType.HULL,\n trimesh: ShapeType.MESH,\n // plane: ShapeType.PLANE,\n} as const\n\nexport type CannonShapeType = keyof typeof typeToCannon\n\nexport const cannonShapeTypes = Object.keys(typeToCannon) as CannonShapeType[]\n\nexport const cannonShapeTypeParams: PartialRecord<CannonShapeType, ShapeParameters['params']> = {\n box: {x: 1, y: 1, z: 1},\n sphere: {radius: 1},\n cylinder: {radiusTop: 1, radiusBottom: 1, height: 1, segments: 8},\n convex: {vertices: new Float32Array([1, 1, 1, -1, 1, 1, -1, -1, 1, 1, -1, 1, 0, 0, -1]), faces: [[0, 1, 2, 3], [4, 0, 3], [4, 3, 2], [4, 2, 1], [4, 1, 0]]},\n trimesh: {vertices: new Float32Array([1, 1, 1, -1, -1, 1, -1, 1, -1, 1, -1, -1]), indices: new Uint32Array([0, 1, 2, 0, 3, 1, 0, 2, 3, 1, 3, 2])},\n // not for auto\n}\n\nexport class Cannon3DShapeComponent extends Object3DComponent {\n static ComponentType = 'Cannon3DShapeComponent'\n static StateProperties: ComponentDefn['StateProperties'] = [{\n key: 'type',\n type: literalStrings(cannonShapeTypes),\n }]\n static EmptyResult: ShapeResult = {shape: new Box(new Vec3(0.025, 0.025, 0.025))}\n\n result: ShapeResult = Cannon3DShapeComponent.EmptyResult\n bodyRef: Cannon3DBodyComponent | undefined\n type: CannonShapeType = 'autoBox'\n params: ShapeParameters | null = null\n\n constructor() {\n super()\n this.onStateChange('type', () => {\n // const shapeType = typeToCannon[this.shapeType]\n const params = cannonShapeTypeParams[this.type]\n if (params) {\n const params1 = {}\n Object.entries(params).forEach(([k, v]) => {\n (params1 as any)[k] = (v as Array<any>).slice ? (v as Array<any>).slice() : v\n })\n this.params = {\n type: typeToCannon[this.type],\n params: params1 as any,\n offset: new Vec3(),\n orientation: new CQuaternion(),\n }\n } else {\n this.params = null\n }\n if (!this.object) return\n this.refreshShape()\n })\n }\n\n // static IsCompatible(_object: IObject3D) { return true }\n\n init(object: IObject3D, state: ComponentJSON['state']) {\n super.init(object, state)\n this.refreshShape(false)\n const body = EntityComponentPlugin.GetComponentInParent(object, Cannon3DBodyComponent)\n if (!body) {\n // console.warn('Cannon3DShapeComponent: No Cannon3DBodyComponent found in parent hierarchy')\n } else {\n body.addShape(this)\n }\n this.object.addEventListener('objectUpdate', this.objectUpdate)\n this.object.addEventListener('childadded', this.childadded)\n this.object.addEventListener('childremoved', this.childremoved)\n this.ctx.viewer.addEventListener('preFrame', this.preFrame)\n }\n\n destroy(): Record<string, any> {\n if (this.bodyRef) {\n this.bodyRef.removeShape(this, false)\n this.bodyRef = undefined\n }\n this.object.removeEventListener('objectUpdate', this.objectUpdate)\n this.ctx.viewer.removeEventListener('preFrame', this.preFrame)\n this.result = Cannon3DShapeComponent.EmptyResult\n return super.destroy()\n }\n\n refreshShape(refreshBody = true) {\n // todo auto refresh on geometry or hierarchy changed if set to auto\n if (!this.object.__cannonShapes) this.object.__cannonShapes = []\n\n if(this.result){\n const index = this.object.__cannonShapes.indexOf(this.result)\n if(index !== -1) this.object.__cannonShapes.splice(index, 1)\n }\n\n const shapeType = typeToCannon[this.type]\n const shapeParameters = this.params ?? (shapeType ? getShapeParameters(this.object, {type: shapeType}) : null)\n\n // console.log('shapeParameters', shapeParameters)\n if (shapeParameters) {\n this.result = threeToCannon(this.object, undefined, shapeParameters)!\n } else {\n this.result = Cannon3DShapeComponent.EmptyResult\n }\n\n if (!this.object.__cannonShapes.includes(this.result)) this.object.__cannonShapes.push(this.result)\n\n if (refreshBody && this.bodyRef) this.bodyRef.refreshShapes()\n\n this.object.setDirty?.()\n this.ctx.plugin(Object3DWidgetsPlugin)?.refreshObject(this.object)\n }\n\n private _needsUpdate = false\n objectUpdate = (e: any)=>{\n }\n\n childadded = (e: any)=>{\n this._needsUpdate = true\n e.child.addEventListener('objectUpdate', this.objectUpdate)\n e.child.addEventListener('childadded', this.childadded)\n e.child.addEventListener('childremoved', this.childremoved)\n // console.log('childadded', {...e})\n }\n childremoved = (e: any)=>{\n this._needsUpdate = true\n e.child.removeEventListener('objectUpdate', this.objectUpdate)\n e.child.removeEventListener('childadded', this.childadded)\n e.child.removeEventListener('childremoved', this.childremoved)\n // console.log('childremoved', {...e})\n }\n\n preFrame = ()=>{\n if(this._needsUpdate){\n this._needsUpdate = false\n this.refreshShape()\n }\n }\n}\n\nexport class Cannon3DShapeHelper extends AHelperWidget {\n autoUpgradeChildren = false // used elsewhere\n private _shapes: ShapeResult[] = []\n private _meshes = new WeakMap<Shape, Mesh>()\n declare object: IObject3D | undefined\n\n private _gp = new Group()\n constructor(object: IObject3D) {\n super(object, false)\n\n this.attach(object)\n this.add(this._gp)\n this.visible = false\n }\n\n update() {\n super.update()\n\n this._gp.scale.setFromMatrixScale(this.matrixWorld)\n this._gp.scale.set(\n 1./this._gp.scale.x,\n 1./this._gp.scale.y,\n 1./this._gp.scale.z\n )\n\n const shapes = (this.object?.__cannonShapes || []) as ShapeResult[]\n const added = shapes.filter(s => !this._shapes.includes(s))\n const removed = this._shapes.filter(s => !shapes.includes(s))\n if (!added.length && !removed.length) return\n\n for (const shape of removed) {\n const mesh = this._meshes.get(shape.shape)\n if (mesh) {\n this._gp.remove(mesh)\n mesh.geometry.dispose()\n ;(mesh.material as IMaterial).dispose()\n this._meshes.delete(shape.shape)\n }\n }\n this._shapes = []\n for (const shape of shapes) {\n const current = this._meshes.get(shape.shape)\n // update\n const mesh = CannonDebugger.updateMesh(current, shape.shape)\n if (mesh !== current && mesh) {\n this._gp.add(mesh)\n if (current) {\n current.removeFromParent()\n current.geometry.dispose()\n ;(current.material as IMaterial).dispose()\n }\n this._meshes.set(shape.shape, mesh)\n }\n if(mesh){\n if(shape.offset){\n mesh.position.set(shape.offset.x, shape.offset.y, shape.offset.z)\n }\n if(shape.orientation){\n mesh.quaternion.set(shape.orientation.x, shape.orientation.y, shape.orientation.z, shape.orientation.w)\n }\n }\n this._shapes.push(shape)\n }\n\n }\n\n dispose() {\n this._shapes = []\n this.children.forEach(c => {\n if (c instanceof Mesh) {\n c.geometry.dispose()\n ;(c.material as IMaterial).dispose()\n }\n })\n super.dispose()\n }\n\n static Check(obj: IObject3D) {\n return !!EntityComponentPlugin.GetComponentData(obj, Cannon3DShapeComponent)\n }\n\n static Create(obj: IObject3D) {\n return new Cannon3DShapeHelper(obj as any)\n }\n}\n\ndeclare module 'threepipe' {\n interface IObject3D{\n /**\n * Shapes associated with this object\n * @internal - for cannon js physics\n */\n ['__cannonShapes']?: ShapeResult[]\n }\n}\n","import { Body, Box, ConeTwistConstraint, Constraint, Sphere, Vec3 } from \"cannon-es\"\nimport {\n BoxGeometry,\n Bone,\n ComponentDefn,\n ComponentJSON,\n IObject3D,\n Mesh,\n MeshStandardMaterial,\n Object3D,\n Object3DComponent,\n Quaternion,\n SkinnedMesh,\n SphereGeometry,\n uiFolderContainer,\n Vector3,\n ViewerEventMap\n} from \"threepipe\"\nimport { CannonMaterial2, CannonPhysicsPlugin } from \"./CannonPhysicsPlugin.ts\"\n\nexport interface RagdollConfig {\n scale: number\n angle: number\n angleShoulders: number\n twistAngle: number\n}\n\nexport interface RagdollParts {\n lowerLeftLeg: Body\n lowerRightLeg: Body\n upperLeftLeg: Body\n upperRightLeg: Body\n pelvis: Body\n upperBody: Body\n head: Body\n upperLeftArm: Body\n upperRightArm: Body\n lowerLeftArm: Body\n lowerRightArm: Body\n}\n\nexport interface RagdollConstraints {\n neckJoint: ConeTwistConstraint\n leftKneeJoint: ConeTwistConstraint\n rightKneeJoint: ConeTwistConstraint\n leftHipJoint: ConeTwistConstraint\n rightHipJoint: ConeTwistConstraint\n spineJoint: ConeTwistConstraint\n leftShoulder: ConeTwistConstraint\n rightShoulder: ConeTwistConstraint\n leftElbowJoint: ConeTwistConstraint\n rightElbowJoint: ConeTwistConstraint\n}\n\n@uiFolderContainer('Ragdoll')\nexport class CannonRagdollComponent extends Object3DComponent {\n static ComponentType = 'CannonRagdollComponent'\n static StateProperties: ComponentDefn['StateProperties'] = [\n 'scale',\n 'angle',\n 'angleShoulders',\n 'twistAngle',\n 'mass',\n 'autoCreateOnInit',\n 'hideRagdollMeshes'\n ]\n\n scale = 1\n\n angle = Math.PI / 4\n\n // Increased to allow arms to fall more naturally (nearly parallel to body)\n angleShoulders = Math.PI / 2\n\n twistAngle = Math.PI / 8\n\n mass = 1\n\n /** If true, creates ragdoll bodies on init. If false, waits for activate() call */\n autoCreateOnInit = true\n\n /** If true, hides the debug ragdoll meshes (useful when using with character model) */\n hideRagdollMeshes = false\n\n material: CannonMaterial2 = new CannonMaterial2()\n\n private _bodies: Body[] = []\n private _constraints: Constraint[] = []\n private _parts: RagdollParts | null = null\n private _ragdollConstraints: RagdollConstraints | null = null\n private _cannon: CannonPhysicsPlugin | null = null\n\n // Visual meshes\n private _meshes: Mesh[] = []\n private _meshContainer: Object3D | null = null\n private _visualMaterial: MeshStandardMaterial | null = null\n private _lastObjectPosition = new Vector3()\n private _lastObjectQuaternion = new Quaternion()\n private _initialized = false\n\n // Ragdoll state\n private _isActive = false\n private _characterMeshes: SkinnedMesh[] = []\n private _boneMap: Map<string, Bone> = new Map()\n\n // Store initial bone transforms (bind pose) and initial ragdoll body transforms\n private _initialBoneQuats: Map<string, Quaternion> = new Map()\n private _initialBoneWorldQuats: Map<string, Quaternion> = new Map()\n private _initialBodyQuats: Map<Body, Quaternion> = new Map()\n\n // Bone name mappings (common Mixamo bone names)\n private _boneNames = {\n head: ['Head', 'mixamorigHead', 'head'],\n neck: ['Neck', 'mixamorigNeck', 'neck'],\n spine: ['Spine', 'mixamorigSpine', 'spine'],\n spine1: ['Spine1', 'mixamorigSpine1', 'spine1'],\n spine2: ['Spine2', 'mixamorigSpine2', 'spine2'],\n hips: ['Hips', 'mixamorigHips', 'hips', 'pelvis'],\n leftUpLeg: ['LeftUpLeg', 'mixamorigLeftUpLeg', 'left_upper_leg', 'LeftThigh'],\n rightUpLeg: ['RightUpLeg', 'mixamorigRightUpLeg', 'right_upper_leg', 'RightThigh'],\n leftLeg: ['LeftLeg', 'mixamorigLeftLeg', 'left_lower_leg', 'LeftShin'],\n rightLeg: ['RightLeg', 'mixamorigRightLeg', 'right_lower_leg', 'RightShin'],\n leftArm: ['LeftArm', 'mixamorigLeftArm', 'left_upper_arm', 'LeftShoulder'],\n rightArm: ['RightArm', 'mixamorigRightArm', 'right_upper_arm', 'RightShoulder'],\n leftForeArm: ['LeftForeArm', 'mixamorigLeftForeArm', 'left_lower_arm', 'LeftElbow'],\n rightForeArm: ['RightForeArm', 'mixamorigRightForeArm', 'right_lower_arm', 'RightElbow'],\n }\n\n // Reusable temp objects for transform calculations\n private _currentObjectPosition = new Vector3()\n private _currentObjectQuaternion = new Quaternion()\n private _deltaQuaternion = new Quaternion()\n private _invLastQuaternion = new Quaternion()\n private _tempVec3 = new Vector3()\n private _pivotPoint = new Vector3()\n private _tempWorldPos = new Vector3()\n private _tempWorldQuat = new Quaternion()\n\n get bodies(): Body[] {\n return this._bodies\n }\n\n get constraints(): Constraint[] {\n return this._constraints\n }\n\n get parts(): RagdollParts | null {\n return this._parts\n }\n\n get ragdollConstraints(): RagdollConstraints | null {\n return this._ragdollConstraints\n }\n\n /** Returns true if ragdoll physics is currently active */\n get isActive(): boolean {\n return this._isActive\n }\n\n constructor() {\n super()\n this.onStateChange('scale', () => this._recreateRagdoll())\n this.onStateChange('angle', () => this._updateConstraints())\n this.onStateChange('angleShoulders', () => this._updateConstraints())\n this.onStateChange('twistAngle', () => this._updateConstraints())\n this.onStateChange('mass', () => this._updateMass())\n this.onStateChange('hideRagdollMeshes', () => this._updateMeshVisibility())\n }\n\n init(object: IObject3D, state: ComponentJSON['state']) {\n super.init(object, state)\n this._cannon = this.ctx.plugin(CannonPhysicsPlugin)\n\n // Clean up any existing ragdoll first\n this._removeRagdoll()\n\n // Create visual material\n if (!this._visualMaterial) {\n this._visualMaterial = new MeshStandardMaterial({ color: 0x888888 })\n }\n\n // Create container for meshes in the scene (not the object, to avoid saving)\n if (!this._meshContainer) {\n this._meshContainer = new Object3D()\n this._meshContainer.name = `RagdollMeshes_${this.object.uuid}`\n // Add to scene instead of object to prevent serialization\n this.ctx.viewer?.scene.add(this._meshContainer)\n }\n\n // Find character meshes and build bone map\n this._findCharacterMeshes()\n this._buildBoneMap()\n\n if (this.autoCreateOnInit) {\n this._createRagdoll()\n // Start deactivated - bodies are kinematic until activated\n this._deactivateBodies()\n }\n\n this._updateMeshVisibility()\n }\n\n destroy(): Record<string, any> {\n this._removeRagdoll()\n\n // Remove mesh container from scene\n if (this._meshContainer) {\n this.ctx.viewer?.scene.remove(this._meshContainer)\n this._meshContainer = null\n }\n\n // Dispose material\n if (this._visualMaterial) {\n this._visualMaterial.dispose()\n this._visualMaterial = null\n }\n\n this._cannon = null\n return super.destroy()\n }\n\n // Called automatically by the component system each frame\n preFrame(_event: ViewerEventMap[\"preFrame\"]): void {\n if (this._isActive) {\n // When ragdoll is active, sync bones to follow ragdoll bodies\n this._syncRagdollToBones()\n } else {\n // When not active, sync ragdoll to follow object transform\n this._syncObjectPosition()\n }\n this._updateMeshes()\n }\n\n /**\n * Syncs the character's bones to match the ragdoll body positions/rotations.\n * Called each frame when ragdoll is active.\n *\n * The approach:\n * 1. Calculate how much the ragdoll body has rotated in world space (delta from initial)\n * 2. Apply that same world-space delta to the bone's initial world orientation\n * 3. Convert the new world orientation back to local space for the bone\n *\n * Note: Only the root bone (hips) gets position updates. Other bones only get rotation updates\n * because in a skeleton hierarchy, bone positions are fixed (defined by bone length).\n */\n private _syncRagdollToBones() {\n if (!this._parts || this._characterMeshes.length === 0) return\n\n // Helper to sync a bone's rotation to a ragdoll body\n const syncBoneRotation = (body: Body, boneNames: string[]) => {\n const bone = this._findBone(boneNames)\n if (!bone) return\n\n const boneName = bone.name\n\n // Get stored initial values\n const initialBodyQuat = this._initialBodyQuats.get(body)\n const initialBoneWorldQuat = this._initialBoneWorldQuats.get(boneName)\n\n if (!initialBodyQuat || !initialBoneWorldQuat) {\n return\n }\n\n // Get the body's current world quaternion\n const currentBodyQuat = new Quaternion(\n body.quaternion.x,\n body.quaternion.y,\n body.quaternion.z,\n body.quaternion.w\n )\n\n // Calculate delta rotation in world space: how much has the body rotated?\n // deltaQuat = currentBodyQuat * inverse(initialBodyQuat)\n const initialBodyQuatInverse = initialBodyQuat.clone().invert()\n const worldDeltaQuat = currentBodyQuat.clone().multiply(initialBodyQuatInverse)\n\n // Apply world delta to the bone's initial world orientation\n // newBoneWorldQuat = worldDeltaQuat * initialBoneWorldQuat\n const newBoneWorldQuat = worldDeltaQuat.clone().multiply(initialBoneWorldQuat)\n\n // Convert new world quaternion to local space\n if (bone.parent) {\n // Get parent's current world quaternion\n const parentWorldQuat = new Quaternion()\n bone.parent.getWorldQuaternion(parentWorldQuat)\n\n // localQuat = inverse(parentWorldQuat) * newBoneWorldQuat\n const parentWorldQuatInverse = parentWorldQuat.clone().invert()\n const newLocalQuat = parentWorldQuatInverse.clone().multiply(newBoneWorldQuat)\n\n bone.quaternion.copy(newLocalQuat)\n } else {\n // No parent, world = local\n bone.quaternion.copy(newBoneWorldQuat)\n }\n }\n\n // Sync root bone (hips) - this one gets both position and rotation\n const hipsBone = this._findBone(this._boneNames.hips)\n if (hipsBone && this._parts.pelvis) {\n // Position: only the root bone should move in world space\n this._tempWorldPos.set(\n this._parts.pelvis.position.x,\n this._parts.pelvis.position.y,\n this._parts.pelvis.position.z\n )\n\n if (hipsBone.parent) {\n const parentMatrixWorldInverse = hipsBone.parent.matrixWorld.clone().invert()\n this._tempWorldPos.applyMatrix4(parentMatrixWorldInverse)\n }\n hipsBone.position.copy(this._tempWorldPos)\n\n // Rotation\n syncBoneRotation(this._parts.pelvis, this._boneNames.hips)\n }\n\n // Sync all other bones - rotation only (no position changes)\n syncBoneRotation(this._parts.head, this._boneNames.head)\n syncBoneRotation(this._parts.upperBody, this._boneNames.spine2)\n syncBoneRotation(this._parts.upperLeftLeg, this._boneNames.leftUpLeg)\n syncBoneRotation(this._parts.upperRightLeg, this._boneNames.rightUpLeg)\n syncBoneRotation(this._parts.lowerLeftLeg, this._boneNames.leftLeg)\n syncBoneRotation(this._parts.lowerRightLeg, this._boneNames.rightLeg)\n syncBoneRotation(this._parts.upperLeftArm, this._boneNames.leftArm)\n syncBoneRotation(this._parts.upperRightArm, this._boneNames.rightArm)\n syncBoneRotation(this._parts.lowerLeftArm, this._boneNames.leftForeArm)\n syncBoneRotation(this._parts.lowerRightArm, this._boneNames.rightForeArm)\n\n // Update the skeleton's matrix world\n for (const skinnedMesh of this._characterMeshes) {\n if (skinnedMesh.skeleton) {\n skinnedMesh.skeleton.update()\n }\n }\n }\n\n private _syncObjectPosition() {\n if (!this._initialized || this._bodies.length === 0) return\n\n // Get current object world transform\n this.object.getWorldPosition(this._currentObjectPosition)\n this.object.getWorldQuaternion(this._currentObjectQuaternion)\n\n // Calculate position delta\n const deltaX = this._currentObjectPosition.x - this._lastObjectPosition.x\n const deltaY = this._currentObjectPosition.y - this._lastObjectPosition.y\n const deltaZ = this._currentObjectPosition.z - this._lastObjectPosition.z\n\n // Check if rotation changed\n const rotationChanged = !this._currentObjectQuaternion.equals(this._lastObjectQuaternion)\n\n // If rotation changed, we need to rotate all bodies around the object's position\n if (rotationChanged) {\n // Calculate the delta rotation: deltaQ = currentQ * inverse(lastQ)\n this._invLastQuaternion.copy(this._lastObjectQuaternion).invert()\n this._deltaQuaternion.copy(this._currentObjectQuaternion).multiply(this._invLastQuaternion)\n\n // Pivot point is the object's last position (before any position change)\n this._pivotPoint.copy(this._lastObjectPosition)\n\n // Rotate each body around the pivot point\n for (const body of this._bodies) {\n // Get body position relative to pivot\n this._tempVec3.set(\n body.position.x - this._pivotPoint.x,\n body.position.y - this._pivotPoint.y,\n body.position.z - this._pivotPoint.z\n )\n\n // Rotate the relative position by delta quaternion\n this._tempVec3.applyQuaternion(this._deltaQuaternion)\n\n // Set new position (pivot + rotated relative position)\n body.position.x = this._pivotPoint.x + this._tempVec3.x\n body.position.y = this._pivotPoint.y + this._tempVec3.y\n body.position.z = this._pivotPoint.z + this._tempVec3.z\n\n // Also rotate the body's own quaternion\n // Convert cannon quaternion to three quaternion, apply delta, convert back\n const bodyQuat = new Quaternion(\n body.quaternion.x,\n body.quaternion.y,\n body.quaternion.z,\n body.quaternion.w\n )\n bodyQuat.premultiply(this._deltaQuaternion)\n body.quaternion.set(bodyQuat.x, bodyQuat.y, bodyQuat.z, bodyQuat.w)\n }\n\n // Update last quaternion\n this._lastObjectQuaternion.copy(this._currentObjectQuaternion)\n }\n\n // Apply position delta (after rotation, so we translate the already-rotated positions)\n if (deltaX !== 0 || deltaY !== 0 || deltaZ !== 0) {\n for (const body of this._bodies) {\n body.position.x += deltaX\n body.position.y += deltaY\n body.position.z += deltaZ\n }\n\n // Update last position\n this._lastObjectPosition.copy(this._currentObjectPosition)\n }\n }\n\n private _updateMeshes() {\n if (!this._parts || this._meshes.length === 0) return\n\n // Sync each mesh position/rotation with its corresponding body\n for (let i = 0; i < this._bodies.length && i < this._meshes.length; i++) {\n const body = this._bodies[i]\n const mesh = this._meshes[i]\n\n mesh.position.set(body.position.x, body.position.y, body.position.z)\n mesh.quaternion.set(\n body.quaternion.x,\n body.quaternion.y,\n body.quaternion.z,\n body.quaternion.w\n )\n }\n }\n\n private _recreateRagdoll() {\n if (!this._cannon) return\n this._removeRagdoll()\n this._createRagdoll()\n this.object.setDirty?.({ source: 'CannonRagdollComponent' })\n }\n\n private _updateMass() {\n for (const body of this._bodies) {\n body.mass = this.mass\n body.updateMassProperties()\n }\n this.object.setDirty?.({ source: 'CannonRagdollComponent' })\n }\n\n private _updateConstraints() {\n // Recreate constraints with new angles\n this._recreateRagdoll()\n }\n\n private _createRagdoll() {\n if (!this._cannon) return\n\n const scale = this.scale\n const angle = this.angle\n const angleShoulders = this.angleShoulders\n const twistAngle = this.twistAngle\n\n // Dimensions (same as original)\n const shouldersDistance = 0.5 * scale\n const upperArmLength = 0.4 * scale\n const lowerArmLength = 0.4 * scale\n const upperArmSize = 0.2 * scale\n const lowerArmSize = 0.2 * scale\n const neckLength = 0.1 * scale\n const headRadius = 0.25 * scale\n const upperBodyLength = 0.6 * scale\n const pelvisLength = 0.4 * scale\n const upperLegLength = 0.5 * scale\n const upperLegSize = 0.2 * scale\n const lowerLegSize = 0.2 * scale\n const lowerLegLength = 0.5 * scale\n\n // Shapes - Original uses Z as up, we use Y as up\n // Original: Box(x, y, z) where Z is height for vertical parts\n // Ours: Box(x, y, z) where Y is height for vertical parts\n const headShape = new Sphere(headRadius)\n\n // Arms extend along X axis (horizontal)\n const upperArmShape = new Box(\n new Vec3(upperArmLength * 0.5, upperArmSize * 0.5, upperArmSize * 0.5)\n )\n const lowerArmShape = new Box(\n new Vec3(lowerArmLength * 0.5, lowerArmSize * 0.5, lowerArmSize * 0.5)\n )\n\n // Upper body: X is width (shoulders), Z is depth, Y is height\n // Original: (shouldersDistance * 0.5, lowerArmSize * 0.5, upperBodyLength * 0.5)\n // Convert Z->Y for height\n const upperBodyShape = new Box(\n new Vec3(shouldersDistance * 0.5, upperBodyLength * 0.5, lowerArmSize * 0.5)\n )\n const pelvisShape = new Box(\n new Vec3(shouldersDistance * 0.5, pelvisLength * 0.5, lowerArmSize * 0.5)\n )\n\n // Legs: vertical, so Y is the length\n const upperLegShape = new Box(\n new Vec3(upperLegSize * 0.5, upperLegLength * 0.5, lowerArmSize * 0.5)\n )\n const lowerLegShape = new Box(\n new Vec3(lowerLegSize * 0.5, lowerLegLength * 0.5, lowerArmSize * 0.5)\n )\n\n // Get world position and rotation of the object as the base transform\n const basePos = this.object.getWorldPosition(new Vector3())\n const baseQuat = this.object.getWorldQuaternion(new Quaternion())\n\n // Helper to transform a local offset by the object's world rotation and add to world position\n const transformLocalToWorld = (localOffset: Vector3): Vec3 => {\n const worldOffset = localOffset.clone().applyQuaternion(baseQuat)\n return new Vec3(\n basePos.x + worldOffset.x,\n basePos.y + worldOffset.y,\n basePos.z + worldOffset.z\n )\n }\n\n // Helper to create mesh for a body\n const createMeshForBody = (body: Body, isHead = false): Mesh => {\n let geometry\n if (isHead) {\n geometry = new SphereGeometry(headRadius, 16, 16)\n } else {\n const shape = body.shapes[0] as Box\n geometry = new BoxGeometry(\n shape.halfExtents.x * 2,\n shape.halfExtents.y * 2,\n shape.halfExtents.z * 2\n )\n }\n const mesh = new Mesh(geometry, this._visualMaterial!)\n mesh.position.set(body.position.x, body.position.y, body.position.z)\n this._meshContainer?.add(mesh)\n this._meshes.push(mesh)\n return mesh\n }\n\n // Lower legs - positions converted from Z-up to Y-up\n // Original: position(x, 0, lowerLegLength/2) -> ours: position(x, lowerLegLength/2, 0)\n const lowerLeftLeg = new Body({\n mass: this.mass,\n position: transformLocalToWorld(new Vector3(shouldersDistance / 2, lowerLegLength / 2, 0)),\n material: this.material,\n })\n const lowerRightLeg = new Body({\n mass: this.mass,\n position: transformLocalToWorld(new Vector3(-shouldersDistance / 2, lowerLegLength / 2, 0)),\n material: this.material,\n })\n lowerLeftLeg.addShape(lowerLegShape)\n lowerRightLeg.addShape(lowerLegShape)\n lowerLeftLeg.quaternion.set(baseQuat.x, baseQuat.y, baseQuat.z, baseQuat.w)\n lowerRightLeg.quaternion.set(baseQuat.x, baseQuat.y, baseQuat.z, baseQuat.w)\n this._bodies.push(lowerLeftLeg, lowerRightLeg)\n createMeshForBody(lowerLeftLeg)\n createMeshForBody(lowerRightLeg)\n\n // Upper legs\n const upperLeftLeg = new Body({\n mass: this.mass,\n position: transformLocalToWorld(new Vector3(shouldersDistance / 2, lowerLegLength + upperLegLength / 2, 0)),\n material: this.material,\n })\n const upperRightLeg = new Body({\n mass: this.mass,\n position: transformLocalToWorld(new Vector3(-shouldersDistance / 2, lowerLegLength + upperLegLength / 2, 0)),\n material: this.material,\n })\n upperLeftLeg.addShape(upperLegShape)\n upperRightLeg.addShape(upperLegShape)\n upperLeftLeg.quaternion.set(baseQuat.x, baseQuat.y, baseQuat.z, baseQuat.w)\n upperRightLeg.quaternion.set(baseQuat.x, baseQuat.y, baseQuat.z, baseQuat.w)\n this._bodies.push(upperLeftLeg, upperRightLeg)\n createMeshForBody(upperLeftLeg)\n createMeshForBody(upperRightLeg)\n\n // Pelvis\n const pelvisLocalY = lowerLegLength + upperLegLength + pelvisLength / 2\n const pelvis = new Body({\n mass: this.mass,\n position: transformLocalToWorld(new Vector3(0, pelvisLocalY, 0)),\n material: this.material,\n })\n pelvis.addShape(pelvisShape)\n pelvis.quaternion.set(baseQuat.x, baseQuat.y, baseQuat.z, baseQuat.w)\n this._bodies.push(pelvis)\n createMeshForBody(pelvis)\n\n // Upper body\n const upperBodyLocalY = pelvisLocalY + pelvisLength / 2 + upperBodyLength / 2\n const upperBody = new Body({\n mass: this.mass,\n position: transformLocalToWorld(new Vector3(0, upperBodyLocalY, 0)),\n material: this.material,\n })\n upperBody.addShape(upperBodyShape)\n upperBody.quaternion.set(baseQuat.x, baseQuat.y, baseQuat.z, baseQuat.w)\n this._bodies.push(upperBody)\n createMeshForBody(upperBody)\n\n // Head\n const headLocalY = upperBodyLocalY + upperBodyLength / 2 + headRadius + neckLength\n const head = new Body({\n mass: this.mass,\n position: transformLocalToWorld(new Vector3(0, headLocalY, 0)),\n material: this.material,\n })\n head.addShape(headShape)\n head.quaternion.set(baseQuat.x, baseQuat.y, baseQuat.z, baseQuat.w)\n this._bodies.push(head)\n createMeshForBody(head, true)\n\n // Upper arms - at shoulder height\n const armLocalY = upperBodyLocalY + upperBodyLength / 2\n const upperLeftArm = new Body({\n mass: this.mass,\n position: transformLocalToWorld(new Vector3(shouldersDistance / 2 + upperArmLength / 2, armLocalY, 0)),\n material: this.material,\n })\n const upperRightArm = new Body({\n mass: this.mass,\n position: transformLocalToWorld(new Vector3(-shouldersDistance / 2 - upperArmLength / 2, armLocalY, 0)),\n material: this.material,\n })\n upperLeftArm.addShape(upperArmShape)\n upperRightArm.addShape(upperArmShape)\n upperLeftArm.quaternion.set(baseQuat.x, baseQuat.y, baseQuat.z, baseQuat.w)\n upperRightArm.quaternion.set(baseQuat.x, baseQuat.y, baseQuat.z, baseQuat.w)\n this._bodies.push(upperLeftArm, upperRightArm)\n createMeshForBody(upperLeftArm)\n createMeshForBody(upperRightArm)\n\n // Lower arms\n const lowerLeftArm = new Body({\n mass: this.mass,\n position: transformLocalToWorld(new Vector3(\n shouldersDistance / 2 + upperArmLength + lowerArmLength / 2,\n armLocalY,\n 0\n )),\n material: this.material,\n })\n const lowerRightArm = new Body({\n mass: this.mass,\n position: transformLocalToWorld(new Vector3(\n -shouldersDistance / 2 - upperArmLength - lowerArmLength / 2,\n armLocalY,\n 0\n )),\n material: this.material,\n })\n lowerLeftArm.addShape(lowerArmShape)\n lowerRightArm.addShape(lowerArmShape)\n lowerLeftArm.quaternion.set(baseQuat.x, baseQuat.y, baseQuat.z, baseQuat.w)\n lowerRightArm.quaternion.set(baseQuat.x, baseQuat.y, baseQuat.z, baseQuat.w)\n this._bodies.push(lowerLeftArm, lowerRightArm)\n createMeshForBody(lowerLeftArm)\n createMeshForBody(lowerRightArm)\n\n // Store parts reference\n this._parts = {\n lowerLeftLeg,\n lowerRightLeg,\n upperLeftLeg,\n upperRightLeg,\n pelvis,\n upperBody,\n head,\n upperLeftArm,\n upperRightArm,\n lowerLeftArm,\n lowerRightArm,\n }\n\n // Add bodies to world\n for (const body of this._bodies) {\n this._cannon.world.addBody(body)\n }\n\n // CONSTRAINTS - Convert from Z-up to Y-up\n // Original uses UNIT_Z for vertical axis, we use UNIT_Y\n // Pivots: original (x, y, z) where z is height -> ours (x, y, z) where y is height\n // So pivot (x, 0, z) -> (x, z, 0)\n\n // Neck joint\n // Original: pivotA(0, 0, -headRadius - neckLength/2), pivotB(0, 0, upperBodyLength/2)\n // Ours: pivotA(0, -headRadius - neckLength/2, 0), pivotB(0, upperBodyLength/2, 0)\n const neckJoint = new ConeTwistConstraint(head, upperBody, {\n pivotA: new Vec3(0, -headRadius - neckLength / 2, 0),\n pivotB: new Vec3(0, upperBodyLength / 2, 0),\n axisA: Vec3.UNIT_Y,\n axisB: Vec3.UNIT_Y,\n angle,\n twistAngle,\n })\n this._constraints.push(neckJoint)\n\n // Knee joints\n // Original: pivotA(0, 0, lowerLegLength/2), pivotB(0, 0, -upperLegLength/2)\n // Ours: pivotA(0, lowerLegLength/2, 0), pivotB(0, -upperLegLength/2, 0)\n const leftKneeJoint = new ConeTwistConstraint(lowerLeftLeg, upperLeftLeg, {\n pivotA: new Vec3(0, lowerLegLength / 2, 0),\n pivotB: new Vec3(0, -upperLegLength / 2, 0),\n axisA: Vec3.UNIT_Y,\n axisB: Vec3.UNIT_Y,\n angle,\n twistAngle,\n })\n const rightKneeJoint = new ConeTwistConstraint(lowerRightLeg, upperRightLeg, {\n pivotA: new Vec3(0, lowerLegLength / 2, 0),\n pivotB: new Vec3(0, -upperLegLength / 2, 0),\n axisA: Vec3.UNIT_Y,\n axisB: Vec3.UNIT_Y,\n angle,\n twistAngle,\n })\n this._constraints.push(leftKneeJoint, rightKneeJoint)\n\n // Hip joints\n // Original: pivotA(0, 0, upperLegLength/2), pivotB(shouldersDistance/2, 0, -pelvisLength/2)\n // Ours: pivotA(0, upperLegLength/2, 0), pivotB(shouldersDistance/2, -pelvisLength/2, 0)\n const leftHipJoint = new ConeTwistConstraint(upperLeftLeg, pelvis, {\n pivotA: new Vec3(0, upperLegLength / 2, 0),\n pivotB: new Vec3(shouldersDistance / 2, -pelvisLength / 2, 0),\n axisA: Vec3.UNIT_Y,\n axisB: Vec3.UNIT_Y,\n angle,\n twistAngle,\n })\n const rightHipJoint = new ConeTwistConstraint(upperRightLeg, pelvis, {\n pivotA: new Vec3(0, upperLegLength / 2, 0),\n pivotB: new Vec3(-shouldersDistance / 2, -pelvisLength / 2, 0),\n axisA: Vec3.UNIT_Y,\n axisB: Vec3.UNIT_Y,\n angle,\n twistAngle,\n })\n this._constraints.push(leftHipJoint, rightHipJoint)\n\n // Spine\n // Original: pivotA(0, 0, pelvisLength/2), pivotB(0, 0, -upperBodyLength/2)\n // Ours: pivotA(0, pelvisLength/2, 0), pivotB(0, -upperBodyLength/2, 0)\n const spineJoint = new ConeTwistConstraint(pelvis, upperBody, {\n pivotA: new Vec3(0, pelvisLength / 2, 0),\n pivotB: new Vec3(0, -upperBodyLength / 2, 0),\n axisA: Vec3.UNIT_Y,\n axisB: Vec3.UNIT_Y,\n angle,\n twistAngle,\n })\n this._constraints.push(spineJoint)\n\n // Shoulders - In Y-up world, arms need to rotate around Z axis to swing down\n // The cone axis should be Z so the arm can swing in the X-Y plane (up/down motion)\n const leftShoulder = new ConeTwistConstraint(upperBody, upperLeftArm, {\n pivotA: new Vec3(shouldersDistance / 2, upperBodyLength / 2, 0),\n pivotB: new Vec3(-upperArmLength / 2, 0, 0),\n axisA: Vec3.UNIT_Z,\n axisB: Vec3.UNIT_Z,\n angle: angleShoulders,\n twistAngle,\n })\n const rightShoulder = new ConeTwistConstraint(upperBody, upperRightArm, {\n pivotA: new Vec3(-shouldersDistance / 2, upperBodyLength / 2, 0),\n pivotB: new Vec3(upperArmLength / 2, 0, 0),\n axisA: Vec3.UNIT_Z,\n axisB: Vec3.UNIT_Z,\n angle: angleShoulders,\n twistAngle,\n })\n this._constraints.push(leftShoulder, rightShoulder)\n\n // Elbow joints - also need Z axis for bending in Y-up world\n const leftElbowJoint = new ConeTwistConstraint(lowerLeftArm, upperLeftArm, {\n pivotA: new Vec3(-lowerArmLength / 2, 0, 0),\n pivotB: new Vec3(upperArmLength / 2, 0, 0),\n axisA: Vec3.UNIT_Z,\n axisB: Vec3.UNIT_Z,\n angle,\n twistAngle,\n })\n const rightElbowJoint = new ConeTwistConstraint(lowerRightArm, upperRightArm, {\n pivotA: new Vec3(lowerArmLength / 2, 0, 0),\n pivotB: new Vec3(-upperArmLength / 2, 0, 0),\n axisA: Vec3.UNIT_Z,\n axisB: Vec3.UNIT_Z,\n angle,\n twistAngle,\n })\n this._constraints.push(leftElbowJoint, rightElbowJoint)\n\n // Store constraints reference\n this._ragdollConstraints = {\n neckJoint,\n leftKneeJoint,\n rightKneeJoint,\n leftHipJoint,\n rightHipJoint,\n spineJoint,\n leftShoulder,\n rightShoulder,\n leftElbowJoint,\n rightElbowJoint,\n }\n\n // Add constraints to world\n for (const constraint of this._constraints) {\n this._cannon.world.addConstraint(constraint)\n }\n\n // Store initial object transform for tracking movement\n this.object.getWorldPosition(this._lastObjectPosition)\n this.object.getWorldQuaternion(this._lastObjectQuaternion)\n this._initialized = true\n }\n\n private _removeRagdoll() {\n // Remove constraints from world\n for (const constraint of this._constraints) {\n this._cannon?.world.removeConstraint(constraint)\n }\n this._constraints = []\n this._ragdollConstraints = null\n\n // Remove bodies from world\n for (const body of this._bodies) {\n this._cannon?.world.removeBody(body)\n }\n this._bodies = []\n this._parts = null\n\n // Remove and dispose meshes\n for (const mesh of this._meshes) {\n mesh.geometry.dispose()\n this._meshContainer?.remove(mesh)\n }\n this._meshes = []\n }\n\n /**\n * Reset the ragdoll to its initial position relative to the object\n */\n resetPosition() {\n if (!this._parts) return\n\n const basePos = this.object.getWorldPosition(new Vector3())\n const scale = this.scale\n\n const shouldersDistance = 0.5 * scale\n const lowerLegLength = 0.5 * scale\n const upperLegLength = 0.5 * scale\n const pelvisLength = 0.4 * scale\n const upperBodyLength = 0.6 * scale\n const headRadius = 0.25 * scale\n const neckLength = 0.1 * scale\n const upperArmLength = 0.4 * scale\n const lowerArmLength = 0.4 * scale\n\n const resetBody = (body: Body, pos: Vec3) => {\n body.position.copy(pos)\n body.velocity.set(0, 0, 0)\n body.angularVelocity.set(0, 0, 0)\n body.quaternion.set(0, 0, 0, 1)\n }\n\n resetBody(this._parts.lowerLeftLeg, new Vec3(\n basePos.x + shouldersDistance / 2,\n basePos.y + lowerLegLength / 2,\n basePos.z\n ))\n resetBody(this._parts.lowerRightLeg, new Vec3(\n basePos.x - shouldersDistance / 2,\n basePos.y + lowerLegLength / 2,\n basePos.z\n ))\n resetBody(this._parts.upperLeftLeg, new Vec3(\n basePos.x + shouldersDistance / 2,\n basePos.y + lowerLegLength + upperLegLength / 2,\n basePos.z\n ))\n resetBody(this._parts.upperRightLeg, new Vec3(\n basePos.x - shouldersDistance / 2,\n basePos.y + lowerLegLength + upperLegLength / 2,\n basePos.z\n ))\n\n const pelvisY = basePos.y + lowerLegLength + upperLegLength + pelvisLength / 2\n resetBody(this._parts.pelvis, new Vec3(basePos.x, pelvisY, basePos.z))\n\n const upperBodyY = pelvisY + pelvisLength / 2 + upperBodyLength / 2\n resetBody(this._parts.upperBody, new Vec3(basePos.x, upperBodyY, basePos.z))\n\n const headY = upperBodyY + upperBodyLength / 2 + headRadius + neckLength\n resetBody(this._parts.head, new Vec3(basePos.x, headY, basePos.z))\n\n const armY = upperBodyY + upperBodyLength / 2\n resetBody(this._parts.upperLeftArm, new Vec3(\n basePos.x + shouldersDistance / 2 + upperArmLength / 2,\n armY,\n basePos.z\n ))\n resetBody(this._parts.upperRightArm, new Vec3(\n basePos.x - shouldersDistance / 2 - upperArmLength / 2,\n armY,\n basePos.z\n ))\n resetBody(this._parts.lowerLeftArm, new Vec3(\n basePos.x + shouldersDistance / 2 + upperArmLength + lowerArmLength / 2,\n armY,\n basePos.z\n ))\n resetBody(this._parts.lowerRightArm, new Vec3(\n basePos.x - shouldersDistance / 2 - upperArmLength - lowerArmLength / 2,\n armY,\n basePos.z\n ))\n\n this.object.setDirty?.({ source: 'CannonRagdollComponent' })\n }\n\n /**\n * Apply an impulse to all bodies\n */\n applyImpulse(impulse: Vec3, worldPoint?: Vec3) {\n for (const body of this._bodies) {\n body.applyImpulse(impulse, worldPoint || body.position)\n }\n }\n\n /**\n * Apply an impulse to a specific body part\n */\n applyImpulseToPart(partName: keyof RagdollParts, impulse: Vec3, worldPoint?: Vec3) {\n if (!this._parts) return\n const body = this._parts[partName]\n if (body) {\n body.applyImpulse(impulse, worldPoint || body.position)\n }\n }\n\n private _updateMeshVisibility() {\n if (this._meshContainer) {\n this._meshContainer.visible = !this.hideRagdollMeshes\n }\n }\n\n private _findCharacterMeshes() {\n this._characterMeshes = []\n this.object.traverse((child) => {\n if ((child as unknown as SkinnedMesh).isSkinnedMesh) {\n this._characterMeshes.push(child as unknown as SkinnedMesh)\n }\n })\n }\n\n private _buildBoneMap() {\n this._boneMap.clear()\n this.object.traverse((child) => {\n if ((child as Bone).isBone) {\n const bone = child as Bone\n // Map by exact name\n this._boneMap.set(bone.name, bone)\n // Also map by lowercase for case-insensitive matching\n this._boneMap.set(bone.name.toLowerCase(), bone)\n }\n })\n }\n\n private _findBone(boneNames: string[]): Bone | null {\n for (const name of boneNames) {\n const bone = this._boneMap.get(name) || this._boneMap.get(name.toLowerCase())\n if (bone) return bone\n }\n return null\n }\n\n private _getBoneWorldPosition(bone: Bone): Vector3 {\n bone.getWorldPosition(this._tempWorldPos)\n return this._tempWorldPos.clone()\n }\n\n private _getBoneWorldQuaternion(bone: Bone): Quaternion {\n bone.getWorldQuaternion(this._tempWorldQuat)\n return this._tempWorldQuat.clone()\n }\n\n start() {\n super.start();\n setTimeout(()=>{\n this.activate();\n }, 2000)\n }\n\n /**\n * Activates the ragdoll physics simulation.\n * Call this when the character should start ragdolling (e.g., on death).\n * @param impulse Optional initial impulse to apply (e.g., from bullet impact)\n * @param impactPoint Optional world point where impulse is applied\n */\n activate(impulse?: Vec3, impactPoint?: Vec3) {\n if (this._isActive) return\n\n // Create ragdoll if not created yet\n if (!this._parts) {\n this._createRagdoll()\n }\n\n // Store initial bone quaternions (local space) before activation\n this._storeInitialBoneQuats()\n\n // Store initial body quaternions (world space)\n this._storeInitialBodyQuats()\n\n // Activate physics bodies (make them dynamic)\n this._activateBodies()\n\n // Show ragdoll meshes if not hidden\n if (this._meshContainer) {\n this._meshContainer.visible = !this.hideRagdollMeshes\n }\n\n // Apply initial impulse if provided\n if (impulse) {\n // Apply impulse to central body parts (pelvis, upperBody, head)\n // Limbs will follow naturally due to constraints and gravity\n if (this._parts) {\n this._parts.pelvis.applyImpulse(impulse, new Vec3(0, 0, 0))\n this._parts.upperBody.applyImpulse(impulse, new Vec3(0, 0, 0))\n this._parts.head.applyImpulse(impulse, new Vec3(0, 0, 0))\n }\n }\n\n this._isActive = true\n }\n\n /**\n * Store initial bone quaternions (both local and world space) for rotation offset calculation\n */\n private _storeInitialBoneQuats() {\n this._initialBoneQuats.clear()\n this._initialBoneWorldQuats.clear()\n\n const storeBoneQuat = (boneNames: string[]) => {\n const bone = this._findBone(boneNames)\n if (bone) {\n // Store local quaternion\n this._initialBoneQuats.set(bone.name, bone.quaternion.clone())\n // Store world quaternion\n const worldQuat = new Quaternion()\n bone.getWorldQuaternion(worldQuat)\n this._initialBoneWorldQuats.set(bone.name, worldQuat)\n }\n }\n\n storeBoneQuat(this._boneNames.head)\n storeBoneQuat(this._boneNames.spine2)\n storeBoneQuat(this._boneNames.hips)\n storeBoneQuat(this._boneNames.leftUpLeg)\n storeBoneQuat(this._boneNames.rightUpLeg)\n storeBoneQuat(this._boneNames.leftLeg)\n storeBoneQuat(this._boneNames.rightLeg)\n storeBoneQuat(this._boneNames.leftArm)\n storeBoneQuat(this._boneNames.rightArm)\n storeBoneQuat(this._boneNames.leftForeArm)\n storeBoneQuat(this._boneNames.rightForeArm)\n }\n\n /**\n * Store initial body quaternions (world space) for rotation offset calculation\n */\n private _storeInitialBodyQuats() {\n this._initialBodyQuats.clear()\n\n for (const body of this._bodies) {\n this._initialBodyQuats.set(body, new Quaternion(\n body.quaternion.x,\n body.quaternion.y,\n body.quaternion.z,\n body.quaternion.w\n ))\n }\n }\n\n /**\n * Deactivates the ragdoll and restores the character.\n * Call this to reset the character to normal state.\n */\n deactivate() {\n if (!this._isActive) return\n\n // Deactivate physics bodies (make them kinematic)\n this._deactivateBodies()\n\n // Show character mesh, hide ragdoll\n this._setCharacterVisible(true)\n if (this._meshContainer) {\n this._meshContainer.visible = false\n }\n\n this._isActive = false\n }\n\n private _matchBonesToRagdoll() {\n if (!this._parts) return\n\n // Match each ragdoll body to its corresponding bone position\n const matchBodyToBone = (body: Body, boneNames: string[]) => {\n const bone = this._findBone(boneNames)\n if (bone) {\n const worldPos = this._getBoneWorldPosition(bone)\n const worldQuat = this._getBoneWorldQuaternion(bone)\n body.position.set(worldPos.x, worldPos.y, worldPos.z)\n body.quaternion.set(worldQuat.x, worldQuat.y, worldQuat.z, worldQuat.w)\n body.velocity.set(0, 0, 0)\n body.angularVelocity.set(0, 0, 0)\n }\n }\n\n matchBodyToBone(this._parts.head, this._boneNames.head)\n matchBodyToBone(this._parts.upperBody, this._boneNames.spine2)\n matchBodyToBone(this._parts.pelvis, this._boneNames.hips)\n matchBodyToBone(this._parts.upperLeftLeg, this._boneNames.leftUpLeg)\n matchBodyToBone(this._parts.upperRightLeg, this._boneNames.rightUpLeg)\n matchBodyToBone(this._parts.lowerLeftLeg, this._boneNames.leftLeg)\n matchBodyToBone(this._parts.lowerRightLeg, this._boneNames.rightLeg)\n matchBodyToBone(this._parts.upperLeftArm, this._boneNames.leftArm)\n matchBodyToBone(this._parts.upperRightArm, this._boneNames.rightArm)\n matchBodyToBone(this._parts.lowerLeftArm, this._boneNames.leftForeArm)\n matchBodyToBone(this._parts.lowerRightArm, this._boneNames.rightForeArm)\n }\n\n private _activateBodies() {\n for (const body of this._bodies) {\n body.type = Body.DYNAMIC\n body.mass = this.mass\n body.updateMassProperties()\n body.wakeUp()\n }\n }\n\n private _deactivateBodies() {\n for (const body of this._bodies) {\n body.type = Body.KINEMATIC\n body.mass = 0\n body.velocity.set(0, 0, 0)\n body.angularVelocity.set(0, 0, 0)\n }\n }\n\n private _setCharacterVisible(visible: boolean) {\n for (const mesh of this._characterMeshes) {\n mesh.visible = visible\n }\n }\n\n private _findClosestBody(point: Vec3): Body | null {\n let closest: Body | null = null\n let minDist = Infinity\n\n for (const body of this._bodies) {\n const dx = body.position.x - point.x\n const dy = body.position.y - point.y\n const dz = body.position.z - point.z\n const dist = dx * dx + dy * dy + dz * dz\n\n if (dist < minDist) {\n minDist = dist\n closest = body\n }\n }\n\n return closest\n }\n}\n","import {Body, ContactMaterial, Material as CannonMaterial, Shape, World} from \"cannon-es\"\nimport {\n AViewerPluginSync,\n EntityComponentPlugin,\n FrameFadePlugin, generateUUID,\n IObject3D,\n IViewerEvent,\n Matrix4,\n Object3DWidgetsPlugin,\n Quaternion,\n serialize,\n ThreeSerialization,\n ThreeViewer,\n TObject3DComponent,\n TypeSystem,\n uiConfig,\n uiFolderContainer, uiInput, uiMonitor, uiNumber,\n uiToggle,\n Vector3\n} from \"threepipe\"\nimport {Cannon3DShapeComponent, Cannon3DShapeHelper} from \"./Cannon3DShapeComponent.ts\";\nimport {Cannon3DBodyComponent} from \"./Cannon3DBodyComponent.ts\";\nimport {CannonRagdollComponent} from \"./CannonRagdollComponent.ts\";\n\n@uiFolderContainer('Cannon Material')\nexport class CannonMaterial2 extends CannonMaterial{\n @uiInput()\n declare name: string\n @uiMonitor()\n uuid: string = generateUUID()\n @uiNumber()\n declare friction\n @uiNumber()\n declare restitution\n}\nThreeSerialization.MakeSerializable(CannonMaterial as any, 'CannonMaterial', ['friction', 'restitution']) // this is not needed actually, but just in case\nThreeSerialization.MakeSerializable(CannonMaterial2 as any, 'CannonMaterial', ['name', 'uuid', 'friction', 'restitution']) // this should be after CannonMaterial\nThreeSerialization.MakeSerializable(ContactMaterial as any, 'CannonContactMaterial', [/* 'materials', */'friction', 'restitution', 'contactEquationStiffness', 'contactEquationRelaxation', 'frictionEquationStiffness', 'frictionEquationRelaxation'])\nTypeSystem.AddClass({\n key: 'CannonMaterial',\n getId(obj: CannonMaterial2) {\n return obj.uuid\n },\n getLabel(obj?: CannonMaterial2) {\n return obj ? obj.name : 'Cannon Material'\n },\n setName(obj: CannonMaterial2, name: string) {\n obj.name = name\n },\n ctor: CannonMaterial2,\n})\n\n// uses https://github.com/pmndrs/cannon-es\n\n@uiFolderContainer('Physics')\nexport class CannonPhysicsPlugin extends AViewerPluginSync {\n public static readonly PluginType = 'CannonPhysicsPlugin'\n private _world: World = new World()\n get world() { return this._world }\n // dependencies: Class<IViewerPlugin<any>>[]\n\n @serialize()\n @uiToggle()\n enabled = true\n\n static CannonTypes = {\n Body, Shape, World, Material: CannonMaterial, ContactMaterial,\n }\n @uiToggle('Running', (_that: CannonPhysicsPlugin)=>({onChange: ()=>{return}}))\n running = true\n\n nextSteps = 0\n\n @uiConfig()\n stepPhysics: any = {\n stepCount: 100,\n delta: 0.1,\n step: () => {\n this.nextSteps = this.stepPhysics.stepCount\n },\n }\n\n @uiConfig()\n @serialize()\n defaultMaterial = new CannonMaterial2('default')\n\n // @uiButton('Make Root Bodies')\n // makeRootBodies = () => {\n // this._viewer?.scene.modelRoot.children.forEach((child) => {\n // this.makeBody(child)\n // })\n // }\n\n // stepMultiple = () => {\n // console.log(this.enabled, this.nextSteps)\n // if (this.enabled) return\n // this.nextSteps = 100\n // // this.enabled = true\n // // this._viewer?.doOnce('postFrame', () => {\n // // // Step the physics world\n // // for (let i = 0; i < 100; i++) {\n // // this._world.step(0.1)\n // // }\n // // // this._viewer?.doOnce('postFrame', () => {\n // // // this.enabled = false\n // // // })\n // // })\n // // this._viewer?.setDirty()\n // }\n\n constructor(enabled = true, running = false) {\n super()\n this.enabled = enabled\n this.running = running\n\n // replaced for UI\n this.defaultMaterial.friction = 0\n this.defaultMaterial.restitution = 0\n this._world.defaultMaterial = this.defaultMaterial\n this._world.defaultContactMaterial.materials = [this.defaultMaterial, this.defaultMaterial]\n\n const collisionEv: CollisionEvent = {} as any\n this._world.addEventListener('beginContact', (e: any)=>{\n const compA = this.cannonBodies.get(e.bodyA)\n const compB = this.cannonBodies.get(e.bodyB)\n if(!compA || !compB){\n console.warn('[CannonPhysicsPlugin] Contact bodies not managed by plugin', e.bodyA, e.bodyB)\n return\n }\n collisionEv.object = compB.object\n collisionEv.body = compB\n EntityComponentPlugin.ObjectDispatch(compA.object, 'onBeginContact', collisionEv)\n collisionEv.object = compA.object\n collisionEv.body = compA\n EntityComponentPlugin.ObjectDispatch(compB.object, 'onBeginContact', collisionEv)\n })\n this._world.addEventListener('endContact', (e: any)=>{\n const compA = this.cannonBodies.get(e.bodyA)\n const compB = this.cannonBodies.get(e.bodyB)\n if(!compA || !compB){\n console.warn('[CannonPhysicsPlugin] Contact bodies not managed by plugin', e.bodyA, e.bodyB)\n return\n }\n collisionEv.object = compB.object\n collisionEv.body = compB\n EntityComponentPlugin.ObjectDispatch(compA.object, 'onEndContact', collisionEv)\n collisionEv.object = compA.object\n collisionEv.body = compA\n EntityComponentPlugin.ObjectDispatch(compB.object, 'onEndContact', collisionEv)\n })\n // this._world.addEventListener('beginShapeContact', (e)=>{\n // console.log(e)\n // })\n // this._world.addEventListener('endShapeContact', (e)=>{\n // console.log(e)\n // })\n // this._world.addEventListener(Body.COLLIDE_EVENT_NAME, (e)=>{\n // console.log(e)\n // })\n this._world.gravity.set(0, -9.81, 0)\n // this._world.gravity.set(0, 0, 0)\n\n //\n // // Max solver iterations: Use more for better force propagation, but keep in mind that it's not very computationally cheap!\n // this._world.solver.iterations = 20\n //\n // // Tweak contact properties.\n // // Contact stiffness - use to make softer/harder contacts\n // this._world.defaultContactMaterial.contactEquationStiffness = 1e10\n // this._world.defaultContactMaterial.contactEquationRelaxation = 10\n //\n\n // coeff of restitution: 0 = no bounce, 1 = perfect bounce\n\n // test\n\n // const mat = new CannonMaterial('defaultMat')\n // mat.friction = 0.351\n // mat.restitution = 0.63\n // const contactMat = new ContactMaterial(mat, mat, {friction: 0.13, restitution: 0.563})\n //\n // const mjson = ThreeSerialization.Serialize(mat)\n // const mat2 = ThreeSerialization.Deserialize(mjson, null) as CannonMaterial\n // const mat3 = ThreeSerialization.Deserialize(mjson, mat) as CannonMaterial\n // console.log(mjson, mat2, mat3, mat3 === mat)\n //\n // const cmjson = ThreeSerialization.Serialize(contactMat)\n // const contactMat2 = ThreeSerialization.Deserialize(cmjson, null) as ContactMaterial\n // const contactMat3 = ThreeSerialization.Deserialize(cmjson, contactMat) as ContactMaterial\n // console.log(cmjson, contactMat2, contactMat3, contactMat3 === contactMat)\n\n }\n\n dependencies = [EntityComponentPlugin]\n\n // private _bodyMeshMap = new WeakMap<Body, Object3D>()\n\n private _v1 = new Vector3()\n private _v2 = new Vector3()\n private _s2 = new Vector3()\n private _q1 = new Quaternion()\n private _q2 = new Quaternion()\n private _m1 = new Matrix4()\n private _m2 = new Matrix4()\n frameFadeToggled = false\n\n protected _preFrame = (e: IViewerEvent) => {\n const viewer = this._viewer\n if (!viewer) return\n if(this.isDisabled()) return\n const frameFadePlugin = viewer.getPlugin(FrameFadePlugin)\n // todo use isDisabled\n if (!this.running) {\n if (this.nextSteps > 0) this.running = true\n else {\n if (frameFadePlugin && this.frameFadeToggled) {\n frameFadePlugin.enable(CannonPhysicsPlugin.PluginType)\n this.frameFadeToggled = false\n }\n this._dirty = false\n return\n }\n }\n if (frameFadePlugin && !this.frameFadeToggled) {\n frameFadePlugin.disable(CannonPhysicsPlugin.PluginType)\n }\n\n try {\n // Step the physics world\n if (this.nextSteps > 0) {\n for (let i = 0; i < this.stepPhysics.stepCount; i++) {\n this._world.step(this.stepPhysics.delta)\n }\n } else {\n // todo use dt\n // const dt = e.deltaTime\n this._world.fixedStep()\n }\n }catch (e) {\n console.error('[CannonPhysicsPlugin] Error stepping physics world')\n console.error(e)\n }\n\n this._dirty = false\n let dirty = false\n // Update the bodies\n for (const bodyC of this.bodyComponents.values()) {\n if (bodyC.mass === 0) continue\n const mesh = bodyC.object\n const body = bodyC.body\n if (!mesh) continue\n dirty = false\n mesh.updateWorldMatrix(true, false)\n mesh.getWorldPosition(this._v2)\n mesh.getWorldQuaternion(this._q2)\n mesh.getWorldScale(this._s2)\n this._v1.copy(body.position)\n if (!dirty && this._v2.manhattanDistanceTo(this._v1) > 0) {\n dirty = true\n // world = parent.local\n // parent-1 . world = local\n }\n this._q1.copy(body.quaternion as any)\n if (!dirty && this._q2.angleTo(this._q1) > 0) {\n dirty = true\n }\n if (dirty) {\n this._m1.compose(this._v1, this._q1, this._s2)\n if (!mesh.parent) {\n // throw new Error('no parent')\n console.error('[CannonPhysicsPlugin] Mesh has no parent, cannot set world transform', mesh)\n }else {\n this._m2.copy(mesh.parent.matrixWorld).invert()\n this._m2.multiply(this._m1)\n this._m2.decompose(this._v1, this._q1, this._s2)\n mesh.position.copy(this._v1)\n mesh.quaternion.copy(this._q1)\n mesh.setDirty && mesh.setDirty({change: 'transform', source: 'CannonPhysicsPlugin'})\n }\n }\n }\n this._dirty = dirty\n viewer.setDirty()\n // viewer.scene.setDirty({sceneUpdate: false})\n viewer.renderManager.resetShadows()\n\n if (this.nextSteps > 0) {\n this.running = false\n this.nextSteps = 0\n }\n }\n\n private _onRemove: (()=>void)[] = []\n\n async onAdded(viewer: ThreeViewer): Promise<\n void> {\n super.onAdded(viewer)\n\n const offUpdate = viewer.on('preFrame', {\n order: -1, // before most things\n callback: this._preFrame,\n })\n if (offUpdate) this._onRemove.push(offUpdate)\n\n Object.values(this.componentTypes).forEach((compType) => {\n viewer.getPlugin(EntityComponentPlugin)?.addComponentType(compType)\n })\n\n viewer.object3dManager.getObjects().forEach(object=>this._objectAdd({object}))\n viewer.object3dManager.addEventListener('objectAdd', this._objectAdd)\n viewer.object3dManager.addEventListener('objectRemove', this._objectRemove)\n\n viewer.forPlugin(Object3DWidgetsPlugin, (wplugin) => {\n wplugin.helpers.push(Cannon3DShapeHelper)\n }, (wplugin)=>{\n const i = wplugin.helpers.indexOf(Cannon3DShapeHelper)\n if (i >= 0) wplugin.helpers.splice(i, 1)\n })\n\n // viewer.scene.addEventListener('update', (e) => {\n // this._bodyMeshMap.forEach((mesh, body) => {\n // body.velocity.set(0, 0, 0)\n // body.angularVelocity.set(0, 0, 0)\n // })\n // })\n }\n\n private _objectAdd = (e: {object?: IObject3D})=>{\n const obj = e.object\n // console.log('pbject add', obj?.name, obj?.userData, obj)\n if (obj?.userData?.physicsMass === undefined) return\n const ecs = this._viewer?.getPlugin(EntityComponentPlugin)\n if (!ecs) return\n const existing = EntityComponentPlugin.GetComponentData(obj, this.componentTypes.body)\n if (existing) return\n // const pBody = ecs.addComponent(obj, this.componentTypes.body).component\n // const pShape = ecs.addComponent(obj, this.componentTypes.shape).component\n // if (!pBody || !pShape) return\n // pBody.mass = typeof obj.userData.physicsMass === 'number' ? obj.userData.physicsMass : 0\n // if (obj.userData.physicsBodyType !== undefined) {\n // if (typeof obj.userData.physicsBodyType === 'string' && physicsBodyType.includes(obj.userData.physicsBodyType as PhysicsBodyType)) {\n // pBody.type = obj.userData.physicsBodyType as PhysicsBodyType\n // }\n // }\n // if (obj.userData.physicsShape !== undefined) {\n // if (typeof obj.userData.physicsShape === 'string' && cannonShapeTypes.includes(obj.userData.physicsShape as CannonShapeType)) {\n // pShape.type = obj.userData.physicsShape as CannonShapeType\n // }\n // }\n }\n\n private _objectRemove = (e: {object?: IObject3D})=>{\n const obj = e.object\n if (!obj?.userData?.physicsMass === undefined) return\n\n }\n\n onRemove(viewer: ThreeViewer) {\n this._onRemove.forEach(off=>off())\n Object.values(this.componentTypes).forEach((compType) => {\n viewer.getPlugin(EntityComponentPlugin)?.removeComponentType(compType)\n })\n viewer.object3dManager.removeEventListener('objectAdd', this._objectAdd)\n viewer.object3dManager.removeEventListener('objectRemove', this._objectRemove)\n viewer.object3dManager.getObjects().forEach(object=>this._objectRemove({object}))\n\n // todo assert all bodies removed?\n\n super.onRemove(viewer)\n }\n\n readonly componentTypes = {\n body: Cannon3DBodyComponent,\n shape: Cannon3DShapeComponent,\n ragdoll: CannonRagdollComponent,\n } satisfies Record<string, TObject3DComponent>\n\n bodyComponents = new Set<Cannon3DBodyComponent>()\n cannonBodies = new WeakMap<Body, Cannon3DBodyComponent>()\n addBody(body: Cannon3DBodyComponent) {\n if (this.bodyComponents.has(body)) return\n this.bodyComponents.add(body)\n this._world.addBody(body.body)\n this.cannonBodies.set(body.body, body)\n // this._bodyMeshMap.set(body.body, body.object)\n // this._viewer?.setDirty()\n }\n removeBody(body: Cannon3DBodyComponent) {\n if (!this.bodyComponents.has(body)) return\n this.bodyComponents.delete(body)\n this._world.removeBody(body.body)\n this.cannonBodies.delete(body.body)\n // this._bodyMeshMap.delete(body.body)\n // this._viewer?.setDirty()\n }\n\n}\n\nexport interface CollisionEvent{\n object: IObject3D\n body: Cannon3DBodyComponent\n}\ndeclare module 'threepipe'{\n interface Object3DComponent{\n onBeginContact?(collisionEvent: any):void\n onEndContact?(collisionEvent: any):void\n\n }\n}\n","import {\n copyObject3DUserData,\n getPartialProps,\n IMaterial,\n ImportResult,\n ImportResultExtras,\n IObject3D,\n Quaternion,\n setPartialProps,\n ThreeViewer,\n Vector3,\n} from 'threepipe'\n\ntype RuntimeErrorHandler = (error: unknown) => void\n\nconst defaultObjectOverrides = ['visible', 'name', 'position', 'quaternion', 'scale']\nconst defaultMaterialOverrides = ['name']\nconst objectProperties: (keyof IObject3D)[] = [\n 'position',\n 'quaternion',\n 'scale',\n 'visible',\n 'castShadow',\n 'receiveShadow',\n 'frustumCulled',\n 'renderOrder',\n]\n\n/**\n * Loads the embedded rootPath references written by the editor's AssetTracker.\n * This is deliberately runtime-only: it keeps root overrides, but has no file\n * watching, picking, export hooks, refresh subscriptions, or editor registry.\n */\nexport class RuntimeNestedAssetLoader {\n private readonly importer: ThreeViewer['assetManager']['importer']\n private readonly cache = new Map<string, Promise<ImportResult | undefined>>()\n private readonly pending = new Set<Promise<void>>()\n\n constructor(\n private readonly viewer: ThreeViewer,\n private readonly onError: RuntimeErrorHandler,\n ) {\n this.importer = viewer.assetManager.importer\n this.importer.addEventListener('processRaw', this.onProcessRaw)\n }\n\n dispose() {\n this.importer.removeEventListener('processRaw', this.onProcessRaw)\n this.cache.clear()\n this.pending.clear()\n }\n\n async loadObjectDependencies(object: IObject3D): Promise<void> {\n if (!object.traverse) return\n\n const objects: IObject3D[] = []\n const materials = new Set<IMaterial>()\n object.traverse((child: IObject3D) => {\n objects.push(child)\n const material = (child as IObject3D & {material?: IMaterial | IMaterial[]}).material\n if (material) {\n const entries = Array.isArray(material) ? material : [material]\n entries.forEach((entry) => entry?.isMaterial && materials.add(entry))\n }\n })\n\n const loads: Promise<void>[] = []\n for (const child of objects) {\n if (!this.isEmbeddedReference(child)) continue\n if (child._loadingPromise) {\n loads.push(child._loadingPromise.then(() => undefined))\n continue\n }\n\n if (!(child.userData.sProperties as string[]).length) {\n child.userData.sProperties = [...defaultObjectOverrides]\n }\n child._sChildren ||= []\n const load = this.loadReference(child)\n child._loadingPromise = load\n loads.push(load)\n }\n\n for (const material of materials) {\n if (!this.isEmbeddedReference(material)) continue\n if (material._loadingPromise) {\n loads.push(material._loadingPromise.then(() => undefined))\n continue\n }\n\n if (!(material.userData.sProperties as string[]).length) {\n material.userData.sProperties = [...defaultMaterialOverrides]\n }\n const load = this.loadReference(material)\n material._loadingPromise = load\n loads.push(load)\n }\n\n if (!loads.length) return\n const loading = Promise.allSettled(loads).then((results) => {\n for (const result of results) {\n if (result.status === 'rejected') this.onError(result.reason)\n }\n })\n object._loadingPromise = loading\n this.track(loading)\n await loading\n }\n\n async waitForPending(): Promise<void> {\n while (this.pending.size) {\n await Promise.all([...this.pending])\n }\n }\n\n private readonly onProcessRaw = (event: {data?: ImportResult}) => {\n const object = event.data\n if (!object?.isObject3D) return\n const loading = this.loadObjectDependencies(object as IObject3D)\n this.track(loading)\n }\n\n private isEmbeddedReference(value: IObject3D | IMaterial): boolean {\n const rootPath = value.userData?.rootPath\n return typeof rootPath === 'string'\n && !(value as ImportResultExtras).__rootPath\n && !value.userData.rootPathRefresh\n && Array.isArray(value.userData.sProperties)\n }\n\n private loadAsset(path: string, options: Record<string, unknown> | undefined) {\n let loading = this.cache.get(path)\n if (!loading) {\n loading = this.importer.importSingle(path, options || {})\n this.cache.set(path, loading)\n }\n return loading\n }\n\n private async loadReference(target: IObject3D | IMaterial): Promise<void> {\n const path = target.userData.rootPath as string\n const imported = await this.loadAsset(path, target.userData.rootPathOptions)\n if (!imported) throw new Error(`Unable to load nested asset from ${path}`)\n if (imported._loadingPromise) await imported._loadingPromise\n\n const targetObject = target as IObject3D\n const targetMaterial = target as IMaterial\n if (targetObject.isObject3D && imported.isObject3D) {\n this.updateObject(imported as IObject3D, targetObject)\n return\n }\n if (targetMaterial.isMaterial && imported.isMaterial) {\n this.updateMaterial(imported as IMaterial, targetMaterial)\n return\n }\n throw new Error(`Nested asset at ${path} does not match its reference type`)\n }\n\n private updateObject(source: IObject3D, target: IObject3D) {\n if (target._sChildren) {\n for (const child of [...target.children]) {\n if (!target._sChildren.includes(child)) child.removeFromParent()\n }\n }\n\n for (const child of source.children) {\n const clone = cloneObject(child)\n clone.userData.excludeFromExport = true\n target.add(clone)\n }\n\n const overrideProperties = target.userData.sProperties as string[]\n const name = target.name\n const visible = target.visible\n for (const property of objectProperties) {\n if (overrideProperties.includes(property)) continue\n const value = source[property]\n const current = target[property]\n if (value && current && (value as Vector3).isVector3) {\n (current as Vector3).copy(value as Vector3)\n } else if (value && current && (value as Quaternion).isQuaternion) {\n (current as Quaternion).copy(value as Quaternion)\n } else if (value !== undefined) {\n Object.assign(target, {[property]: value})\n }\n }\n\n const targetUserData = target.userData\n target.userData = {}\n copyObject3DUserData(target.userData, source.userData, ['uuid', 'sProperties'])\n Object.assign(target.userData, targetUserData)\n target.name = name\n target.visible = visible\n target.userData.uuid = target.uuid\n target.userData.sProperties = overrideProperties\n target.setDirty?.({source: 'RuntimeNestedAssetLoader'})\n }\n\n private updateMaterial(source: IMaterial, target: IMaterial) {\n const overrideProperties = target.userData.sProperties as string[]\n const overrides = getPartialProps(target, overrideProperties)\n const name = target.name\n target.setValues(source)\n target.name = name\n setPartialProps(overrides, target)\n target.userData.uuid = target.uuid\n target.userData.sProperties = overrideProperties\n }\n\n private track(promise: Promise<void>) {\n this.pending.add(promise)\n const remove = () => this.pending.delete(promise)\n promise.then(remove, remove)\n }\n}\n\nfunction cloneObject(source: IObject3D): IObject3D {\n const clone = source.clone(false) as IObject3D\n const sourceRoot = source as IObject3D & {_tpRootPath?: string, _tpRootUid?: string}\n const cloneRoot = clone as IObject3D & {_tpRootPath?: string, _tpRootUid?: string}\n cloneRoot._tpRootPath = sourceRoot._tpRootPath\n cloneRoot._tpRootUid = sourceRoot._tpRootUid || source.uuid\n delete clone.userData.cloneParent\n for (const child of source.children) clone.add(cloneObject(child))\n return clone\n}\n","import {\n Class,\n EntityComponentPlugin,\n GBufferPlugin,\n GLTFAnimationPlugin,\n GLTFMeshOptDecodePlugin,\n IObject3D,\n IViewerPlugin,\n KTX2LoadPlugin,\n KTXLoadPlugin,\n PLYLoadPlugin,\n PopmotionPlugin,\n Rhino3dmLoadPlugin,\n STLLoadPlugin,\n ThreeViewer,\n USDZLoadPlugin,\n} from 'threepipe'\nimport {MeshoptDecoder} from 'meshoptimizer'\nimport {registerScripts} from '../scripts.ts'\nimport {HtmlUiComponent} from '../plugins/HtmlUiComponent.ts'\nimport {CannonPhysicsPlugin} from '../plugins/cannon/CannonPhysicsPlugin.ts'\nimport {\n installGameHooks,\n runtimeCleanupReport,\n type GameValidationFunction,\n type GameValidationReport,\n type RuntimeCleanupReport,\n} from '../authoringValidation.ts'\nimport {RuntimeNestedAssetLoader} from './nestedAssets.ts'\nimport {\n AssetsJSONManifest,\n createProjectAssetURLModifier,\n ExternalPlugin,\n isDependencyModuleSpecifier,\n parseAssetsJSONManifest,\n parsePackageJSON,\n parsePackageJsonSettingsConfig,\n ProjectPackageJSON,\n ProjectConfigSettings,\n} from './projectFormat.ts'\n\nexport interface CreateGameOptions {\n base: string\n canvas: HTMLCanvasElement\n onError?: (error: unknown) => void\n /** Content hashes for cache-safe project module imports in development. */\n fileRevisions?: Readonly<Record<string, string>>\n /** Identifies one module-graph load so transitive imports bypass the browser module map together. */\n moduleRevision?: string\n}\n\nexport interface RuntimeProject {\n packageJson: ProjectPackageJSON\n config: ProjectConfigSettings\n assetsManifest: AssetsJSONManifest\n mainScene: string\n}\n\nexport interface CreatedGame {\n viewer: ThreeViewer\n project: RuntimeProject\n registerGameValidation(fn: GameValidationFunction): () => void\n publishGameTelemetry(value: object): () => void\n runGameValidation(): Promise<GameValidationReport>\n dispose(): RuntimeCleanupReport\n}\n\ntype ModuleExports = Record<string, unknown>\ntype RuntimeErrorHandler = (error: unknown) => void\n\nexport function createGame(options: CreateGameOptions): Promise<CreatedGame> {\n return createProjectGame(options, true)\n}\n\n/** Load the saved project without starting components, physics, the timeline, or main.js. */\nexport function createStoppedGame(options: CreateGameOptions): Promise<CreatedGame> {\n return createProjectGame(options, false)\n}\n\nasync function createProjectGame({\n base,\n canvas,\n onError,\n fileRevisions = {},\n moduleRevision,\n}: CreateGameOptions, start: boolean): Promise<CreatedGame> {\n const reportError = createErrorReporter(onError)\n let viewer: ThreeViewer | undefined\n let nestedAssets: RuntimeNestedAssetLoader | undefined\n let removeURLModifier: (() => void) | undefined\n let gameHooks: ReturnType<typeof installGameHooks> | undefined\n\n try {\n const baseUrl = validateBase(base)\n const [packageText, assetsText] = await Promise.all([\n fetchText(new URL('package.json', baseUrl)),\n fetchText(new URL('assets.json', baseUrl)),\n ])\n const packageJson = parsePackageJSON(packageText)\n const config = await parsePackageJsonSettingsConfig(packageJson)\n const assetsManifest = parseAssetsJSONManifest(assetsText)\n const project: RuntimeProject = {\n packageJson,\n config,\n assetsManifest,\n mainScene: packageJson.mainScene,\n }\n\n const entityComponents = new EntityComponentPlugin(false)\n const physics = new CannonPhysicsPlugin(true, false)\n EntityComponentPlugin.AddObjectUiConfig = false\n window.MeshoptDecoder = MeshoptDecoder\n\n viewer = new ThreeViewer({\n canvas,\n ...config.viewer,\n assetManager: {\n simpleCache: false,\n storage: false,\n },\n plugins: [\n entityComponents,\n new GBufferPlugin(),\n physics,\n new PopmotionPlugin(),\n new GLTFAnimationPlugin(),\n new GLTFMeshOptDecodePlugin(false),\n new KTX2LoadPlugin(),\n new KTXLoadPlugin(),\n new PLYLoadPlugin(),\n new Rhino3dmLoadPlugin(),\n new STLLoadPlugin(),\n new USDZLoadPlugin(),\n ],\n })\n viewer.timeline.endTime = 0\n gameHooks = installGameHooks()\n entityComponents.addComponentType(HtmlUiComponent)\n\n // Three's LoadingManager delegates through this importer hook. It covers\n // glTF buffers/textures and nested imports without patching global fetch.\n const urlModifier = createProjectAssetURLModifier(baseUrl, assetsManifest)\n viewer.assetManager.importer.addURLModifier(urlModifier)\n removeURLModifier = () => viewer?.assetManager.importer.removeURLModifier(urlModifier)\n\n nestedAssets = new RuntimeNestedAssetLoader(viewer, reportError)\n\n await registerProjectScripts(viewer, project, baseUrl, fileRevisions, moduleRevision)\n await registerProjectPlugins(viewer, project, baseUrl, fileRevisions, moduleRevision)\n\n const sceneUrl = new URL(project.mainScene, baseUrl).href\n const loadedScene = await viewer.load(sceneUrl, {importAsModelRoot: true})\n if (!loadedScene?.isObject3D) {\n throw new Error(`The main scene did not load as an Object3D: ${sceneUrl}`)\n }\n await nestedAssets.loadObjectDependencies(loadedScene as IObject3D)\n await nestedAssets.waitForPending()\n\n if (start) {\n viewer.timeline.reset()\n viewer.timeline.start()\n entityComponents.start()\n physics.running = true\n\n const mainUrl = versionedProjectUrl('main.js', baseUrl, fileRevisions, moduleRevision)\n const mainModule = await importModule(mainUrl.href)\n if (mainModule.main !== undefined) {\n if (typeof mainModule.main !== 'function') {\n throw new Error('main.js export \"main\" must be a function')\n }\n await mainModule.main({viewer})\n }\n }\n\n const readyViewer = viewer\n let disposed = false\n let cleanupReport: RuntimeCleanupReport | undefined\n return {\n viewer: readyViewer,\n project,\n registerGameValidation: gameHooks.registerGameValidation,\n publishGameTelemetry: gameHooks.publishGameTelemetry,\n runGameValidation: gameHooks.runGameValidation,\n dispose() {\n if (disposed) return cleanupReport!\n disposed = true\n entityComponents.stop()\n physics.running = false\n readyViewer.timeline.stop()\n cleanupReport = runtimeCleanupReport(readyViewer)\n nestedAssets?.dispose()\n removeURLModifier?.()\n gameHooks?.dispose()\n readyViewer.dispose()\n return cleanupReport\n },\n }\n } catch (error) {\n nestedAssets?.dispose()\n removeURLModifier?.()\n gameHooks?.dispose()\n viewer?.dispose()\n reportError(error)\n throw error\n }\n}\n\nasync function registerProjectPlugins(\n viewer: ThreeViewer,\n project: RuntimeProject,\n base: URL,\n fileRevisions: Readonly<Record<string, string>>,\n moduleRevision?: string,\n) {\n const {config, packageJson} = project\n for (const definition of config.plugins) {\n if (definition.active === false) continue\n const specifier = resolvePluginSpecifier(definition, packageJson, base, fileRevisions, moduleRevision)\n const module = await importModule(specifier)\n const plugin = findPluginExport(module, definition)\n if (viewer.getPlugin(plugin)) continue\n await viewer.addPlugin(plugin, ...(definition.params || []))\n }\n}\n\nasync function registerProjectScripts(\n viewer: ThreeViewer,\n project: RuntimeProject,\n base: URL,\n fileRevisions: Readonly<Record<string, string>>,\n moduleRevision?: string,\n) {\n const {config, packageJson} = project\n const modules: ModuleExports[] = []\n for (const definition of config.scripts) {\n if (definition.active === false) continue\n const specifier = isDependencyModuleSpecifier(definition.import, packageJson)\n ? definition.import\n : versionedProjectUrl(definition.import, base, fileRevisions, moduleRevision).href\n modules.push(await importModule(specifier))\n }\n await registerScripts(viewer, modules)\n}\n\nfunction resolvePluginSpecifier(\n definition: ExternalPlugin,\n packageJson: ProjectPackageJSON,\n base: URL,\n fileRevisions: Readonly<Record<string, string>>,\n moduleRevision?: string,\n) {\n const isDependency = isDependencyModuleSpecifier(definition.import, packageJson)\n if (isDependency) return definition.import\n return versionedProjectUrl(definition.import, base, fileRevisions, moduleRevision).href\n}\n\nfunction versionedProjectUrl(\n path: string,\n base: URL,\n fileRevisions: Readonly<Record<string, string>>,\n moduleRevision?: string,\n): URL {\n const url = assertSameOrigin(new URL(path, base), base)\n const normalized = path.replace(/^\\.\\//, '')\n const revision = fileRevisions[normalized]\n if (revision) url.searchParams.set('v', revision)\n if (moduleRevision) url.searchParams.set('r', moduleRevision)\n return url\n}\n\nfunction findPluginExport(module: ModuleExports, definition: ExternalPlugin): Class<IViewerPlugin> {\n const requested = definition.className || 'default'\n const selected = module[requested]\n if (isPluginType(selected)) return selected\n\n if (!definition.className) {\n const candidates = Object.values(module).filter(isPluginType)\n if (candidates.length === 1) return candidates[0]\n }\n throw new Error(`Cannot find plugin export \"${requested}\" in ${definition.import}`)\n}\n\nfunction isPluginType(value: unknown): value is Class<IViewerPlugin> {\n return typeof value === 'function'\n && typeof (value as unknown as {PluginType?: unknown}).PluginType === 'string'\n}\n\nasync function importModule(specifier: string): Promise<ModuleExports> {\n return import(/* @vite-ignore */ specifier) as Promise<ModuleExports>\n}\n\nasync function fetchText(url: URL): Promise<string> {\n const response = await fetch(url)\n if (!response.ok) throw new Error(`Failed to fetch ${url.href}: ${response.status} ${response.statusText}`)\n return response.text()\n}\n\nfunction validateBase(base: string): URL {\n if (!base.endsWith('/')) throw new Error('createGame base must end in \"/\"')\n const url = new URL(base)\n if (!url.protocol.startsWith('http')) throw new Error('createGame base must be an absolute HTTP(S) URL')\n return url\n}\n\nfunction assertSameOrigin(url: URL, base: URL): URL {\n if (url.origin !== base.origin) {\n throw new Error(`Project modules must be same-origin: ${url.href}`)\n }\n return url\n}\n\nfunction createErrorReporter(onError?: RuntimeErrorHandler) {\n return (error: unknown) => {\n console.error('[kite3d] Runtime error', error)\n onError?.(error)\n }\n}\n","import type {ProjectConfigSettings} from './runtime/projectFormat.ts'\n\nexport const emptyProjectSettings = {\n plugins: [\n {\n \"import\": \"threepipe\",\n \"className\": \"SSAAPlugin\"\n },\n {\n \"import\": \"threepipe\",\n \"className\": \"AssetExporterPlugin\"\n },\n {\n \"import\": \"threepipe\",\n \"className\": \"TransformAnimationPlugin\"\n },\n {\n \"import\": \"threepipe\",\n \"className\": \"DepthBufferPlugin\"\n },\n {\n \"import\": \"threepipe\",\n \"className\": \"NormalBufferPlugin\"\n },\n {\n \"import\": \"threepipe\",\n \"className\": \"FullScreenPlugin\"\n },\n {\n \"import\": \"threepipe\",\n \"className\": \"ObjectConstraintsPlugin\"\n },\n {\n \"import\": \"threepipe\",\n \"className\": \"TransformControlsPlugin\"\n },\n {\n \"import\": \"threepipe\",\n \"className\": \"AssetExporterPlugin\"\n },\n {\n \"import\": \"threepipe\",\n \"className\": \"ClearcoatTintPlugin\"\n },\n {\n \"import\": \"threepipe\",\n \"className\": \"FragmentClippingExtensionPlugin\"\n },\n {\n \"import\": \"threepipe\",\n \"className\": \"NoiseBumpMaterialPlugin\"\n },\n {\n \"import\": \"threepipe\",\n \"className\": \"CustomBumpMapPlugin\"\n },\n {\n \"import\": \"threepipe\",\n \"className\": \"ParallaxMappingPlugin\",\n \"params\": [\n false\n ]\n },\n {\n \"import\": \"threepipe\",\n \"className\": \"GLTFKHRMaterialVariantsPlugin\"\n },\n {\n \"import\": \"threepipe\",\n \"className\": \"VirtualCamerasPlugin\"\n },\n {\n \"import\": \"threepipe\",\n \"className\": \"RenderTargetPreviewPlugin\",\n \"params\": [\n false\n ]\n },\n {\n \"import\": \"threepipe\",\n \"className\": \"HDRiGroundPlugin\",\n \"params\": [\n false,\n true\n ]\n },\n {\n \"import\": \"threepipe\",\n \"className\": \"VignettePlugin\",\n \"params\": [\n false\n ]\n },\n {\n \"import\": \"threepipe\",\n \"className\": \"ChromaticAberrationPlugin\",\n \"params\": [\n false\n ]\n },\n {\n \"import\": \"threepipe\",\n \"className\": \"FilmicGrainPlugin\",\n \"params\": [\n false\n ]\n },\n {\n \"import\": \"threepipe\",\n \"className\": \"SSAOPlugin\",\n \"params\": [\n 1009,\n 1\n ]\n },\n {\n \"import\": \"threepipe\",\n \"className\": \"ContactShadowGroundPlugin\"\n },\n {\n \"import\": \"threepipe\",\n \"className\": \"DeviceOrientationControlsPlugin\"\n },\n {\n \"import\": \"threepipe\",\n \"className\": \"PointerLockControlsPlugin\"\n },\n {\n \"import\": \"threepipe\",\n \"className\": \"ThreeFirstPersonControlsPlugin\"\n },\n {\n \"import\": \"threepipe\",\n \"className\": \"MeshOptSimplifyModifierPlugin\",\n \"params\": [\n false\n ]\n },\n {\n \"import\": \"@threepipe/webgi-plugins\",\n \"className\": \"AnisotropyPlugin\",\n },\n {\n \"import\": \"@threepipe/webgi-plugins\",\n \"className\": \"BloomPlugin\",\n },\n {\n \"import\": \"@threepipe/webgi-plugins\",\n \"className\": \"SSReflectionPlugin\",\n },\n {\n \"import\": \"@threepipe/webgi-plugins\",\n \"className\": \"TemporalAAPlugin\",\n },\n {\n \"import\": \"@threepipe/webgi-plugins\",\n \"className\": \"VelocityBufferPlugin\",\n params: [1009, false],\n },\n {\n \"import\": \"@threepipe/webgi-plugins\",\n \"className\": \"DepthOfFieldPlugin\",\n params: [false],\n },\n {\n \"import\": \"@threepipe/webgi-plugins\",\n \"className\": \"SSContactShadowsPlugin\",\n params: [false],\n },\n {\n \"import\": \"@threepipe/webgi-plugins\",\n \"className\": \"OutlinePlugin\",\n params: [false],\n },\n {\n \"import\": \"@threepipe/webgi-plugins\",\n \"className\": \"SSGIPlugin\",\n params: [undefined, 1, false],\n },\n // GLTFDracoExportPlugin, GLTFSpecGlossinessConverterPlugin\n {\n \"import\": \"@threepipe/plugin-gltf-transform\",\n \"className\": \"GLTFDracoExportPlugin\",\n },\n {\n \"import\": \"@threepipe/plugin-gltf-transform\",\n \"className\": \"GLTFSpecGlossinessConverterPlugin\",\n },\n // MaterialConfiguratorPlugin, SwitchNodePlugin\n {\n \"import\": \"@threepipe/plugin-configurator\",\n \"className\": \"MaterialConfiguratorPlugin\",\n },\n {\n \"import\": \"@threepipe/plugin-configurator\",\n \"className\": \"SwitchNodePlugin\",\n },\n ...['B3DMLoadPlugin', 'CMPTLoadPlugin', 'DeepZoomImageLoadPlugin', 'EnvironmentControlsPlugin', 'GlobeControlsPlugin', 'I3DMLoadPlugin', 'PNTSLoadPlugin', 'TilesRendererPlugin'].map(className => ({\n import: '@threepipe/plugin-3d-tiles-renderer',\n className,\n })),\n {\n import: '@threepipe/plugin-assimpjs',\n className: 'AssimpJsPlugin',\n params: [false],\n },\n {\n import: '@threepipe/plugin-path-tracing',\n className: 'ThreeGpuPathTracerPlugin',\n params: [false],\n },\n {\n import: '@threepipe/plugin-blend-importer',\n className: 'BlendLoadPlugin',\n },\n {\n import: '@threepipe/plugin-network',\n className: 'TransfrSharePlugin',\n },\n {\n import: '@threepipe/plugin-troika-text',\n className: 'TroikaTextPlugin',\n },\n ...[\n 'TDSLoadPlugin',\n 'ThreeMFLoadPlugin',\n 'ColladaLoadPlugin',\n 'AMFLoadPlugin',\n 'GCodeLoadPlugin',\n 'BVHLoadPlugin',\n 'VOXLoadPlugin',\n 'MDDLoadPlugin',\n 'PCDLoadPlugin',\n 'TiltLoadPlugin',\n 'VRMLLoadPlugin',\n 'LDrawLoadPlugin',\n 'VTKLoadPlugin',\n 'XYZLoadPlugin',\n ].map(className => ({\n import: '@threepipe/plugins-extra-importers',\n className,\n })),\n ],\n dependencies: [{\n key: '@threepipe/webgi-plugins',\n version: '0.6.1',\n }, {\n key: '@threepipe/plugin-gltf-transform',\n version: 'latest',\n }, {\n key: '@threepipe/plugin-configurator',\n version: 'latest',\n }, {\n key: '@threepipe/plugin-3d-tiles-renderer',\n version: 'latest',\n }, {\n key: '@threepipe/plugin-assimpjs',\n version: 'latest',\n }, {\n key: '@threepipe/plugin-path-tracing',\n version: 'latest',\n }, {\n key: '@threepipe/plugin-blend-importer',\n version: 'latest',\n }, {\n key: '@threepipe/plugin-network',\n version: 'latest',\n }, {\n key: '@threepipe/plugin-troika-text',\n version: 'latest',\n }, {\n key: '@threepipe/plugins-extra-importers',\n version: 'latest',\n }],\n scripts: [],\n viewer: {},\n} as ProjectConfigSettings\n"],"names":["wasm","wasmpack","instance","ready","unpack","result","data","i","ch","write","assert","cond","bytes","view","reorder","fun","indices","vertices","optf","sbrk","ip","rp","heap","indices8","unique","remap","spatialsort","positions","count","stride","sp","encode","bound","source","size","tp","res","target","maxindex","index","index32","filter","bits","insize","mode","triangles","optsize","positions_stride","table","MeshoptDecoder","wasm_base","wasm_simd","detector","decode","count4","filters","decoders","workers","requestId","createWorker","url","worker","event","initWorkers","workerProcess","blob","decodeWorker","resolve","reject","id","error","simplify","index_count","vertex_positions","vertex_count","vertex_positions_stride","target_index_count","target_error","options","te","ti","si","simplifyAttr","vertex_attributes","vertex_attributes_stride","attribute_weights","sa","sw","simplifyScale","simplifyPoints","vertex_colors","vertex_colors_stride","color_weight","target_vertex_count","sc","simplifyOptions","indices32","flags","walkScriptExports","module","plugins","components","name","value","isPluginType","isComponentType","registerScripts","viewer","modules","found","entityComponents","EntityComponentPlugin","walked","component","existing","plugin","uiPositionMode","_HtmlUiComponent","Object3DComponent","Vector3","e","changeKey","v","_b","_a","_d","_c","object","state","resized","camera","canvas","_e","projected","x","y","html","width","height","literalStrings","HtmlUiComponent","_v1","_v2","_q1","Quaternion","getGeometry","meshes","getMeshes","normalizeGeometry","mesh","geometries","simplifyGeometry","mergeBufferGeometries","geometry","vertexCount","position","positionArray","positionOffset","j","BufferGeometry","BufferAttribute","getVertices","o","getComponent","tolerance","hashToIndex","nextIndex","newIndices","newPositions","decimalShift","shiftMultiplier","hash","positionAttribute","PI_2","ShapeType","getShapeParameters","getBoundingBoxParameters","getBoundingCylinderParameters","getBoundingSphereParameters","getConvexPolyhedronParameters","getTrimeshParameters","getBoxParameters","getCylinderParameters","getPlaneParameters","getSphereParameters","threeToCannon","shapeParameters","type","params","offset","orientation","shape","createBox","createCylinder","createSphere","createConvexPolyhedron","createTrimesh","z","Box","Vec3","radiusTop","radiusBottom","segments","Cylinder","Sphere","faces","verticesArray","ConvexPolyhedron","Trimesh","box","clone","Box3","localPosition","eps","convexHullToJSON","ConvexHull","Mesh","CQuaternion","MathUtils","axes","majorAxis","minorAxes","radius","eulerX","eulerY","sphere","hull","srcIndices","f","edge","vertex","uniqueSrcIndices","dstPositions","srcToDstIndexMap","dstIndices","physicsBodyType","_Cannon3DBodyComponent","CannonMaterial2","Body","cannon","CannonPhysicsPlugin","m","Cannon3DShapeComponent","sh","refresh","update","changed","s","bodyObj","bodyWorldPos","bodyWorldQuat","quat","shapeObj","worldPos","relQuat","Cannon3DBodyComponent","cannonDebugger","_tempVec0","CannonVector3","_tempVec1","_tempVec2","CannonQuaternion","_sphereGeometry","SphereGeometry","_boxGeometry","BoxGeometry","_planeGeometry","PlaneGeometry","_material","LineMaterial2","createConvexPolyhedronGeometry","Float32BufferAttribute","face","a","b","c","createTrimeshGeometry","v0","v1","v2","createHeightfieldGeometry","row","xi","yi","createMesh","SPHERE","BOX","PLANE","CYLINDER","CONVEXPOLYHEDRON","TRIMESH","HEIGHTFIELD","Shape","Wireframe","WireframeGeometry3","CylinderGeometry","scaleMesh","typeMatch","updateMesh","CannonDebugger","typeToCannon","cannonShapeTypes","cannonShapeTypeParams","_Cannon3DShapeComponent","params1","k","body","refreshBody","shapeType","Object3DWidgetsPlugin","Cannon3DShapeHelper","AHelperWidget","Group","shapes","added","removed","current","obj","CannonRagdollComponent","MeshStandardMaterial","Object3D","_event","syncBoneRotation","boneNames","bone","boneName","initialBodyQuat","initialBoneWorldQuat","currentBodyQuat","initialBodyQuatInverse","newBoneWorldQuat","parentWorldQuat","newLocalQuat","hipsBone","parentMatrixWorldInverse","skinnedMesh","deltaX","deltaY","deltaZ","bodyQuat","scale","angle","angleShoulders","twistAngle","shouldersDistance","upperArmLength","lowerArmLength","upperArmSize","lowerArmSize","neckLength","headRadius","upperBodyLength","pelvisLength","upperLegLength","upperLegSize","lowerLegSize","lowerLegLength","headShape","upperArmShape","lowerArmShape","upperBodyShape","pelvisShape","upperLegShape","lowerLegShape","basePos","baseQuat","transformLocalToWorld","localOffset","worldOffset","createMeshForBody","isHead","lowerLeftLeg","lowerRightLeg","upperLeftLeg","upperRightLeg","pelvisLocalY","pelvis","upperBodyLocalY","upperBody","headLocalY","head","armLocalY","upperLeftArm","upperRightArm","lowerLeftArm","lowerRightArm","neckJoint","ConeTwistConstraint","leftKneeJoint","rightKneeJoint","leftHipJoint","rightHipJoint","spineJoint","leftShoulder","rightShoulder","leftElbowJoint","rightElbowJoint","constraint","resetBody","pos","pelvisY","upperBodyY","headY","armY","impulse","worldPoint","partName","child","impactPoint","storeBoneQuat","worldQuat","matchBodyToBone","visible","point","closest","minDist","dx","dy","dz","dist","__decorateClass","uiFolderContainer","CannonMaterial","generateUUID","uiInput","uiMonitor","uiNumber","ThreeSerialization","ContactMaterial","TypeSystem","AViewerPluginSync","enabled","running","World","Matrix4","frameFadePlugin","FrameFadePlugin","dirty","bodyC","collisionEv","compA","compB","offUpdate","compType","wplugin","off","serialize","uiToggle","_that","uiConfig","defaultObjectOverrides","defaultMaterialOverrides","objectProperties","RuntimeNestedAssetLoader","onError","loading","objects","materials","material","entry","loads","load","results","path","imported","targetObject","targetMaterial","cloneObject","overrideProperties","property","targetUserData","copyObject3DUserData","overrides","getPartialProps","setPartialProps","promise","remove","sourceRoot","cloneRoot","createGame","createProjectGame","createStoppedGame","base","fileRevisions","moduleRevision","start","reportError","createErrorReporter","nestedAssets","removeURLModifier","gameHooks","baseUrl","validateBase","packageText","assetsText","fetchText","packageJson","parsePackageJSON","config","parsePackageJsonSettingsConfig","assetsManifest","parseAssetsJSONManifest","project","physics","ThreeViewer","GBufferPlugin","PopmotionPlugin","GLTFAnimationPlugin","GLTFMeshOptDecodePlugin","KTX2LoadPlugin","KTXLoadPlugin","PLYLoadPlugin","Rhino3dmLoadPlugin","STLLoadPlugin","USDZLoadPlugin","installGameHooks","urlModifier","createProjectAssetURLModifier","registerProjectScripts","registerProjectPlugins","sceneUrl","loadedScene","mainUrl","versionedProjectUrl","mainModule","importModule","readyViewer","disposed","cleanupReport","runtimeCleanupReport","definition","specifier","resolvePluginSpecifier","findPluginExport","isDependencyModuleSpecifier","assertSameOrigin","normalized","revision","requested","selected","candidates","response","emptyProjectSettings","className"],"mappings":"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","x_google_ignoreList":[0,1,2]}
|