viral-viewer-2 6.9.3 → 6.9.5
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/{batched-mesh-simplifier-BIpHfnmJ.mjs → batched-mesh-simplifier-Ca5qqBRx.mjs} +1 -1
- package/dist/components/custom-objects/viral-batched-mesh.d.ts +104 -34
- package/dist/components/custom-objects/viral-instanced-mesh-v2.d.ts +98 -15
- package/dist/components/custom-objects/viral-merged-model.d.ts +35 -0
- package/dist/components/post-processing/post-processing-renderer.d.ts +52 -1
- package/dist/components/post-processing/screen-space-edges-pass.d.ts +68 -0
- package/dist/components/visibility-manager/viral-visibility-manager.d.ts +71 -0
- package/dist/components/worker/load-element-batch.worker.d.ts +8 -1
- package/dist/{index-Dz6pKFVp.mjs → index-2UhYEXGe.mjs} +7438 -6371
- package/dist/index.mjs +1 -1
- package/package.json +1 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { B as S, a as V, V as Z } from "./index-
|
|
1
|
+
import { B as S, a as V, V as Z } from "./index-2UhYEXGe.mjs";
|
|
2
2
|
(function() {
|
|
3
3
|
var s = "b9H79Tebbbe9ok9Geueu9Geub9Gbb9Gruuuuuuueu9Gvuuuuueu9Gduueu9Gluuuueu9Gvuuuuub9Gouuuuuub9Gluuuub9GiuuueuiE8AdilveoveovrrwrrrDDoDrbqqbelve9Weiiviebeoweuec;G:Qdkr:PlCo9TW9T9VV95dbH9F9F939H79T9F9J9H229F9Jt9VV7bb8F9TW79O9V9Wt9FW9U9J9V9KW9wWVtW949c919M9MWV9mW4W2be8A9TW79O9V9Wt9FW9U9J9V9KW9wWVtW949c919M9MWVbd8F9TW79O9V9Wt9FW9U9J9V9KW9wWVtW949c919M9MWV9c9V919U9KbiE9TW79O9V9Wt9FW9U9J9V9KW9wWVtW949wWV79P9V9UblY9TW79O9V9Wt9FW9U9J9V9KW69U9KW949c919M9MWVbv8E9TW79O9V9Wt9FW9U9J9V9KW69U9KW949c919M9MWV9c9V919U9Kbo8A9TW79O9V9Wt9FW9U9J9V9KW69U9KW949wWV79P9V9UbrE9TW79O9V9Wt9FW9U9J9V9KW69U9KW949tWG91W9U9JWbwa9TW79O9V9Wt9FW9U9J9V9KW69U9KW949tWG91W9U9JW9c9V919U9KbDL9TW79O9V9Wt9FW9U9J9V9KWS9P2tWV9p9JtbqK9TW79O9V9Wt9FW9U9J9V9KWS9P2tWV9r919HtbkL9TW79O9V9Wt9FW9U9J9V9KWS9P2tWVT949WbxY9TW79O9V9Wt9FW9U9J9V9KWS9P2tWVJ9V29VVbmE9TW79O9V9Wt9F9V9Wt9P9T9P96W9wWVtW94J9H9J9OWbza9TW79O9V9Wt9F9V9Wt9P9T9P96W9wWVtW94J9H9J9OW9ttV9P9WbHa9TW79O9V9Wt9F9V9Wt9P9T9P96W9wWVtW94SWt9J9O9sW9T9H9WbOK9TW79O9V9Wt9F79W9Ht9P9H29t9VVt9sW9T9H9WbAl79IV9RbXDwebcekdKYq;i28Adbk:Bhdhud9:8Jjjjjbc;qw9Rgr8KjjjjbcbhwdnaeTmbabcbyd;C:kjjbaoaocb9iEgDc:GeV86bbarc;adfcbcjdz:xjjjb8AdnaiTmbarc;adfadalz:wjjjb8Akarc;abfalfcbcbcjdal9RalcFe0Ez:xjjjb8Aarc;abfarc;adfalz:wjjjb8AarcUf9cb83ibarc8Wf9cb83ibarcyf9cb83ibarcaf9cb83ibarcKf9cb83ibarczf9cb83ibar9cb83iwar9cb83ibcj;abal9Uc;WFbGcjdalca0Ehqdnaicd6mbavcd9imbaDTmbadcefhkaqci2gxal2hmarc;alfclfhParc;qlfceVhsarc;qofclVhzarc;qofcKfhHarc;qofczfhOcbhAincdhCcbhodnavci6mbaH9cb83ibaO9cb83ibar9cb83i;yoar9cb83i;qoadaAfgoybbhXcbhQincbhwcbhLdninaoalfhKaoybbgYaX7aLVhLawcP0meaKhoaYhXawcefgwaQfai6mbkkcbhXarc;qofhwincwh8AcwhEdnaLaX93gocFeGg3cs0mbclhEa3ci0mba3cb9hcethEkdnaocw4cFeGg3cs0mbclh8Aa3ci0mba3cb9hceth8Aka8AaEfh3awydbh5cwh8AcwhEdnaocz4cFeGg8Ecs0mbclhEa8Eci0mba8Ecb9hcethEka3a5fh3dnaocFFFFb0mbclh8AaocFFF8F0mbaocFFFr0ceth8Akawa3aEfa8AfBdbawclfhwaXcefgXcw9hmbkaKhoaYhXaQczfgQai6mbkcbhocehwazhLinawaoaLydbarc;qofaocdtfydb6EhoaLclfhLawcefgwcw9hmbkcihCkcbh3arc;qlfcbcjdz:xjjjb8Aarc;alfcwfcbBdbar9cb83i;alaoclth8Fadhaaqhhakh5inarc;qlfadcba3cufgoaoa30Eal2falz:wjjjb8Aaiahaiah6Ehgdnaqaia39Ra3aqfai6EgYcsfc9WGgoaY9nmbarc;qofaYfcbaoaY9Rz:xjjjb8Akada3al2fh8Jcbh8Kina8Ka8FVcl4hQarc;alfa8Kcdtfh8LaAh8Mcbh8Nina8NaAfhwdndndndndndna8KPldebidkasa8Mc98GgLfhoa5aLfh8Aarc;qlfawc98GgLfRbbhXcwhwinaoRbbawtaXVhXaocefhoawcwfgwca9hmbkaYTmla8Ncith8Ea8JaLfhEcbhKinaERbbhLcwhoa8AhwinawRbbaotaLVhLawcefhwaocwfgoca9hmbkarc;qofaKfaLaX7aQ93a8E486bba8Aalfh8AaEalfhEaLhXaKcefgKaY9hmbxlkkaYTmia8Mc9:Ghoa8NcitcwGhEarc;qlfawceVfRbbcwtarc;qlfawc9:GfRbbVhLarc;qofhwaghXinawa5aofRbbcwtaaaofRbbVg8AaL9RgLcetaLcztcz91cs47cFFiGaE486bbaoalfhoawcefhwa8AhLa3aXcufgX9hmbxikkaYTmda8Jawfhoarc;qlfawfRbbhLarc;qofhwaghXinawaoRbbg8AaL9RgLcetaLcKtcK91cr4786bbawcefhwaoalfhoa8AhLa3aXcufgX9hmbxdkkaYTmeka8LydbhEcbhKarc;qofhoincdhLcbhwinaLaoawfRbbcb9hfhLawcefgwcz9hmbkclhXcbhwinaXaoawfRbbcd0fhXawcefgwcz9hmbkcwh8Acbhwina8AaoawfRbbcP0fh8Aawcefgwcz9hmbkaLaXaLaX6Egwa8Aawa8A6Egwczawcz6EaEfhEaoczfhoaKczfgKaY6mbka8LaEBdbka8Mcefh8Ma8Ncefg8Ncl9hmbka8Kcefg8KaC9hmbkaaamfhaahaxfhha5amfh5a3axfg3ai6mbkcbhocehwaPhLinawaoaLydbarc;alfaocdtfydb6EhoaLclfhLawcefgXhwaCaX9hmbkaraAcd4fa8FcdVaoaocdSE86bbaAclfgAal6mbkkabaefh8Kabcefhoalcd4gecbaDEhkadcefhOarc;abfceVhHcbhmdndninaiam9nmearc;qofcbcjdz:xjjjb8Aa8Kao9Rak6mdadamal2gwfhxcbh8JaOawfhzaocbakz:xjjjbghakfh5aqaiam9Ramaqfai6Egscsfgocl4cifcd4hCaoc9WGg8LThPindndndndndndndndndndnaDTmbara8Jcd4fRbbgLciGPlbedlbkasTmdaxa8Jfhoarc;abfa8JfRbbhLarc;qofhwashXinawaoRbbg8AaL9RgLcetaLcKtcK91cr4786bbawcefhwaoalfhoa8AhLaXcufgXmbxikkasTmia8JcitcwGhEarc;abfa8JceVfRbbcwtarc;abfa8Jc9:GgofRbbVhLaxaofhoarc;qofhwashXinawao8Vbbg8AaL9RgLcetaLcztcz91cs47cFFiGaE486bbawcefhwaoalfhoa8AhLaXcufgXmbxdkkaHa8Jc98GgEfhoazaEfh8Aarc;abfaEfRbbhXcwhwinaoRbbawtaXVhXaocefhoawcwfgwca9hmbkasTmbaLcl4hYa8JcitcKGh3axaEfhEcbhKinaERbbhLcwhoa8AhwinawRbbaotaLVhLawcefhwaocwfgoca9hmbkarc;qofaKfaLaX7aY93a3486bba8Aalfh8AaEalfhEaLhXaKcefgKas9hmbkkaDmbcbhoxlka8LTmbcbhodninarc;qofaofgwcwf8Pibaw8Pib:e9qTmeaoczfgoa8L9pmdxbkkdnavmbcehoxikcbhEaChKaChYinarc;qofaEfgocwf8Pibhyao8Pibh8PcdhLcbhwinaLaoawfRbbcb9hfhLawcefgwcz9hmbkclhXcbhwinaXaoawfRbbcd0fhXawcefgwcz9hmbkcwh8Acbhwina8AaoawfRbbcP0fh8Aawcefgwcz9hmbkaLaXaLaX6Egoa8Aaoa8A6Egoczaocz6EaYfhYaocucbaya8P:e9cb9sEgwaoaw6EaKfhKaEczfgEa8L9pmdxbkkaha8Jcd4fgoaoRbbcda8JcetcoGtV86bbxikdnaKas6mbaYas6mbaha8Jcd4fgoaoRbbcia8JcetcoGtV86bba8Ka59Ras6mra5arc;qofasz:wjjjbasfh5xikaKaY9phokaha8Jcd4fgwawRbbaoa8JcetcoGtV86bbka8Ka59RaC6mla5cbaCz:xjjjbgAaCfhYdndna8LmbaPhoxekdna8KaY9RcK9pmbaPhoxekaocdtc:q1jjbfcj1jjbaDEg5ydxggcetc;:FFFeGh8Fcuh3cuagtcu7cFeGhacbh8Marc;qofhLinarc;qofa8MfhQczhEdndndnagPDbeeeeeeedekcucbaQcwf8PibaQ8Pib:e9cb9sEhExekcbhoa8FhEinaEaaaLaofRbb9nfhEaocefgocz9hmbkkcih8Ecbh8Ainczhwdndndna5a8AcdtfydbgKPDbeeeeeeedekcucbaQcwf8PibaQ8Pib:e9cb9sEhwxekaKcetc;:FFFeGhwcuaKtcu7cFeGhXcbhoinawaXaLaofRbb9nfhwaocefgocz9hmbkkdndnawaE6mbaKa39hmeawaE9hmea5a8EcdtfydbcwSmeka8Ah8EawhEka8Acefg8Aci9hmbkaAa8Mco4fgoaoRbba8Ea8Mci4coGtV86bbdndndna5a8Ecdtfydbg3PDdbbbbbbbebkdncwa39Tg8ETmbcua3tcu7hwdndna3ceSmbcbh8NaLhQinaQhoa8Eh8AcbhXinaoRbbgEawcFeGgKaEaK6EaXa3tVhXaocefhoa8Acufg8AmbkaYaX86bbaQa8EfhQaYcefhYa8Na8Efg8Ncz6mbxdkkcbh8NaLhQinaQhoa8Eh8AcbhXinaoRbbgEawcFeGgKaEaK6EaXcetVhXaocefhoa8Acufg8AmbkaYaX:T9cFe:d9c:c:qj:bw9:9c:q;c1:I1e:d9c:b:c:e1z9:9ca188bbaQa8EfhQaYcefhYa8Na8Efg8Ncz6mbkkcbhoinaYaLaofRbbgX86bbaYaXawcFeG9pfhYaocefgocz9hmbxikkdna3ceSmbinaYcb86bbaYcefhYxbkkinaYcb86bbaYcefhYxbkkaYaQ8Pbb83bbaYcwfaQcwf8Pbb83bbaYczfhYka8Mczfg8Ma8L9pgomeaLczfhLa8KaY9RcK9pmbkkaoTmlaYh5aYTmlka8Jcefg8Jal9hmbkarc;abfaxascufal2falz:wjjjb8Aasamfhma5hoa5mbkcbhwxdkdna8Kao9RakalfgwcKcaaDEgLawaL0EgX9pmbcbhwxdkdnawaL9pmbaocbaXaw9Rgwz:xjjjbawfhokaoarc;adfalz:wjjjbalfhodnaDTmbaoaraez:wjjjbaefhokaoab9Rhwxekcbhwkarc;qwf8Kjjjjbawk5babaeadaialcdcbyd;C:kjjbz:bjjjbk9reduaecd4gdaefgicaaica0Eabcj;abae9Uc;WFbGcjdaeca0Egifcufai9Uae2aiadfaicl4cifcd4f2fcefkmbcbabBd;C:kjjbk:Ese5u8Jjjjjbc;ae9Rgl8Kjjjjbcbhvdnaici9UgocHfae0mbabcbyd;m:kjjbgrc;GeV86bbalc;abfcFecjez:xjjjb8AalcUfgw9cu83ibalc8WfgD9cu83ibalcyfgq9cu83ibalcafgk9cu83ibalcKfgx9cu83ibalczfgm9cu83ibal9cu83iwal9cu83ibabaefc9WfhPabcefgsaofhednaiTmbcmcsarcb9kgzEhHcbhOcbhAcbhCcbhXcbhQindnaeaP9nmbcbhvxikaQcufhvadaCcdtfgLydbhKaLcwfydbhYaLclfydbh8AcbhEdndndninalc;abfavcsGcitfgoydlh3dndndnaoydbgoaK9hmba3a8ASmekdnaoa8A9hmba3aY9hmbaEcefhExekaoaY9hmea3aK9hmeaEcdfhEkaEc870mdaXcufhvaLaEciGcx2goc;i1jjbfydbcdtfydbh3aLaoc;e1jjbfydbcdtfydbh8AaLaoc;a1jjbfydbcdtfydbhKcbhodnindnalavcsGcdtfydba39hmbaohYxdkcuhYavcufhvaocefgocz9hmbkkaOa3aOSgvaYce9iaYaH9oVgoGfhOdndndncbcsavEaYaoEgvcs9hmbarce9imba3a3aAa3cefaASgvEgAcefSmecmcsavEhvkasavaEcdtc;WeGV86bbavcs9hmea3aA9Rgvcetavc8F917hvinaeavcFb0crtavcFbGV86bbaecefheavcje6hoavcr4hvaoTmbka3hAxvkcPhvasaEcdtcPV86bba3hAkavTmiavaH9omicdhocehEaQhYxlkavcufhvaEclfgEc;ab9hmbkkdnaLceaYaOSceta8AaOSEcx2gvc;a1jjbfydbcdtfydbgKTaLavc;e1jjbfydbcdtfydbg8AceSGaLavc;i1jjbfydbcdtfydbg3cdSGaOcb9hGazGg5ce9hmbaw9cu83ibaD9cu83ibaq9cu83ibak9cu83ibax9cu83ibam9cu83ibal9cu83iwal9cu83ibcbhOkcbhEaXcufgvhodnindnalaocsGcdtfydba8A9hmbaEhYxdkcuhYaocufhoaEcefgEcz9hmbkkcbhodnindnalavcsGcdtfydba39hmbaohExdkcuhEavcufhvaocefgocz9hmbkkaOaKaOSg8EfhLdndnaYcm0mbaYcefhYxekcbcsa8AaLSgvEhYaLavfhLkdndnaEcm0mbaEcefhExekcbcsa3aLSgvEhEaLavfhLkc9:cua8EEh8FcbhvaEaYcltVgacFeGhodndndninavc:W1jjbfRbbaoSmeavcefgvcz9hmbxdkka5aKaO9havcm0VVmbasavc;WeV86bbxekasa8F86bbaeaa86bbaecefhekdna8EmbaKaA9Rgvcetavc8F917hvinaeavcFb0gocrtavcFbGV86bbavcr4hvaecefheaombkaKhAkdnaYcs9hmba8AaA9Rgvcetavc8F917hvinaeavcFb0gocrtavcFbGV86bbavcr4hvaecefheaombka8AhAkdnaEcs9hmba3aA9Rgvcetavc8F917hvinaeavcFb0gocrtavcFbGV86bbavcr4hvaecefheaombka3hAkalaXcdtfaKBdbaXcefcsGhvdndnaYPzbeeeeeeeeeeeeeebekalavcdtfa8ABdbaXcdfcsGhvkdndnaEPzbeeeeeeeeeeeeeebekalavcdtfa3BdbavcefcsGhvkcihoalc;abfaQcitfgEaKBdlaEa8ABdbaQcefcsGhYcdhEavhXaLhOxekcdhoalaXcdtfa3BdbcehEaXcefcsGhXaQhYkalc;abfaYcitfgva8ABdlava3Bdbalc;abfaQaEfcsGcitfgva3BdlavaKBdbascefhsaQaofcsGhQaCcifgCai6mbkkdnaeaP9nmbcbhvxekcbhvinaeavfavc:W1jjbfRbb86bbavcefgvcz9hmbkaeab9Ravfhvkalc;aef8KjjjjbavkZeeucbhddninadcefgdc8F0meceadtae6mbkkadcrfcFeGcr9Uci2cdfabci9U2cHfkmbcbabBd;m:kjjbk:Adewu8Jjjjjbcz9Rhlcbhvdnaicvfae0mbcbhvabcbRb;m:kjjbc;qeV86bbal9cb83iwabcefhoabaefc98fhrdnaiTmbcbhwcbhDindnaoar6mbcbskadaDcdtfydbgqalcwfawaqav9Rgvavc8F91gv7av9Rc507gwcdtfgkydb9Rgvc8E91c9:Gavcdt7awVhvinaoavcFb0gecrtavcFbGV86bbavcr4hvaocefhoaembkakaqBdbaqhvaDcefgDai9hmbkkdnaoar9nmbcbskaocbBbbaoab9RclfhvkavkBeeucbhddninadcefgdc8F0meceadtae6mbkkadcwfcFeGcr9Uab2cvfk:bvli99dui99ludnaeTmbcuadcetcuftcu7:Zhvdndncuaicuftcu7:ZgoJbbbZMgr:lJbbb9p9DTmbar:Ohwxekcjjjj94hwkcbhicbhDinalclfIdbgrJbbbbJbbjZalIdbgq:lar:lMalcwfIdbgk:lMgr:varJbbbb9BEgrNhxaqarNhrdndnakJbbbb9GTmbaxhqxekJbbjZar:l:tgqaq:maxJbbbb9GEhqJbbjZax:l:tgxax:marJbbbb9GEhrkdndnalcxfIdbgxJbbj:;axJbbj:;9GEgkJbbjZakJbbjZ9FEavNJbbbZJbbb:;axJbbbb9GEMgx:lJbbb9p9DTmbax:Ohmxekcjjjj94hmkdndnaqJbbj:;aqJbbj:;9GEgxJbbjZaxJbbjZ9FEaoNJbbbZJbbb:;aqJbbbb9GEMgq:lJbbb9p9DTmbaq:OhPxekcjjjj94hPkdndnarJbbj:;arJbbj:;9GEgqJbbjZaqJbbjZ9FEaoNJbbbZJbbb:;arJbbbb9GEMgr:lJbbb9p9DTmbar:Ohsxekcjjjj94hskdndnadcl9hmbabaifgzas86bbazcifam86bbazcdfaw86bbazcefaP86bbxekabaDfgzas87ebazcofam87ebazclfaw87ebazcdfaP87ebkalczfhlaiclfhiaDcwfhDaecufgembkkk;hlld99eud99eudnaeTmbdndncuaicuftcu7:ZgvJbbbZMgo:lJbbb9p9DTmbao:Ohixekcjjjj94hikaic;8FiGhrinabcofcicdalclfIdb:lalIdb:l9EgialcwfIdb:lalaicdtfIdb:l9EEgialcxfIdb:lalaicdtfIdb:l9EEgiarV87ebdndnJbbj:;JbbjZalaicdtfIdbJbbbb9DEgoalaicd7cdtfIdbJ;Zl:1ZNNgwJbbj:;awJbbj:;9GEgDJbbjZaDJbbjZ9FEavNJbbbZJbbb:;awJbbbb9GEMgw:lJbbb9p9DTmbaw:Ohqxekcjjjj94hqkabcdfaq87ebdndnalaicefciGcdtfIdbJ;Zl:1ZNaoNgwJbbj:;awJbbj:;9GEgDJbbjZaDJbbjZ9FEavNJbbbZJbbb:;awJbbbb9GEMgw:lJbbb9p9DTmbaw:Ohqxekcjjjj94hqkabaq87ebdndnaoalaicufciGcdtfIdbJ;Zl:1ZNNgoJbbj:;aoJbbj:;9GEgwJbbjZawJbbjZ9FEavNJbbbZJbbb:;aoJbbbb9GEMgo:lJbbb9p9DTmbao:Ohixekcjjjj94hikabclfai87ebabcwfhbalczfhlaecufgembkkk;3viDue99eu8Jjjjjbcjd9Rgo8Kjjjjbadcd4hrdndndndnavcd9hmbadcl6meaohwarhDinawc:CuBdbawclfhwaDcufgDmbkaeTmiadcl6mdarcdthqalhkcbhxinaohwakhDarhminawawydbgPcbaDIdbgs:8cL4cFeGc:cufasJbbbb9BEgzaPaz9kEBdbaDclfhDawclfhwamcufgmmbkakaqfhkaxcefgxaeSmixbkkaeTmdxekaeTmekarcdthkavce9hhqadcl6hdcbhxindndndnaqmbadmdc:CuhDalhwarhminaDcbawIdbgs:8cL4cFeGc:cufasJbbbb9BEgPaDaP9kEhDawclfhwamcufgmmbxdkkc:CuhDdndnavPleddbdkadmdaohwalhmarhPinawcbamIdbgs:8cL4cFeGgzc;:bazc;:b0Ec:cufasJbbbb9BEBdbamclfhmawclfhwaPcufgPmbxdkkadmecbhwarhminaoawfcbalawfIdbgs:8cL4cFeGgPc8AaPc8A0Ec:cufasJbbbb9BEBdbawclfhwamcufgmmbkkadmbcbhwarhPinaDhmdnavceSmbaoawfydbhmkdndnalawfIdbgscjjj;8iamai9RcefgmcLt9R::NJbbbZJbbb:;asJbbbb9GEMgs:lJbbb9p9DTmbas:Ohzxekcjjjj94hzkabawfazcFFFrGamcKtVBdbawclfhwaPcufgPmbkkabakfhbalakfhlaxcefgxae9hmbkkaocjdf8Kjjjjbk:Ylvdud99due99iudnaeTmbceaicufgvthocuaitcu7:Zhrcuavtcu7:Zhwcbhvadcl9hhDcbhqindndnalcwfIdbgkJbbbbakJbbbb9GEgkJbbjZakJbbjZ9FEarNJbbbZMgk:lJbbb9p9DTmbak:Ohixekcjjjj94hikdndnalIdbgkJbbbbakJbbbb9GEgkJbbjZakJbbjZ9FEarNJbbbZMgk:lJbbb9p9DTmbak:Ohdxekcjjjj94hdkadai9Rcd9TgxaifhidndnalclfIdbgkJbbbbakJbbbb9GEgkJbbjZakJbbjZ9FEarNJbbbZMgk:lJbbb9p9DTmbak:Ohdxekcjjjj94hdkadai9Rcd9ThddndnalcxfIdbgkJbbbbakJbbbb9GEgkJbbjZakJbbjZ9FEawNJbbbZMgk:lJbbb9p9DTmbak:Ohmxekcjjjj94hmkadaifhiaoamVhmdndnaDmbabavfgPai86bbaPcifam86bbaPcdfad86bbaPcefax86bbxekabaqfgPai87ebaPcofam87ebaPclfad87ebaPcdfax87ebkalczfhlavclfhvaqcwfhqaecufgembkkk;YqdXui998Jjjjjbc:qd9Rgv8Kjjjjbavc:Sefcbc;Kbz:xjjjb8AcbhodnadTmbcbhoaiTmbdndnabaeSmbaehrxekavcuadcdtgwadcFFFFi0Ecbyd;q:kjjbHjjjjbbgrBd:SeavceBd:mdaraeawz:wjjjb8Akavc:GefcwfcbBdbav9cb83i:Geavc:Gefaradaiavc:Sefz:pjjjbavyd:GehDadci9Ugqcbyd;q:kjjbHjjjjbbheavc:Sefavyd:mdgkcdtfaeBdbavakcefgwBd:mdaecbaqz:xjjjbhxavc:SefawcdtfcuaicdtaicFFFFi0Ecbyd;q:kjjbHjjjjbbgmBdbavakcdfgPBd:mdalc;ebfhsaDheamhwinawalIdbasaeydbgzcwazcw6EcdtfIdbMUdbaeclfheawclfhwaicufgimbkavc:SefaPcdtfcuaqcdtadcFFFF970Ecbyd;q:kjjbHjjjjbbgPBdbdnadci6mbarheaPhwaqhiinawamaeydbcdtfIdbamaeclfydbcdtfIdbMamaecwfydbcdtfIdbMUdbaecxfheawclfhwaicufgimbkkakcifhoalc;ebfhHavc;qbfhOavheavyd:KehAavyd:OehCcbhzcbhwcbhXcehQinaehLcihkarawci2gKcdtfgeydbhsaeclfydbhdabaXcx2fgicwfaecwfydbgYBdbaiclfadBdbaiasBdbaxawfce86bbaOaYBdwaOadBdlaOasBdbaPawcdtfcbBdbdnazTmbcihkaLhiinaOakcdtfaiydbgeBdbakaeaY9haeas9haead9hGGfhkaiclfhiazcufgzmbkkaXcefhXcbhzinaCaAarazaKfcdtfydbcdtgifydbcdtfgYheaDaifgdydbgshidnasTmbdninaeydbawSmeaeclfheaicufgiTmdxbkkaeaYascdtfc98fydbBdbadadydbcufBdbkazcefgzci9hmbkdndnakTmbcuhwJbbbbh8Acbhdavyd:KehYavyd:OehKindndnaDaOadcdtfydbcdtgzfydbgembadcefhdxekadcs0hiamazfgsIdbhEasalcbadcefgdaiEcdtfIdbaHaecwaecw6EcdtfIdbMg3Udba3aE:th3aecdthiaKaYazfydbcdtfheinaPaeydbgzcdtfgsa3asIdbMgEUdbaEa8Aa8AaE9DgsEh8AazawasEhwaeclfheaic98fgimbkkadak9hmbkawcu9hmekaQaq9pmdindnaxaQfRbbmbaQhwxdkaqaQcefgQ9hmbxikkakczakcz6EhzaOheaLhOawcu9hmbkkaocdtavc:Seffc98fhedninaoTmeaeydbcbyd;u:kjjbH:bjjjbbaec98fheaocufhoxbkkavc:qdf8Kjjjjbk;IlevucuaicdtgvaicFFFFi0Egocbyd;q:kjjbHjjjjbbhralalyd9GgwcdtfarBdbalawcefBd9GabarBdbaocbyd;q:kjjbHjjjjbbhralalyd9GgocdtfarBdbalaocefBd9GabarBdlcuadcdtadcFFFFi0Ecbyd;q:kjjbHjjjjbbhralalyd9GgocdtfarBdbalaocefBd9GabarBdwabydbcbavz:xjjjb8Aadci9UhDdnadTmbabydbhoaehladhrinaoalydbcdtfgvavydbcefBdbalclfhlarcufgrmbkkdnaiTmbabydbhlabydlhrcbhvaihoinaravBdbarclfhralydbavfhvalclfhlaocufgombkkdnadci6mbabydlhrabydwhvcbhlinaecwfydbhoaeclfydbhdaraeydbcdtfgwawydbgwcefBdbavawcdtfalBdbaradcdtfgdadydbgdcefBdbavadcdtfalBdbaraocdtfgoaoydbgocefBdbavaocdtfalBdbaecxfheaDalcefgl9hmbkkdnaiTmbabydlheabydbhlinaeaeydbalydb9RBdbalclfhlaeclfheaicufgimbkkkQbabaeadaic;K1jjbz:ojjjbkQbabaeadaic;m:jjjbz:ojjjbk9DeeuabcFeaicdtz:xjjjbhlcbhbdnadTmbindnalaeydbcdtfgiydbcu9hmbaiabBdbabcefhbkaeclfheadcufgdmbkkabk:Vvioud9:du8Jjjjjbc;Wa9Rgl8Kjjjjbcbhvalcxfcbc;Kbz:xjjjb8AalcuadcitgoadcFFFFe0Ecbyd;q:kjjbHjjjjbbgrBdxalceBd2araeadaicezNjjjbalcuaoadcjjjjoGEcbyd;q:kjjbHjjjjbbgwBdzadcdthednadTmbabhiinaiavBdbaiclfhiadavcefgv9hmbkkawaefhDalabBdwalawBdl9cbhqindnadTmbaq9cq9:hkarhvaDhiadheinaiav8Pibak1:NcFrG87ebavcwfhvaicdfhiaecufgembkkalclfaq:NceGcdtfydbhxalclfaq9ce98gq:NceGcdtfydbhmalc;Wbfcbcjaz:xjjjb8AaDhvadhidnadTmbinalc;Wbfav8VebcdtfgeaeydbcefBdbavcdfhvaicufgimbkkcbhvcbhiinalc;WbfavfgeydbhoaeaiBdbaoaifhiavclfgvcja9hmbkadhvdndnadTmbinalc;WbfaDamydbgicetf8VebcdtfgeaeydbgecefBdbaxaecdtfaiBdbamclfhmavcufgvmbkaq9cv9smdcbhvinabawydbcdtfavBdbawclfhwadavcefgv9hmbxdkkaq9cv9smekkclhvdninavc98Smealcxfavfydbcbyd;u:kjjbH:bjjjbbavc98fhvxbkkalc;Waf8Kjjjjbk:Jwliuo99iud9:cbhv8Jjjjjbca9Rgoczfcwfcbyd:8:kjjbBdbaocb8Pd:0:kjjb83izaocwfcbyd;i:kjjbBdbaocb8Pd;a:kjjb83ibaicd4hrdndnadmbJFFuFhwJFFuuhDJFFuuhqJFFuFhkJFFuuhxJFFuFhmxekarcdthPaehsincbhiinaoczfaifgzasaifIdbgwazIdbgDaDaw9EEUdbaoaifgzawazIdbgDaDaw9DEUdbaiclfgicx9hmbkasaPfhsavcefgvad9hmbkaoIdKhDaoIdwhwaoIdChqaoIdlhkaoIdzhxaoIdbhmkdnadTmbJbbbbJbFu9hJbbbbamax:tgmamJbbbb9DEgmakaq:tgkakam9DEgkawaD:tgwawak9DEgw:vawJbbbb9BEhwdnalmbarcdthoindndnaeclfIdbaq:tawNJbbbZMgk:lJbbb9p9DTmbak:Ohixekcjjjj94hikai:S9cC:ghHdndnaeIdbax:tawNJbbbZMgk:lJbbb9p9DTmbak:Ohixekcjjjj94hikaHai:S:ehHdndnaecwfIdbaD:tawNJbbbZMgk:lJbbb9p9DTmbak:Ohixekcjjjj94hikabaHai:T9cy:g:e83ibaeaofheabcwfhbadcufgdmbxdkkarcdthoindndnaeIdbax:tawNJbbbZMgk:lJbbb9p9DTmbak:Ohixekcjjjj94hikai:SgH9ca:gaH9cz:g9cjjj;4s:d:eaH9cFe:d:e9cF:bj;4:pj;ar:d9c:bd9:9c:p;G:d;4j:E;ar:d9cH9:9c;d;H:W:y:m:g;d;Hb:d9cv9:9c;j:KM;j:KM;j:Kd:dhOdndnaeclfIdbaq:tawNJbbbZMgk:lJbbb9p9DTmbak:Ohixekcjjjj94hikai:SgH9ca:gaH9cz:g9cjjj;4s:d:eaH9cFe:d:e9cF:bj;4:pj;ar:d9c:bd9:9c:p;G:d;4j:E;ar:d9cH9:9c;d;H:W:y:m:g;d;Hb:d9cq9:9cM;j:KM;j:KM;jl:daO:ehOdndnaecwfIdbaD:tawNJbbbZMgk:lJbbb9p9DTmbak:Ohixekcjjjj94hikabaOai:SgH9ca:gaH9cz:g9cjjj;4s:d:eaH9cFe:d:e9cF:bj;4:pj;ar:d9c:bd9:9c:p;G:d;4j:E;ar:d9cH9:9c;d;H:W:y:m:g;d;Hb:d9cC9:9c:KM;j:KM;j:KMD:d:e83ibaeaofheabcwfhbadcufgdmbkkk9teiucbcbyd;y:kjjbgeabcifc98GfgbBd;y:kjjbdndnabZbcztgd9nmbcuhiabad9RcFFifcz4nbcuSmekaehikaik;teeeudndnaeabVciGTmbabhixekdndnadcz9pmbabhixekabhiinaiaeydbBdbaiaeydlBdlaiaeydwBdwaiaeydxBdxaeczfheaiczfhiadc9Wfgdcs0mbkkadcl6mbinaiaeydbBdbaeclfheaiclfhiadc98fgdci0mbkkdnadTmbinaiaeRbb86bbaicefhiaecefheadcufgdmbkkabk:3eedudndnabciGTmbabhixekaecFeGc:b:c:ew2hldndnadcz9pmbabhixekabhiinaialBdxaialBdwaialBdlaialBdbaiczfhiadc9Wfgdcs0mbkkadcl6mbinaialBdbaiclfhiadc98fgdci0mbkkdnadTmbinaiae86bbaicefhiadcufgdmbkkabk9teiucbcbyd;y:kjjbgeabcrfc94GfgbBd;y:kjjbdndnabZbcztgd9nmbcuhiabad9RcFFifcz4nbcuSmekaehikaik9:eiuZbhedndncbyd;y:kjjbgdaecztgi9nmbcuheadai9RcFFifcz4nbcuSmekadhekcbabae9Rcifc98Gcbyd;y:kjjbfgdBd;y:kjjbdnadZbcztge9nmbadae9RcFFifcz4nb8Akkk;Qddbcjwk;mdbbbbdbbblbbbwbbbbbbbebbbdbbblbbbwbbbbbbbbbbbbbbbb4: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;mqkzebbbebbbdbbb9G:vbb", D = new Uint8Array([
|
|
4
4
|
32,
|
|
@@ -73,6 +73,22 @@ export declare class ViralBatchedMesh extends Mesh {
|
|
|
73
73
|
modelId: string;
|
|
74
74
|
elementId: string;
|
|
75
75
|
}[];
|
|
76
|
+
protected _hidingElements: {
|
|
77
|
+
modelId: string;
|
|
78
|
+
elementId: string;
|
|
79
|
+
}[];
|
|
80
|
+
protected _isolatingElements: {
|
|
81
|
+
modelId: string;
|
|
82
|
+
elementId: string;
|
|
83
|
+
}[];
|
|
84
|
+
private _hiddenSet;
|
|
85
|
+
private _isolatedSet;
|
|
86
|
+
private _elementOpacityMap;
|
|
87
|
+
private _isRGBAMode;
|
|
88
|
+
private _elementOriginalColors;
|
|
89
|
+
/**
|
|
90
|
+
* Select elements (highlights them with accent color)
|
|
91
|
+
*/
|
|
76
92
|
select(elements: {
|
|
77
93
|
modelId: string;
|
|
78
94
|
elementId: string;
|
|
@@ -87,18 +103,26 @@ export declare class ViralBatchedMesh extends Mesh {
|
|
|
87
103
|
b: number;
|
|
88
104
|
};
|
|
89
105
|
}[]): void;
|
|
90
|
-
|
|
106
|
+
get selectedElements(): {
|
|
91
107
|
modelId: string;
|
|
92
108
|
elementId: string;
|
|
93
109
|
}[];
|
|
110
|
+
/**
|
|
111
|
+
* Hide elements by setting their alpha to 0 (GPU-accelerated)
|
|
112
|
+
* Hidden elements are discarded in fragment shader - no rendering cost
|
|
113
|
+
*
|
|
114
|
+
* @param elements - Elements to hide (defaults to selected elements)
|
|
115
|
+
*/
|
|
94
116
|
hide(elements?: {
|
|
95
117
|
modelId: string;
|
|
96
118
|
elementId: string;
|
|
97
119
|
}[]): void;
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
120
|
+
/**
|
|
121
|
+
* Isolate elements - show ONLY these elements, hide everything else
|
|
122
|
+
*
|
|
123
|
+
* @param elements - Elements to isolate (defaults to selected elements)
|
|
124
|
+
* @returns The isolated elements
|
|
125
|
+
*/
|
|
102
126
|
isolate(elements?: {
|
|
103
127
|
modelId: string;
|
|
104
128
|
elementId: string;
|
|
@@ -106,62 +130,107 @@ export declare class ViralBatchedMesh extends Mesh {
|
|
|
106
130
|
modelId: string;
|
|
107
131
|
elementId: string;
|
|
108
132
|
}[];
|
|
109
|
-
get selectedElements(): {
|
|
110
|
-
modelId: string;
|
|
111
|
-
elementId: string;
|
|
112
|
-
}[];
|
|
113
133
|
/**
|
|
114
|
-
* Isolate
|
|
115
|
-
* @param modelIds
|
|
134
|
+
* Isolate entire models
|
|
135
|
+
* @param modelIds - Model IDs to isolate
|
|
116
136
|
*/
|
|
117
137
|
isolateModel(modelIds: string[]): void;
|
|
118
138
|
/**
|
|
119
|
-
*
|
|
139
|
+
* Show a previously hidden element
|
|
140
|
+
* @param elements - Elements to show
|
|
141
|
+
*/
|
|
142
|
+
show(elements: {
|
|
143
|
+
modelId: string;
|
|
144
|
+
elementId: string;
|
|
145
|
+
}[]): void;
|
|
146
|
+
/**
|
|
147
|
+
* Reset all visibility - show everything
|
|
120
148
|
*/
|
|
121
149
|
reset(): void;
|
|
122
|
-
optimizeVertices(): void;
|
|
123
|
-
updateVisibility(bufferElements: BufferElement[]): void;
|
|
124
|
-
private _hiddenSet;
|
|
125
|
-
private _isolatedSet;
|
|
126
|
-
private _originalColorSize;
|
|
127
150
|
/**
|
|
128
|
-
*
|
|
129
|
-
|
|
151
|
+
* Check if an element is currently visible
|
|
152
|
+
*/
|
|
153
|
+
isElementVisible(modelId: string, elementId: string): boolean;
|
|
154
|
+
/**
|
|
155
|
+
* Set opacity for specific elements (0.0 = invisible, 1.0 = fully opaque)
|
|
156
|
+
* Uses custom shader's per-vertex alpha support
|
|
157
|
+
*
|
|
158
|
+
* @param elements - Elements to modify
|
|
159
|
+
* @param opacity - Opacity value (0.0 to 1.0)
|
|
160
|
+
*
|
|
161
|
+
* @example
|
|
162
|
+
* ```typescript
|
|
163
|
+
* // Semi-transparent (ghost mode)
|
|
164
|
+
* mesh.setElementOpacity([{ modelId: "0", elementId: "abc" }], 0.3);
|
|
165
|
+
*
|
|
166
|
+
* // Fully hidden but still raycastable
|
|
167
|
+
* mesh.setElementOpacity([{ modelId: "0", elementId: "abc" }], 0.0);
|
|
168
|
+
* ```
|
|
130
169
|
*/
|
|
131
|
-
|
|
170
|
+
setElementOpacity(elements: {
|
|
132
171
|
modelId: string;
|
|
133
172
|
elementId: string;
|
|
134
|
-
}[]): void;
|
|
173
|
+
}[], opacity: number): void;
|
|
174
|
+
/**
|
|
175
|
+
* Get the current opacity of an element
|
|
176
|
+
*/
|
|
177
|
+
getElementOpacity(modelId: string, elementId: string): number;
|
|
135
178
|
/**
|
|
136
|
-
*
|
|
179
|
+
* Ghost mode - semi-transparent with optional desaturation
|
|
180
|
+
* Perfect for showing context while highlighting other elements
|
|
181
|
+
*
|
|
182
|
+
* @param elements - Elements to ghost
|
|
183
|
+
* @param ghostOpacity - Opacity for ghost mode (default: 0.15)
|
|
184
|
+
* @param desaturate - Whether to desaturate color (default: true)
|
|
137
185
|
*/
|
|
138
|
-
|
|
186
|
+
setElementGhost(elements: {
|
|
139
187
|
modelId: string;
|
|
140
188
|
elementId: string;
|
|
141
|
-
}[]):
|
|
189
|
+
}[], ghostOpacity?: number, desaturate?: boolean): void;
|
|
190
|
+
/**
|
|
191
|
+
* Ghost all elements EXCEPT the specified ones
|
|
192
|
+
* Focused elements remain fully opaque, everything else becomes ghosted
|
|
193
|
+
*
|
|
194
|
+
* @param focusElements - Elements to keep fully visible
|
|
195
|
+
* @param ghostOpacity - Opacity for non-focused elements (default: 0.1)
|
|
196
|
+
*/
|
|
197
|
+
ghostExcept(focusElements: {
|
|
142
198
|
modelId: string;
|
|
143
199
|
elementId: string;
|
|
144
|
-
}[];
|
|
200
|
+
}[], ghostOpacity?: number): void;
|
|
145
201
|
/**
|
|
146
|
-
*
|
|
147
|
-
* Sets alpha to 0.001 (nearly invisible) + alphaTest to skip rendering
|
|
202
|
+
* Reset all element opacities to fully opaque and restore original colors
|
|
148
203
|
*/
|
|
149
|
-
|
|
204
|
+
resetElementOpacity(): void;
|
|
150
205
|
/**
|
|
151
|
-
* Check if
|
|
206
|
+
* Check if any element has semi-transparent opacity
|
|
152
207
|
*/
|
|
153
|
-
|
|
208
|
+
hasTransparentElements(): boolean;
|
|
209
|
+
/**
|
|
210
|
+
* Check if MOST elements are transparent (for deciding depth write strategy)
|
|
211
|
+
* Returns true if more than 50% of elements have transparency
|
|
212
|
+
*/
|
|
213
|
+
private _isMostlyTransparent;
|
|
214
|
+
/**
|
|
215
|
+
* 🔧 Update material depth write based on transparency state
|
|
216
|
+
* When MOST elements are semi-transparent, disable depth write to fix see-through issues
|
|
217
|
+
* Also respects originally transparent materials (windows, glass)
|
|
218
|
+
*/
|
|
219
|
+
private _updateDepthWriteForTransparency;
|
|
154
220
|
/**
|
|
155
|
-
*
|
|
221
|
+
* 🔧 INTERNAL: Update alpha values based on visibility state
|
|
222
|
+
* This is the core method that applies hide/isolate states to the GPU buffer
|
|
156
223
|
*/
|
|
157
|
-
|
|
224
|
+
private _updateAlphaVisibility;
|
|
158
225
|
findElementByFaceIndex(faceIndex: number): {
|
|
159
226
|
modelId: string;
|
|
160
227
|
elementId: string;
|
|
161
228
|
} | null;
|
|
162
229
|
/**
|
|
163
230
|
* Changes the color of multiple elements in the merged mesh.
|
|
164
|
-
*
|
|
231
|
+
* Works with RGBA color buffer (preserves existing alpha values)
|
|
232
|
+
* @param elements - An array of elements, each containing `modelId` and `elementId`.
|
|
233
|
+
* @param color - The new RGB color to apply
|
|
165
234
|
*/
|
|
166
235
|
changeColor(elements: {
|
|
167
236
|
modelId: string;
|
|
@@ -176,9 +245,10 @@ export declare class ViralBatchedMesh extends Mesh {
|
|
|
176
245
|
*/
|
|
177
246
|
/**
|
|
178
247
|
* Resets the color of an element back to the original color or the entire mesh if no element is specified.
|
|
248
|
+
* Works with RGBA color buffer (preserves existing alpha values)
|
|
179
249
|
* @param modelId - The model ID to reset. Pass `null` to reset the entire mesh.
|
|
180
250
|
* @param elementId - The element ID to reset. Ignored if `modelId` is `null`.
|
|
181
|
-
* @param excepts -
|
|
251
|
+
* @param excepts - Elements that should receive a different color instead of original
|
|
182
252
|
*/
|
|
183
253
|
resetColor(modelId: string | null, elementId?: string, excepts?: {
|
|
184
254
|
elements: {
|
|
@@ -14,6 +14,7 @@ export declare class ViralInstancedMeshV2 extends Object3D {
|
|
|
14
14
|
instancedMesh: InstancedMesh;
|
|
15
15
|
}[]>>;
|
|
16
16
|
private _originalTransforms;
|
|
17
|
+
private _elementOpacity;
|
|
17
18
|
private _selectedElements;
|
|
18
19
|
private _hidingElements;
|
|
19
20
|
protected _isolatingElements: {
|
|
@@ -72,11 +73,24 @@ export declare class ViralInstancedMeshV2 extends Object3D {
|
|
|
72
73
|
}[];
|
|
73
74
|
private _hiddenSet;
|
|
74
75
|
private _isolatedSet;
|
|
75
|
-
private
|
|
76
|
+
private static readonly ZERO_MATRIX;
|
|
77
|
+
/**
|
|
78
|
+
* Hide elements by setting their transform scale to 0
|
|
79
|
+
* Zero-scaled instances are automatically culled by GPU - maximum performance
|
|
80
|
+
*
|
|
81
|
+
* @param elements - Elements to hide (defaults to selected elements)
|
|
82
|
+
*/
|
|
76
83
|
hide(elements?: {
|
|
77
84
|
modelId: string;
|
|
78
85
|
elementId: string;
|
|
79
86
|
}[]): void;
|
|
87
|
+
/**
|
|
88
|
+
* Isolate elements - show ONLY these elements, hide everything else
|
|
89
|
+
* Uses batch matrix update for best performance
|
|
90
|
+
*
|
|
91
|
+
* @param elements - Elements to isolate (defaults to selected elements)
|
|
92
|
+
* @returns The isolated elements
|
|
93
|
+
*/
|
|
80
94
|
isolate(elements?: {
|
|
81
95
|
modelId: string;
|
|
82
96
|
elementId: string;
|
|
@@ -85,34 +99,103 @@ export declare class ViralInstancedMeshV2 extends Object3D {
|
|
|
85
99
|
elementId: string;
|
|
86
100
|
}[];
|
|
87
101
|
/**
|
|
88
|
-
*
|
|
89
|
-
*
|
|
102
|
+
* Isolate entire models
|
|
103
|
+
* @param modelIds - Model IDs to isolate
|
|
104
|
+
*/
|
|
105
|
+
isolateModel(modelIds: string[]): void;
|
|
106
|
+
/**
|
|
107
|
+
* Show a previously hidden element
|
|
108
|
+
* @param elements - Elements to show
|
|
90
109
|
*/
|
|
91
|
-
|
|
110
|
+
show(elements: {
|
|
92
111
|
modelId: string;
|
|
93
112
|
elementId: string;
|
|
94
113
|
}[]): void;
|
|
95
114
|
/**
|
|
96
|
-
*
|
|
115
|
+
* Reset all visibility - show everything
|
|
116
|
+
*/
|
|
117
|
+
reset(): void;
|
|
118
|
+
/**
|
|
119
|
+
* Check if an element is currently visible
|
|
97
120
|
*/
|
|
98
|
-
|
|
121
|
+
isElementVisible(modelId: string, elementId: string): boolean;
|
|
122
|
+
/**
|
|
123
|
+
* Inject per-instance opacity shader into material
|
|
124
|
+
* Must be called after material is set and before rendering
|
|
125
|
+
*/
|
|
126
|
+
injectOpacityShader(): void;
|
|
127
|
+
/**
|
|
128
|
+
* Ensure all instanced meshes have opacity attribute
|
|
129
|
+
*/
|
|
130
|
+
private _ensureOpacityAttributes;
|
|
131
|
+
/**
|
|
132
|
+
* Update opacity for specific instances
|
|
133
|
+
*/
|
|
134
|
+
private _updateInstanceOpacity;
|
|
135
|
+
/**
|
|
136
|
+
* Set opacity for specific elements
|
|
137
|
+
* @param elements - Elements to set opacity for
|
|
138
|
+
* @param opacity - Opacity value (0-1)
|
|
139
|
+
*/
|
|
140
|
+
setElementOpacity(elements: {
|
|
99
141
|
modelId: string;
|
|
100
142
|
elementId: string;
|
|
101
|
-
}[]):
|
|
143
|
+
}[], opacity: number): void;
|
|
144
|
+
/**
|
|
145
|
+
* Get current opacity of an element
|
|
146
|
+
* @param modelId - Model ID
|
|
147
|
+
* @param elementId - Element ID
|
|
148
|
+
* @returns Current opacity (0-1), defaults to 1
|
|
149
|
+
*/
|
|
150
|
+
getElementOpacity(modelId: string, elementId: string): number;
|
|
151
|
+
/**
|
|
152
|
+
* Set elements to "ghost" mode (semi-transparent)
|
|
153
|
+
* @param elements - Elements to ghost
|
|
154
|
+
* @param ghostOpacity - Opacity for ghosted elements (default 0.1)
|
|
155
|
+
*/
|
|
156
|
+
setElementGhost(elements: {
|
|
102
157
|
modelId: string;
|
|
103
158
|
elementId: string;
|
|
104
|
-
}[];
|
|
159
|
+
}[], ghostOpacity?: number, desaturate?: boolean): void;
|
|
105
160
|
/**
|
|
106
|
-
*
|
|
161
|
+
* Ghost all elements EXCEPT the specified ones
|
|
162
|
+
* @param elements - Elements to keep fully opaque
|
|
163
|
+
* @param ghostOpacity - Opacity for all other elements (default 0.1)
|
|
107
164
|
*/
|
|
108
|
-
|
|
165
|
+
ghostExcept(elements: {
|
|
166
|
+
modelId: string;
|
|
167
|
+
elementId: string;
|
|
168
|
+
}[], ghostOpacity?: number): void;
|
|
109
169
|
/**
|
|
110
|
-
*
|
|
170
|
+
* Desaturate instance color (turn whitish)
|
|
171
|
+
* @param modelId - Model ID
|
|
172
|
+
* @param elementId - Element ID
|
|
173
|
+
* @param desatFactor - Desaturation factor (0 = original, 1 = full white)
|
|
111
174
|
*/
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
175
|
+
private _desaturateInstanceColor;
|
|
176
|
+
/**
|
|
177
|
+
* Restore instance color to original
|
|
178
|
+
*/
|
|
179
|
+
private _restoreInstanceColor;
|
|
180
|
+
/**
|
|
181
|
+
* Reset all elements to full opacity and restore original colors
|
|
182
|
+
*/
|
|
183
|
+
resetElementOpacity(): void;
|
|
184
|
+
/**
|
|
185
|
+
* Check if any element has semi-transparent opacity
|
|
186
|
+
*/
|
|
187
|
+
hasTransparentElements(): boolean;
|
|
188
|
+
/**
|
|
189
|
+
* Check if MOST elements are transparent (for deciding depth write strategy)
|
|
190
|
+
* Returns true if more than 50% of elements have transparency
|
|
191
|
+
*/
|
|
192
|
+
private _isMostlyTransparent;
|
|
193
|
+
/**
|
|
194
|
+
* 🔧 Update material depth write based on transparency state
|
|
195
|
+
* When MOST elements are semi-transparent, disable depth write
|
|
196
|
+
* Also respects originally transparent materials (windows, glass)
|
|
197
|
+
*/
|
|
198
|
+
private _updateDepthWriteForTransparency;
|
|
116
199
|
enableEdgePerElement(material: LineMaterial, thresholdDeg?: number): void;
|
|
117
200
|
disableEdge(): void;
|
|
118
201
|
enableEdge(): void;
|
|
@@ -109,6 +109,37 @@ export declare class ViralMergedModel extends Mesh {
|
|
|
109
109
|
*/
|
|
110
110
|
resetVisibility(): void;
|
|
111
111
|
resetColor(): void;
|
|
112
|
+
/**
|
|
113
|
+
* Set opacity for specific elements
|
|
114
|
+
* @param elements - Elements to set opacity for
|
|
115
|
+
* @param opacity - Opacity value (0-1)
|
|
116
|
+
*/
|
|
117
|
+
setElementOpacity(elements: {
|
|
118
|
+
modelId: string;
|
|
119
|
+
elementId: string;
|
|
120
|
+
}[], opacity: number): void;
|
|
121
|
+
/**
|
|
122
|
+
* Set elements to "ghost" mode (semi-transparent)
|
|
123
|
+
* @param elements - Elements to ghost
|
|
124
|
+
* @param ghostOpacity - Opacity for ghosted elements (default 0.1)
|
|
125
|
+
*/
|
|
126
|
+
setElementGhost(elements: {
|
|
127
|
+
modelId: string;
|
|
128
|
+
elementId: string;
|
|
129
|
+
}[], ghostOpacity?: number): void;
|
|
130
|
+
/**
|
|
131
|
+
* Ghost all elements EXCEPT the specified ones
|
|
132
|
+
* @param elements - Elements to keep fully opaque
|
|
133
|
+
* @param ghostOpacity - Opacity for all other elements (default 0.1)
|
|
134
|
+
*/
|
|
135
|
+
ghostExcept(elements: {
|
|
136
|
+
modelId: string;
|
|
137
|
+
elementId: string;
|
|
138
|
+
}[], ghostOpacity?: number): void;
|
|
139
|
+
/**
|
|
140
|
+
* Reset all elements to full opacity
|
|
141
|
+
*/
|
|
142
|
+
resetElementOpacity(): void;
|
|
112
143
|
enableEdge(material: LineMaterial, thresholdDeg?: number): void;
|
|
113
144
|
showEdge(): void;
|
|
114
145
|
hideEdge(): void;
|
|
@@ -139,6 +170,10 @@ export declare class ViralMergedModel extends Mesh {
|
|
|
139
170
|
* Notify edge mesh when meshes are updated (call this after batching or rebuilding)
|
|
140
171
|
*/
|
|
141
172
|
onMeshUpdated(mesh?: ViralBatchedMesh | ViralInstancedMeshV2): void;
|
|
173
|
+
/**
|
|
174
|
+
* @deprecated No longer needed - visibility is now alpha-based (GPU-accelerated)
|
|
175
|
+
* Kept for backward compatibility but does nothing
|
|
176
|
+
*/
|
|
142
177
|
optimizeVertices(): void;
|
|
143
178
|
/**
|
|
144
179
|
* *everytime add new model in scene this model will be regenerated again, for that reason we should dispose this model
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Camera, Scene, WebGLRenderer } from "three";
|
|
1
|
+
import { Camera, Color, Scene, WebGLRenderer } from "three";
|
|
2
2
|
import { EffectComposer } from "three/examples/jsm/postprocessing/EffectComposer";
|
|
3
3
|
import { SMAAPass } from "three/examples/jsm/postprocessing/SMAAPass";
|
|
4
4
|
import { ShaderPass } from "three/examples/jsm/postprocessing/ShaderPass";
|
|
@@ -6,6 +6,7 @@ import { SAOPass, SSAARenderPass, SSAOPass, TAARenderPass } from "three/examples
|
|
|
6
6
|
import { ViralViewerApi } from "../..";
|
|
7
7
|
import { OutlinePass } from "three/examples/jsm/postprocessing/OutlinePass";
|
|
8
8
|
import { DevicePerformanceChecker } from "../../utils/device";
|
|
9
|
+
import { ScreenSpaceEdgesPass, ScreenSpaceEdgesOptions } from "./screen-space-edges-pass";
|
|
9
10
|
export declare class PostProcessingRenderer {
|
|
10
11
|
private renderer;
|
|
11
12
|
viralViewerApi: ViralViewerApi;
|
|
@@ -22,6 +23,7 @@ export declare class PostProcessingRenderer {
|
|
|
22
23
|
whitePass: ShaderPass | null;
|
|
23
24
|
shadowRemovalPass: ShaderPass | null;
|
|
24
25
|
outlinePass: OutlinePass | null;
|
|
26
|
+
screenSpaceEdgesPass: ScreenSpaceEdgesPass | null;
|
|
25
27
|
n8aoPass: any;
|
|
26
28
|
perfChecker: DevicePerformanceChecker;
|
|
27
29
|
constructor(renderer: WebGLRenderer, viralViewerApi: ViralViewerApi);
|
|
@@ -46,6 +48,55 @@ export declare class PostProcessingRenderer {
|
|
|
46
48
|
disableSSAO(): void;
|
|
47
49
|
enableSobel(): void;
|
|
48
50
|
disableSobel(): void;
|
|
51
|
+
/**
|
|
52
|
+
* Initialize screen-space edge detection pass
|
|
53
|
+
* This detects edges on-the-fly without generating geometry, using:
|
|
54
|
+
* - Depth discontinuity detection (silhouettes)
|
|
55
|
+
* - Normal discontinuity detection (creases/corners)
|
|
56
|
+
* - Object ID discontinuity detection (object boundaries)
|
|
57
|
+
*/
|
|
58
|
+
initScreenSpaceEdgesPass(scene: Scene, camera: Camera): void;
|
|
59
|
+
/**
|
|
60
|
+
* Enable screen-space edge detection
|
|
61
|
+
* Much more efficient than geometry-based edges for large models
|
|
62
|
+
*/
|
|
63
|
+
enableScreenSpaceEdges(): void;
|
|
64
|
+
/**
|
|
65
|
+
* Disable screen-space edge detection
|
|
66
|
+
*/
|
|
67
|
+
disableScreenSpaceEdges(): void;
|
|
68
|
+
/**
|
|
69
|
+
* Configure screen-space edge detection options
|
|
70
|
+
*/
|
|
71
|
+
setScreenSpaceEdgesOptions(options: Partial<ScreenSpaceEdgesOptions>): void;
|
|
72
|
+
/**
|
|
73
|
+
* Set screen-space edge color
|
|
74
|
+
*/
|
|
75
|
+
setScreenSpaceEdgeColor(color: Color | number): void;
|
|
76
|
+
/**
|
|
77
|
+
* Set screen-space edge opacity (0-1)
|
|
78
|
+
*/
|
|
79
|
+
setScreenSpaceEdgeOpacity(opacity: number): void;
|
|
80
|
+
/**
|
|
81
|
+
* Set screen-space edge thickness in pixels
|
|
82
|
+
*/
|
|
83
|
+
setScreenSpaceEdgeThickness(thickness: number): void;
|
|
84
|
+
/**
|
|
85
|
+
* Configure which edge detection methods are enabled
|
|
86
|
+
*/
|
|
87
|
+
setScreenSpaceEdgeMethods(options: {
|
|
88
|
+
depth?: boolean;
|
|
89
|
+
normal?: boolean;
|
|
90
|
+
objectId?: boolean;
|
|
91
|
+
}): void;
|
|
92
|
+
/**
|
|
93
|
+
* Set "Pen Mode" - technical drawing style with full opacity black lines
|
|
94
|
+
*/
|
|
95
|
+
setScreenSpaceEdgesPenMode(): void;
|
|
96
|
+
/**
|
|
97
|
+
* Set "Shaded Mode" - subtle edges for 3D visualization
|
|
98
|
+
*/
|
|
99
|
+
setScreenSpaceEdgesShadedMode(): void;
|
|
49
100
|
private _whiteShader;
|
|
50
101
|
initWhitePass(): void;
|
|
51
102
|
initOutlinePass(scene: Scene, camera: Camera): void;
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { Camera, Color, Scene, Vector2, WebGLRenderer, WebGLRenderTarget } from "three";
|
|
2
|
+
import { Pass } from "three/examples/jsm/postprocessing/Pass";
|
|
3
|
+
/**
|
|
4
|
+
* Screen-Space Edge Detection Pass
|
|
5
|
+
*
|
|
6
|
+
* Implements Speckle-style edge detection using THREE methods:
|
|
7
|
+
* 1. Depth discontinuity detection (silhouettes)
|
|
8
|
+
* 2. Normal discontinuity detection (creases/corners)
|
|
9
|
+
* 3. Object ID discontinuity detection (object boundaries)
|
|
10
|
+
*
|
|
11
|
+
* This approach detects edges on-the-fly without generating edge geometry,
|
|
12
|
+
* resulting in constant GPU cost regardless of model complexity.
|
|
13
|
+
*/
|
|
14
|
+
export interface ScreenSpaceEdgesOptions {
|
|
15
|
+
/** Edge line color (default: black) */
|
|
16
|
+
edgeColor: Color;
|
|
17
|
+
/** Edge opacity 0-1 (default: 0.8) */
|
|
18
|
+
edgeOpacity: number;
|
|
19
|
+
/** Edge thickness in pixels (default: 1.0) */
|
|
20
|
+
edgeThickness: number;
|
|
21
|
+
/** Depth edge sensitivity (default: 1.0) */
|
|
22
|
+
depthMultiplier: number;
|
|
23
|
+
/** Normal edge sensitivity (default: 1.0) */
|
|
24
|
+
normalMultiplier: number;
|
|
25
|
+
/** Normal edge bias - lower = more sensitive (default: 0.1) */
|
|
26
|
+
normalBias: number;
|
|
27
|
+
/** Enable depth-based edge detection (default: true) */
|
|
28
|
+
enableDepthEdges: boolean;
|
|
29
|
+
/** Enable normal-based edge detection (default: true) */
|
|
30
|
+
enableNormalEdges: boolean;
|
|
31
|
+
/** Enable object ID-based edge detection (default: true) */
|
|
32
|
+
enableObjectIdEdges: boolean;
|
|
33
|
+
}
|
|
34
|
+
export declare class ScreenSpaceEdgesPass extends Pass {
|
|
35
|
+
private scene;
|
|
36
|
+
private camera;
|
|
37
|
+
private resolution;
|
|
38
|
+
private normalTarget;
|
|
39
|
+
private depthTarget;
|
|
40
|
+
private objectIdTarget;
|
|
41
|
+
private normalMaterial;
|
|
42
|
+
private depthMaterial;
|
|
43
|
+
private edgeMaterial;
|
|
44
|
+
private objectIdMaterial;
|
|
45
|
+
private fsQuad;
|
|
46
|
+
options: ScreenSpaceEdgesOptions;
|
|
47
|
+
constructor(scene: Scene, camera: Camera, resolution?: Vector2, options?: Partial<ScreenSpaceEdgesOptions>);
|
|
48
|
+
/**
|
|
49
|
+
* Update options
|
|
50
|
+
*/
|
|
51
|
+
setOptions(options: Partial<ScreenSpaceEdgesOptions>): void;
|
|
52
|
+
/**
|
|
53
|
+
* Update shader uniforms from options
|
|
54
|
+
*/
|
|
55
|
+
private updateUniforms;
|
|
56
|
+
/**
|
|
57
|
+
* Resize render targets
|
|
58
|
+
*/
|
|
59
|
+
setSize(width: number, height: number): void;
|
|
60
|
+
/**
|
|
61
|
+
* Main render method
|
|
62
|
+
*/
|
|
63
|
+
render(renderer: WebGLRenderer, writeBuffer: WebGLRenderTarget, readBuffer: WebGLRenderTarget, deltaTime?: number, maskActive?: boolean): void;
|
|
64
|
+
/**
|
|
65
|
+
* Dispose resources
|
|
66
|
+
*/
|
|
67
|
+
dispose(): void;
|
|
68
|
+
}
|